张量网络模拟器

导论

从 cuQuantum Python v24.08 开始,我们提供了新的 API,使 Python 用户可以轻松利用 cuTensorNet 状态 API 进行张量网络模拟。这些 API 现在位于 cuquantum.cutensornet.experimental 模块下,并且在未来的版本中可能会发生更改。请在 NVIDIA/cuQuantum GitHub Discussions 上与我们分享您的反馈!

这组新的 API 以 NetworkState 类为中心,旨在支持以下用户群体

注意

  • NetworkState 类支持超出具有量子比特的常规量子电路状态的任意状态维度 (d=2)。有关模拟具有非均匀状态维度的复杂状态的示例,请参见任意状态示例

  • 对于 MPS 和 MPO,仅支持开放边界条件。

用户可以进一步将张量网络模拟方法指定为以下方法之一

  • 基于收缩的模拟:config 指定为 TNConfig 对象。

  • 基于 MPS 的模拟:config 指定为 MPSConfig 对象,从而可以详细控制截断范围、规范中心、SVD 算法和归一化选项。

一旦问题被完全指定,用户就可以利用以下执行 API 来计算各种属性

此外,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 对象创建和准备的开销。

兼容参数对于不同的执行方法具有不同的上下文

有关更多详细信息,请参阅我们的 cirq 缓存示例qiskit 缓存示例。此外,用户可以将缓存功能与 NetworkState.update_tensor_operator() 方法结合使用,以减少变分工作流程的开销,在变分工作流程中,需要在许多具有相同拓扑的状态上执行相同的计算。有关更多详细信息,请参阅我们的 变分工作流程示例

MPI 支持

从 cuQuantum v24.08 版本开始,NetworkState 为所有带有 compute_ 后缀的执行方法提供了初步的分布式并行支持,当使用基于张量网络收缩的模拟时,即 TNConfig。 要激活分布式并行执行,用户必须执行以下任务

  1. 显式设置要在 cuquantum.NetworkOptions.device_id 中使用的设备 ID,并通过 options 参数将其提供给 NetworkState

  2. 显式地在相应设备上使用 cuquantum.cutensornet.create() 创建库句柄,使用 cuquantum.cutensornet.distributed_reset_configuration() 将 MPI 通信器绑定到库句柄,并通过 options 参数将其提供给 NetworkState

有关更多详细信息,请参阅我们的 cirq mpi 采样示例qiskit mpi 采样示例