发行说明¶
cuTensorNet v2.6.0¶
新功能
新 API
cutensornetStateCaptureMPS()
允许用户将张量网络状态重置为先前通过cutensornetStateCompute()
计算的 MPS 状态。新 API
cutensornetStateApplyUnitaryChannel()
允许用户将酉信道应用于张量网络状态。后续计算可以使用基于收缩的方法或 MPS 方法执行,与往常一样。
缺陷修复
修复了大型网络中工作区大小超过 int32 限制的错误。在之前的版本中,当发生这种情况时,代码会返回错误“找不到路径”。此修复将允许寻路器继续尝试使用切片查找路径。
修复了寻路器 ThreadPool 中潜在的死锁。
其他更改
改进了使用
cutensornetState_t
对象进行 MPS 模拟的精度,当使用cutensornetStateInitializeMPS()
API 设置初始 MPS 时。放弃了对
Linux ppc64le
的支持。
cuTensorNet v2.5.0¶
新功能
新属性
CUTENSORNET_SAMPLER_CONFIG_DETERMINISTIC
,当设置为正值时,使cutensornetStateSampler_t
在每次运行时产生相同的结果。
缺陷修复
修复了大型网络规划中导致段错误 (segfault) 的错误。
修复了梯度计算可能因工作区不足而失败的错误。
修复了收缩结果可能不正确的极端情况错误。
修复了计算类型为
CUTENSORNET_COMPUTE_3XTF32
的失败收缩。修复了某些量子电路可能出现的错误 GPU 工作区短缺故障。
修复了使用与库句柄关联的 GPU 设备不同的活动 GPU 设备调用非计算 API 的能力。
修复了张量算符数据更新操作期间对张量算符可变性的检查。
修复了遇到的非法内存访问的极端情况错误。
修复了 MPS 模拟中的
cutensornetState_t
对象在cutensornetStateCompute()
在cutensornetStatePrepare()
步骤后被多次调用时会抛出错误的错误,即使没有结构性更改。用户现在可以在同一个cutensornetState_t
对象上多次调用cutensornetStateCompute()
,而只需一个先前的cutensornetStatePrepare()
步骤,而不会遇到错误。
性能增强
提高了当用户在主机内存上分配工作区缓冲区时,收缩和梯度计算的性能(分别为
cutensornetContractSlices()
和cutensornetComputeGradientsBackward()
)。
其他更改
降低了几个 cuTensorNet 函数的 CPU 开销。
在 State API 中启用了对使用实数数据类型(CUDA_R_32F 和 CUDA_R_64F)的张量算符的支持。
兼容性说明:
cuTensorNet 需要 cuTENSOR v2.0.2 或更高版本。
cuTensorNet v2.4.0¶
新功能
新的高级 API
cutensornetNetworkOperatorAppendMPO()
用于在张量网络算符对象内定义矩阵乘积算符 (MPO),然后可以通过新的 APIcutensornetStateApplyNetworkOperator()
将其应用于量子电路状态。用户还可以使用围绕cutensornetStateExpectation_t
的现有 API 来计算给定量子电路状态的 MPO 的期望值。新的高级 API
CUTENSORNET_STATE_CONFIG_MPS_MPO_APPLICATION
和cutensornetStateMPOApplication_t
用于更多选项,以控制将 MPO 应用于 MPS 量子态。新的高级 API
cutensornetStateInitializeMPS()
用于将初始量子电路状态指定为 MPS,该 MPS 将经历后续的张量算符应用。新的高级 API
cutensornetStateApplyControlledTensorOperator()
用于应用受控和多重受控的单目标张量门。新的高级 API
cutensornetStateGetInfo()
、cutensornetAccessorGetInfo()
、cutensornetExpectationGetInfo()
、cutensornetMarginalGetInfo()
和cutensornetSamplerGetInfo()
,允许用户查询相应对象的信息。目前,这些 API 可以与相应的新枚举值CUTENSORNET_STATE_INFO_FLOPS
、CUTENSORNET_ACCESSOR_INFO_FLOPS
、CUTENSORNET_EXPECTATION_INFO_FLOPS
、CUTENSORNET_MARGINAL_INFO_FLOPS
和CUTENSORNET_SAMPLER_INFO_FLOPS
结合使用,以获取计算的浮点运算次数 (flops)。引入了新的计算类型 (
CUTENSORNET_COMPUTE_3XTF32
),它比 (CUTENSORNET_COMPUTE_TF32
) 提供更好的精度。
缺陷修复
修复了当涉及的输入张量共轭时梯度计算失败的问题。
修复了一个错误,该错误导致如果在
cutensornetStateConfigure()
之后调用cutensornetStateFinalizeMPS()
,则在 MPS 状态准备/计算期间CUTENSORNET_STATE_MPS_SVD_CONFIG_DISCARDED_WEIGHT_CUTOFF
被忽略。
其他更改
新的 API
cutensornetStateApplyTensorOperator()
取代了cutensornetStateApplyTensor()
API,后者已被弃用,将在未来的版本中移除。新的 API
cutensornetStateUpdateTensorOperator()
取代了cutensornetStateUpdateTensor()
API,后者已被弃用,将在未来的版本中移除。引入了几个枚举值,同时弃用了旧的枚举值,以提高一致性
旧
新
旧的枚举值仍然存在并且功能正常,但它们被认为是已弃用,并可能在未来的版本中移除。
兼容性说明:
cuTensorNet 需要 cuTENSOR v2.0.1 或更高版本。
cuQuantum 将在后续的 cuQuantum 版本中停止支持 RHEL 7。请提前为此做好计划。谢谢。
已知问题:
对于基于
cutensornetStateFinalizeMPS()
API 的 MPS 计算,如果状态在不同模式下具有不同的范围,并且有算符应用于两个不相邻的模式,则可能无法计算出精确的 MPS 分解。
cuTensorNet v2.3.0¶
新功能
用于定义张量网络算符并计算其在给定张量网络状态上的期望值的新高级 API。
请参阅 高级张量网络规范和处理 中的介绍。
用于计算给定张量网络状态的任意幅度切片的新高级 API。
用于计算给定张量网络状态的矩阵乘积态 (MPS) 分解的新高级 API。
新的截断选项
CUTENSORNET_TENSOR_SVD_CONFIG_DISCARDED_WEIGHT_CUTOFF
用于张量 SVD 计算。
缺陷修复
修复了当使用 TIME 作为成本函数调用自动分布式收缩路径优化时的一个错误,以确保选择最优路径。
修复了当调用
cutensornetWorkspaceComputeSVDSizes()
,cutensornetWorkspaceComputeQRSizes()
和cutensornetWorkspaceComputeGateSplitSizes()
时,可能导致库句柄管理不一致的错误。修复了当输入张量的组合矩阵行/列范围等于 1 时,
cutensornetTensorQR()
的一个错误。修复了当张量网络收缩路径查找器在同一节点上被多个进程运行时,存在的性能错误。
其他更改
使用实验性 API
cutensornetComputeGradientsBackward()
计算的复值梯度现在是复共轭的,与之前版本返回的结果相比。
兼容性说明:
cuTensorNet 需要 cuTENSOR v1.6.1 或更高版本,但不兼容 v2.x.y。推荐使用 cuTENSOR v1.7.0,以获得性能改进、错误修复和 CUDA 延迟加载 支持。
cuTensorNet v2.2.1¶
缺陷修复
修复了导致一元(单操作数)收缩出现 “不支持” 错误的回归问题。
cuTensorNet v2.2.0¶
新功能
新的实验性 API
cutensornetComputeGradientsBackward()
,用于计算张量网络关于其输入张量的梯度。已知限制:在具有单个切片且没有单例模式的张量网络上运行,在单个 GPU 设备上运行。
用于简化张量网络状态定义、计算任意边缘分布以及执行这些状态采样的新的高级 API (提供对任意张量状态的支持,例如,基于 qudit 的张量状态)。
请参阅 高级张量网络规范和处理 中的介绍。
新的 API
cutensornetWorkspacePurgeCache()
用于清除工作区缓存。用于设置/获取网络属性的新 API。
新的 API 支持更多 SVD 算法,包括 GESVD (默认)、GESVDJ、GESVDP 和 GESVDR。SVD 算法可以通过调用
cutensornetTensorSVDConfigSetAttribute()
并使用属性CUTENSORNET_TENSOR_SVD_CONFIG_ALGO
来设置。对于 GESVDJ 和 GESVDR,用户可以使用属性CUTENSORNET_TENSOR_SVD_CONFIG_ALGO_PARAMS
和新的结构体cutensornetGesvdjParams_t
和cutensornetGesvdrParams_t
分别进一步设置算法特定的参数。新的 API 在
cutensornetTensorSVDInfo_t
中为 SVD 执行提供更多运行时信息。使用的 SVD 算法可以通过调用cutensornetTensorSVDInfoGetAttribute()
并使用属性CUTENSORNET_TENSOR_SVD_INFO_ALGO
来访问。对于 GESVDJ 和 GESVDP,用户可以使用属性CUTENSORNET_TENSOR_SVD_INFO_ALGO_STATUS
和新的结构体cutensornetGesvdjStatus_t
和cutensornetGesvdpStatus_t
分别进一步查询执行状态。新的 API,通过
CUTENSORNET_CONTRACTION_OPTIMIZER_CONFIG_CACHE_REUSE_NRUNS
属性,使优化器能够在路径多次运行时考虑恒定输入张量的优势。新的 API 使用属性
CUTENSORNET_CONTRACTION_OPTIMIZER_CONFIG_SMART_OPTION
来切换 “智能” 优化设置。此选项(默认开启)将通过避免某些配置以及动态调整配置来限制路径查找器运行时间。路径质量可能与关闭该选项时有所不同。要恢复之前的行为,用户应将其设置为关闭。
性能增强
改进了收缩路径优化过程(例如,路径查找)的性能。加速取决于张量网络的大小。对于大型网络,可以观察到大于 10 倍的加速。对于中型网络(数百个张量),观察到接近 5 倍的加速。
缺陷修复
在某些极端情况下,当没有足够的缓存内存可用时,涉及恒定输入张量的张量网络收缩失败。
兼容性说明:
cuTensorNet 支持 Ubuntu 20.04+。
已知问题:
SVD 算法
CUTENSORNET_TENSOR_SVD_ALGO_GESVDJ
的精度可能低于默认的CUTENSORNET_TENSOR_SVD_ALGO_GESVD
。当 SVD 算法设置为
CUTENSORNET_TENSOR_SVD_ALGO_GESVDR
或CUTENSORNET_TENSOR_SVD_ALGO_GESVDP
时,cutensornetTensorSVD()
和cutensornetGateSplit()
的执行可能会因为某些输入张量操作数而失败。在单精度下,当输入张量/矩阵的秩较低时,基于
CUTENSORNET_TENSOR_SVD_ALGO_GESVDR
的张量 SVD 可能会降低精度。当 SVD 算法设置为
CUTENSORNET_TENSOR_SVD_ALGO_GESVDP
时,用户有责任检查 SVDInfo 对象中属性CUTENSORNET_TENSOR_SVD_CONFIG_ALGO_PARAMS
和相应的结构体cutensornetGesvdpStatus_t
,以监控收敛性。
cuTensorNet v2.1.0¶
新功能
支持缓存中间张量,以便在重复的张量网络收缩中后续重用。当用户希望执行多次张量网络收缩时,这是一个有用的功能,其中大部分输入张量保持不变,而其余张量更新其值。例如,计算单个比特串或小批量比特串的幅度可以从此功能中受益。我们为用户提供了指定哪些张量是常量的机会。随后,cuTensorNet 将使用此信息来构建内部数据结构,以缓存恒定的中间张量,以便在重复执行张量网络收缩计划时重用它们。请注意,如果所有输入张量都被标记为常量,则输出张量也变为常量,因此再次收缩网络没有好处,因此不会触发缓存机制。在这种情况下,重复收缩将产生相同的执行时间。
缺陷修复
当用户提供自定义内存池来计算具有某些范围组合的双精度复数数据的 QR 分解时,
cutensornetTensorQR()
失败。在某些极端情况下,自动调优失败,并出现 “工作区不足” 错误。
当所有奇异值都被修剪掉时,
cutensornetTensorSVD()
执行失败。对于 cuTensorNet v2.1.0,在这种情况下,将在输出中保留一个奇异值。此行为可能会在未来的版本中更改。
其他更改
cuTensorNet-MPI 包装库 (
libcutensornet_distributed_interface_mpi.so
) 需要链接到 MPI 库libmpi.so
。如果您使用我们的 conda-forge 包或 cuQuantum Appliance 容器,或者使用提供的activate_mpi.sh
脚本编译您自己的版本,则已为您处理好这一点。引入对 CUDA 12 的支持。
一组带有后缀
-cu12
的新 wheels 在 PyPI.org 上发布,供 CUDA 12 用户使用。示例:
pip install cutensornet-cu12
用于安装与 CUDA 12 兼容的 cuTensorNet。现有的
cuquantum
wheel(不带-cuXX
后缀)已转换为自动安装程序,它将尝试检测当前的 CUDA 环境并安装相应的 wheels。请注意,此自动检测可能会遇到检测不成功的情况,尤其是在纯 CPU 环境(例如 CI/CD)中。如果检测失败,我们假设目标环境是 CUDA 11 并继续。此假设可能会在未来的版本中更改,在这种情况下,我们建议用户显式(手动)安装正确的 wheels。
性能增强
CUDA 延迟加载 受到支持。这可以通过将所需 GPU 内核的加载延迟到第一个调用站点来显著减少内存占用。此功能需要 CUDA 11.8(或更高版本)和 cuTENSOR 1.7.0(或更高版本)。有关其他要求和详细信息,请参阅 CUDA 文档。目前,此功能需要用户通过设置环境变量
CUDA_MODULE_LOADING=LAZY
来选择启用。在未来的 CUDA 版本中,延迟加载可能会成为默认设置。
兼容性说明:
cuTensorNet 需要 cuTENSOR 1.6.1 或更高版本,但推荐使用 cuTENSOR 1.7.0 或更高版本,以获得性能改进、错误修复和 CUDA 延迟加载 支持。
cuTensorNet 支持 Ubuntu 18.04+
在下一个版本中,将删除对 Ubuntu 18.04 的支持。最低支持的 Ubuntu 版本将为 20.04。
cuTensorNet v2.0.0¶
我们在 NVIDIA/cuQuantum GitHub Discussions 上!对于任何关于 cuQuantum 的问题(或基于 cuQuantum 构建的令人兴奋的工作),请随时在 GitHub Discussions 上与我们联系。
错误报告仍然应发送到 我们的 GitHub issue tracker。
主要版本发布
conda 包已在 conda-forge 上发布:
conda install -c conda-forge cutensornet
。用户仍然可以使用conda install -c conda-forge cuquantum
获取 cuTensorNet 和 cuStateVec,与之前一样。pip wheel 已在 PyPI 上发布:
pip install cutensornet-cu11
。用户仍然可以使用pip install cuquantum
获取 cuTensorNet 和 cuStateVec,与之前一样。目前,
cuquantum
元 wheel 指向cuquantum-cu11
元 wheel(然后指向cutensornet-cu11
和custatevec-cu11
wheels)。当新的 CUDA 版本可用时,这可能会在未来的版本中更改。建议使用带有-cuXX
后缀的 wheels。
新功能
Hopper 用户的初始支持。这需要 CUDA 11.8。
用于创建、查询和销毁张量描述符对象的新 API。
用于近似张量网络算法的新 API 和功能。cuTensorNet 现在支持以下计算原语,使用户能够开发用于量子电路的近似张量网络模拟器,包括 MPS、PEPS 等
通过 QR 或 SVD 进行张量分解。支持精确和截断的 SVD。
将门应用于一对连接的张量,然后进行压缩。
用于创建、调整、查询和销毁张量 SVD 截断设置的新 API。
用于创建、查询和销毁运行时张量 SVD 截断信息的新 API。
自动分布式执行:cuTensorNet API 已扩展,包含使张量网络收缩在多个 GPU 之间自动分布式并行化的功能。激活后,并行化将应用于张量网络收缩路径查找(当启用超采样时)和收缩执行,而无需对原始串行源代码进行任何更改。
引入了破坏先前 API 的功能
输入张量上的复共轭运算符(这在
cutensornetCreateNetworkDescriptor()
API 中添加了一个指定张量限定符的额外参数)。提供新的 API,用户可以通过一次调用
cutensornetContractionOptimizerInfoSetAttribute()
并使用属性CUTENSORNET_CONTRACTION_OPTIMIZER_INFO_SLICING_CONFIG
来指定切片为(切片模式,切片范围)。这将消除旧 API 的限制,旧 API 要求用户先设置模式,然后再设置范围。从
cutensornetCreateNetworkDescriptor()
API 中删除了 [in,out] 对齐要求参数。这些参数不再需要,并在内部推断。一些枚举值被重新排序。如果您的应用程序将任何 cuTensorNet 枚举值存储为纯 int,请确保重新构建您的应用程序。
缺陷修复
在少数极端情况下,在 cuda-memcheck 中运行时出现内存访问错误。
设置某些属性时出现与日志记录相关的错误。
cuTensorNet 使用用户提供的路径和切片计算的 flops 不准确。
在 NVIDIA HPC SDK 容器中使用 cuTensorNet 时出现 “未定义的符号” 错误。
在已弃用的
cutensornetGetOutputTensorDetails()
API 中,对 extent-1 模式的处理不正确。
性能增强
改进了收缩路径优化过程的性能。在许多问题上,平均观察到约 3 倍的加速。
改进了收缩自动调优过程的性能。
提高了切片算法的质量。我们现在选择具有最小切片数量且具有最小 flops 开销的配置。
添加了更多自动调优启发式方法,可提高张量收缩性能。
其他更改
不再需要 GNU OpenMP Runtime (gomp)。
新的 API
cutensornetWorkspaceComputeContractionSizes()
取代了cutensornetWorkspaceComputeSizes()
API,后者已弃用,将在未来的版本中删除。两个新的 API,
cutensornetGetOutputTensorDescriptor()
和cutensornetGetTensorDetails()
,取代了cutensornetGetOutputTensorDetails()
API,后者已弃用,将在未来的版本中删除。新的示例 (samples/cutensornet/)。
兼容性说明:
cuTensorNet 需要 cuTENSOR 1.6.1 或更高版本,但推荐使用 cuTENSOR 1.6.2 或更高版本,以获得性能改进和错误修复。
cuTensorNet 需要 CUDA 11.x,但推荐使用 CUDA 11.8,以获得 Hopper 支持、性能改进和错误修复。
已知问题:
对于 CUDA 11.7 或更低版本,
cutensornetTensorQR()
可能会因为某些范围而失败。当用户提供自定义内存池来计算具有某些范围组合的双精度复数数据的 QR 分解时,
cutensornetTensorQR()
可能会失败。对于 cuTENSOR 1.6.1 和 Turing,在某些情况下,广播 extent-1 的张量模式可能会失败。
cuTensorNet v1.1.1¶
缺陷修复
文档其他地方承诺的版本约束
cuTENSOR>=1.5,<2
未得到正确遵守。代码和各种软件包来源现在都已修复。
cuTensorNet v1.1.0¶
引入了新的 API 和功能
新的 API
cutensornetContractionOptimizerInfoPackData()
,允许用户序列化/打包 optimizerInfo 以便将其广播到其他 rank。类似地,提供了另一个用于解包的新 API,cutensornetUpdateContractionOptimizerInfoFromPackedData()
。用于创建和销毁切片组对象的新 API,其中包括
cutensornetCreateSliceGroupFromIDRange()
,cutensornetCreateSliceGroupFromIDs()
和cutensornetDestroySliceGroup()
。这些 API 与上面的打包/解包 API 结合使用时,允许用户使用切片技术来创建可在多个 GPU 上运行的独立任务。新的 API
cutensornetContractSlices()
用于执行收缩。这将取代cutensornetContraction()
API,后者已弃用,将在未来的版本中删除。通过
cutensornetContractionAutotune()
API 自动调优中间模式的选项,这有助于提高网络收缩性能。此 API 调用的功能可以通过CUTENSORNET_CONTRACTION_AUTOTUNE_INTERMEDIATE_MODES
属性来控制。查找最小化估计的解决方案时间(而不是 FLOP 计数)的路径的选项。此实验性功能可以通过配置属性
CUTENSORNET_CONTRACTION_OPTIMIZER_CONFIG_COST_FUNCTION_OBJECTIVE
来控制。通过收缩优化器信息的
CUTENSORNET_CONTRACTION_OPTIMIZER_INFO_INTERMEDIATE_MODES
属性检索所有中间张量的模式标签的选项。
功能/性能改进
由于对于小型网络,无需简化即可轻松找到接近最优的路径,并且由于简化不能保证最优路径,因此当简化网络足够小时,默认情况下已关闭简化阶段。
开发了一种新的切片算法,可能导致更高效的切片解决方案。
通过优化中间模式排序来提高收缩性能。
提高具有许多单例模式标签的网络的收缩性能。
缺陷修复
以前,在极少数情况下,切片算法可能无法在寻找有效解决方案方面取得进展,从而导致无限循环。这已得到修复。
已弃用的
cutensornetContraction()
API 中接受 sliceId >= numSlices 的错误。
其他更改
提供了一个分布式(基于 MPI)C 示例,展示了使用 cuTensorNet 和创建并行性是多么容易。
通过改进内存使用和采用新的收缩 API
cutensornetContractSlices()
来更新(非分布式)C 示例。
cuTensorNet v1.0.1¶
缺陷修复
工作区指针对齐问题。
一个潜在的路径优化器问题,以避免返回
CUTENSORNET_STATUS_NOT_SUPPORTED
。
性能增强
此版本改进了对广义 einsum 表达式的支持,以提供更好的收缩路径。
其他更改
在文档和示例中澄清,跨切片的收缩需要按升序完成,并且当跨切片并行化时,输出张量应进行零初始化。
在文档中澄清,返回的 FLOP 计数假设实值输入。
修复了 C++ 示例 (samples/cutensornet/tensornet_example.cu) 中的几个问题。
cuTensorNet v1.0.0¶
功能/性能改进
大大减少了所需的工作区内存大小。
通过多线程和内部优化,减少了路径查找器的执行时间。
支持张量网络中的超边。
支持由广义爱因斯坦求和表达式描述的张量网络。
为以下方面添加了新的 API 和功能
管理工作区(有关详细信息,请参阅 工作区管理 API)。
将用户提供的、流排序的内存池绑定到库(有关详细信息,请参阅 内存管理 API)。
查询输出张量详细信息(请参阅
cutensornetGetOutputTensorDetails()
)。设置超优化器的线程数(有关详细信息,请参阅 超优化器)。
使用用户提供的数据设置 logger 回调(参见
cutensornetLoggerSetCallbackData()
)。
API 变更
将
cutensornetContractionGetWorkspaceSize
替换为cutensornetWorkspaceComputeSizes()
。cutensornetCreateContractionPlan()
、cutensornetContractionAutotune()
和cutensornetContraction()
接收工作区描述符,而不是工作区指针和大小参数。重命名了
cutensornetGraphAlgo_t
和cutensornetMemoryModel_t
枚举的选项。
兼容性说明:
cuTensorNet 需要 CUDA 11.x。
cuTensorNet 需要 cuTENSOR 1.5.0 或更高版本。
cuTensorNet 需要 OpenMP 运行时 (GOMP)。
cuTensorNet 不再需要 NVIDIA HPC SDK。
限制说明:
如果创建了多个切片,则使用
cutensornetContraction()
收缩切片的顺序应从切片 0 开始按升序排列。如果手动并行化切片(以任何方式:流、设备、进程等),请确保输出张量(受全局归约影响)已初始化为零。
cuTensorNet v0.1.0¶
首次公开版本
增加对
Linux ppc64le
的支持为以下方面添加了新的 API 和功能
微调切片算法
重新配置张量网络
简化张量网络
使用超优化器优化路径查找器参数
检索优化器配置参数
API 变更
cutensornetContractionGetWorkspace
重命名为cutensornetContractionGetWorkspaceSize
cutensornetContractionAutotune()
的函数签名已更改
兼容性说明:
cuTensorNet 需要 cuTENSOR 1.4.0 或更高版本
cuTensorNet 需要 NVIDIA HPC SDK 21.11 或更高版本
cuTensorNet v0.0.1¶
首次发布
支持
Linux x86_64
和Linux Arm64
支持 Volta 和 Ampere 架构(计算能力 7.0+)
兼容性说明:
cuTensorNet 需要 CUDA 11.4 或更高版本
cuTensorNet 需要 cuTENSOR 1.3.3 或更高版本
cuTensorNet 支持 NVIDIA HPC SDK 21.7 或更高版本
限制说明:
此版本针对 NVIDIA A100 和 V100 GPU 进行了优化。