张量网络模拟器¶
导论¶
从 cuQuantum Python v24.08 开始,我们提供了新的 API,使 Python 用户可以轻松利用 cuTensorNet 状态 API 进行张量网络模拟。这些 API 现在位于 cuquantum.cutensornet.experimental
模块下,并且在未来的版本中可能会发生更改。请在 NVIDIA/cuQuantum GitHub Discussions 上与我们分享您的反馈!
这组新的 API 以 NetworkState
类为中心,旨在支持以下用户群体
量子计算框架用户: 这些用户可以直接从量子电路对象(例如
cirq.Circuit
或qiskit.QuantumCircuit
)通过NetworkState.from_circuit()
方法初始化张量网络状态。张量网络框架开发人员和研究人员: 这些用户可以通过应用张量算符、矩阵乘积算符 (MPO) 以及将初始状态设置为矩阵乘积态 (MPS) 来构建任何感兴趣的状态。这里涉及的方法包括
NetworkState.apply_tensor_operator()
、NetworkState.update_tensor_operator()
、NetworkState.set_initial_mps()
、NetworkState.apply_mpo()
和NetworkState.apply_network_operator()
。来自 NumPy、CuPy 和 PyTorch 的类 ndarray 对象都支持作为输入操作数。
注意
NetworkState
类支持超出具有量子比特的常规量子电路状态的任意状态维度 (d=2
)。有关模拟具有非均匀状态维度的复杂状态的示例,请参见任意状态示例。对于 MPS 和 MPO,仅支持开放边界条件。
用户可以进一步将张量网络模拟方法指定为以下方法之一
基于收缩的模拟: 将
config
指定为TNConfig
对象。基于 MPS 的模拟: 将
config
指定为MPSConfig
对象,从而可以详细控制截断范围、规范中心、SVD 算法和归一化选项。
一旦问题被完全指定,用户就可以利用以下执行 API 来计算各种属性
NetworkState.compute_state_vector()
:将最终状态系数计算为 N 维张量,其范围与指定状态匹配。NetworkState.compute_amplitude()
:计算给定比特串的幅度系数。NetworkState.compute_batched_amplitudes()
:计算状态维度子集的批量幅度系数,同时其他维度固定在某些状态。NetworkState.compute_reduced_density_matrix()
:计算状态维度子集的约化密度矩阵,可以选择将另一个子集固定为特定状态。NetworkState.compute_expectation()
:计算给定张量网络算符的期望值,该算符可以指定为张量积(例如泡利算符)或带有系数的 MPO 的总和。NetworkState.compute_sampling()
:从底层状态抽取样本,可以选择仅采样所有状态维度的一个子集。NetworkState.compute_norm()
:计算张量网络状态的范数。
此外,NetworkOperator
类允许用户创建一个网络算符对象,作为张量积的总和(通过 NetworkOperator.append_product()
)或 MPO 的总和(通过 NetworkOperator.append_mpo()
)以及系数。然后,此对象可以与 NetworkState
类交互,使用户可以将 MPO 应用于状态,或使用诸如 NetworkState.apply_network_operator()
和 NetworkState.compute_expectation()
之类的方法计算算符在状态上的期望值。
缓存功能¶
从 cuQuantum v24.08 开始,NetworkState
为所有带有 compute_
后缀的执行方法提供初步的缓存支持,当使用基于收缩的张量网络模拟或不使用基于值的截断的 MPS 模拟时。在首次调用这些方法期间,将创建、准备、缓存这些属性的底层 cuTensorNet C 对象,然后执行以计算最终输出。在后续调用使用兼容参数的相同方法而不使用 NetworkState.apply_tensor_operator()
、 NetworkState.apply_mpo()
、 NetworkState.set_initial_mps()
或 NetworkState.apply_network_operator()
更新状态(可以调用 NetworkState.update_tensor_operator()
),将重用缓存的 C 对象来计算最终输出,从而减少 C 对象创建和准备的开销。
兼容参数对于不同的执行方法具有不同的上下文
对于
NetworkState.compute_state_vector()
、NetworkState.compute_amplitude()
和NetworkState.compute_norm()
,任何参数都将导致使用相同的缓存对象。对于
NetworkState.compute_batched_amplitudes()
,由fixed
指定的状态维度集必须相同,而每个维度的固定状态可能不同。对于
NetworkState.compute_reduced_density_matrix()
,where
参数和由fixed
指定的状态维度集必须相同,而每个维度的固定状态可能不同。对于
NetworkState.compute_expectation()
,必须使用相同的NetworkOperator
对象,且底层组件保持不变。将operators
作为泡利算符字符串或作为将泡利字符串映射到系数的字典提供将不会激活缓存机制。对于
NetworkState.compute_sampling()
,需要相同的modes
参数才能激活缓存机制。
有关更多详细信息,请参阅我们的 cirq 缓存示例 和 qiskit 缓存示例。此外,用户可以将缓存功能与 NetworkState.update_tensor_operator()
方法结合使用,以减少变分工作流程的开销,在变分工作流程中,需要在许多具有相同拓扑的状态上执行相同的计算。有关更多详细信息,请参阅我们的 变分工作流程示例。
MPI 支持¶
从 cuQuantum v24.08 版本开始,NetworkState
为所有带有 compute_
后缀的执行方法提供了初步的分布式并行支持,当使用基于张量网络收缩的模拟时,即 TNConfig
。 要激活分布式并行执行,用户必须执行以下任务
显式设置要在
cuquantum.NetworkOptions.device_id
中使用的设备 ID,并通过options
参数将其提供给NetworkState
。显式地在相应设备上使用
cuquantum.cutensornet.create()
创建库句柄,使用cuquantum.cutensornet.distributed_reset_configuration()
将 MPI 通信器绑定到库句柄,并通过options
参数将其提供给NetworkState
。
有关更多详细信息,请参阅我们的 cirq mpi 采样示例 和 qiskit mpi 采样示例。