[返回科技频道首页]·[所有跟帖]·[ 回复本帖 ] ·[热门原创] ·[繁體閱讀]·[版主管理]
用 NVIDIA cuStateVec 加速量子电路模拟
送交者: 神游八荒[♂★★声望品衔10★★♂] 于 2022-03-10 9:10 已读 2435 次  

神游八荒的个人频道

6park.com

量子计算渴望为某些类型的经典难题提供更强大的计算能力和更快的结果。量子电路模拟对于理解量子计算和量子算法的发展至关重要。在量子电路中,量子器件由 N 量子位组成,通过对量子位应用一系列量子门和测量来执行计算。 6park.com

从数学上来说, N 量子比特系统的量子态可以描述为一个复杂的 2 N – 维向量。在经典计算机上模拟量子电路最直观的方法是状态向量模拟,它将这个向量与其 2 N 复杂值直接存储在内存中。该电路通过将向量乘以一系列矩阵来执行,这些矩阵对应于构成该电路的门序列。 6park.com

然而,随着状态向量的维数随着量子位的数量呈指数增长,完整描述状态的内存需求将这种方法限制在 30 – 50 量子位的电路中。基于张量网络的替代方法可以模拟更多的量子位,但通常在能够有效模拟的电路的深度和复杂性方面受到限制。 6park.com

NVIDIA cuQuantum SDK 具有用于状态向量和张量网络方法的库。在本文中,我们将重点介绍状态向量模拟和 cuStateVec 库。有关张量网络方法库的更多信息,请参阅 利用 NVIDIA cuTensorNet 进行量子电路模拟 。 6park.com

cuStateVec 图书馆

cuStateVec 库提供了单个 GPU 原语来加速状态向量模拟。由于状态向量方法是模拟量子电路的基础,大多数量子计算框架和库都包含自己的状态向量模拟器。为了便于与这些现有模拟器集成, cuStateVec 提供了一套 API ,以涵盖常见用例: 6park.com

测量门应用期望值采样器状态向量运动测量

一个量子位可以存在于两个态|0>和|1>的叠加中。当进行测量时,其中一个值被概率选择和观察,另一个值崩溃。 cuStateVec 测量 API 模拟量子位测量,并支持基于 Z 基产品的测量用例和批量单量子位测量。 6park.com

门应用

量子电路有量子逻辑门来修改和准备量子态,以观察理想的结果。量子逻辑门用酉矩阵表示。 cuStateVec gate 应用程序 API 提供了将量子逻辑门应用于某些矩阵类型的功能,包括: 6park.com

稠密的斜线的广义置换泡利矩阵的矩阵指数期望值

在量子力学中,计算算符和量子态的期望值。对于量子电路,我们还计算了给定电路和量子态的期望值。 cuStateVec 有一个 API ,可以用较小的内存占用计算期望值。 6park.com

采样器

状态向量模拟在数值上将量子态保留在状态向量中。通过计算每个状态向量元素的概率,您可以有效地多次模拟多个量子位的测量,而不会破坏量子态。 cuStateVec sampler API 以较小的内存占用在 GPU 上执行采样。 6park.com

状态向量运动

将状态向量放置在 GPU 上,以加速 GPU 的模拟。要在 CPU 上分析模拟结果,请将生成的状态向量复制到 CPU 。 cuStateVec 提供访问器 API 来代表用户执行此操作。在复制过程中,状态向量元素的顺序可以被重新安排,这样你就可以将量子位重新排序为所需的量子位顺序。 6park.com

有关更多信息,请参阅 cuStateVec documentation 。 6park.com

谷歌 Cirq / qsim 和 NVIDIA cuStateVec

宣布NVIDIA CuStEVEEC 文库集成的第一个项目是 Google’s qsim ,一个优化的模拟器,用于他们的量子计算框架, Cirq 。 Google Quantum 人工智能团队通过一个新的基于 cuStateVec 的 GPU 模拟后端扩展了 qsim ,以补充他们的 CPU 和 CUDA 模拟引擎。 6park.com

使用 cuStateVec 为 Cirq 和 qsim 构建说明

要通过 Cirq 启用 cuStateVec ,请从源代码编译 qsim ,并安装 qsimcirq Python 包提供的 Cirq 绑定。 6park.com

# Prerequisite: 6park.com

# Download cuQuantum Beta2 from https://developer.nvidia.com/cuquantum-downloads # Extract cuQuantum Beta2 archive and set the path to CUQUANTUM_ROOT 6park.com

$ tar -xf cuquantum-linux-x86_64-0.1.0.30-archive.tar.xz 6park.com

$ export CUQUANTUM_ROOT=`pwd`/cuquantum-linux-x86_64-0.1.0.30-archive 6park.com

$ ln -sf $CUQUANTUM_ROOT/lib $CUQUANTUM_ROOT/lib64 6park.com

# Clone qsim repository from github and checkout v0.11.1 branch 6park.com

$ git clone https://github.com/quantumlib/qsim.git 6park.com

$ git checkout v0.11.1 6park.com

# Build and install qsimcirq with cuStateVec 6park.com

$ pip install . 6park.com

# Install cirq 6park.com

$ pip install cirq

在本例中,我们运行一个电路,创建格林伯格 – 霍恩 – 齐林格( GHZ )状态,并对实验结果进行采样。以下 Python 脚本通过调用三个不同的模拟器来获取|0…00>和|1…11>中的振幅: 6park.com

Cirq 内置模拟器基于 CPU 的模拟器共享使用 cuStateVec 加速拆分

我们启用了两个基于 CIRQS 和 77YC 的 CPU 插槽,这两个插槽分别用于基于 CPU 的 CPU 模拟器。对于 cuStateVec 加速模拟,我们使用单个 A100 GPU 。 6park.com

import cirq 6park.com

import qsimcirq 6park.com

n_qubits = 32 6park.com

qubits = cirq.LineQubit.range(n_qubits) 6park.com

circuit = cirq.Circuit() 6park.com

circuit.append(cirq.H(qubits[0])) 6park.com

circuit.append(cirq.CNOT(qubits[idx], qubits[idx + 1]) for idx in range(n_qubits - 1)) 6park.com

# Cirqs = cirq.sim.Simulator() 6park.com

result = s.compute_amplitudes(circuit, [0, 2**n_qubits-1]) 6park.com

print(f'cirq.sim : {result}') 6park.com

# qsim(CPU) 6park.com

options = qsimcirq.QSimOptions(max_fused_gate_size=4, cpu_threads=512) 6park.com

s = qsimcirq.QSimSimulator(options) 6park.com

result = s.compute_amplitudes(circuit, [0, 2**n_qubits-1]) 6park.com

print(f'qsim(CPU) : {result}') 6park.com

# qsim(cuStateVec) 6park.com

options = qsimcirq.QSimOptions(use_gpu=True, max_fused_gate_size=4, gpu_mode=1) 6park.com

s = qsimcirq.QSimSimulator(options) 6park.com

result = s.compute_amplitudes(circuit, [0, 2**n_qubits-1]) 6park.com

print(f'cuStateVec: {result}')

以下控制台输出显示,通过使用 CPU SIMD 指令和 OpenMP 进行优化, qsim 的 CPU 版本比 Cirq 的模拟器快 5.1x 。通过使用 cuStateVec 版本,模拟速度进一步加快,比 Cirq 的模拟器快 30.04 倍,比 qsim 的 CPU 版本快 5.9 倍。 6park.com

cirq.sim : [0.70710677+0.j 0.70710677+0.j], 87.51 s 6park.com

qsim(CPU) : [(0.7071067690849304+0j), (0.7071067690849304+0j)], 17.04 s 6park.com

cuStateVec: [(0.7071067690849304+0j), (0.7071067690849304+0j)], 2.88 s绩效结果

下图显示了一些常用电路的门应用的初步性能结果。所有量子位计数的模拟都会加速。然而,随着量子位数量的增加,模拟速度显著加快,对于最大的电路,模拟速度大约是 10-20 倍。这种性能为探索更大量子电路的开发和评估提供了机会。 6park.com

A100 与 64 核 CPU 上的 Cirq / qsim + cuStateVec 6park.com

图 1 。与 64 核 EPYC 7742 CPU 上的 Cirq / qsim 相比,在单个 NVIDIA A100 GPU 上使用 cuStateVec 的流行量子电路的模拟性能 6park.com

相对于 EPYC 7742 中的 64 个 CPU 内核,一个 NVIDIA A100 上的 VQE 加速 6park.com

图 2 。与 64 核 EPYC 7742 CPU 上的 Cirq / qsim 相比,在单个 NVIDIA A100 GPU 上使用 cuStateVec 的多个不同分子的变分量子本征解算器加速 6park.com

多 GPU 状态向量仿真

状态向量模拟也非常适合在多个 GPU 上执行。大多数门应用是一种完全并行的操作,通过拆分状态向量并将其分布在多个 GPU 上来加速。 6park.com

在大约 30 个量子位之外,多 GPU 模拟是不可避免的。这是因为一个状态向量无法适应单个 GPU 的内存,因为它的大小随着附加的量子位呈指数增长。 6park.com

当多个 GPU 在一个模拟中协同工作时,每个 GPU 可以将一个门并行应用于其状态向量部分。在大多数情况下,每个 GPU 只需要本地数据来更新状态向量,每个 GPU 都可以独立应用门。 6park.com

然而,根据门作用于哪个模拟量子位, GPU 有时可能需要存储在不同 GPU 中的部分状态向量来执行更新。在这种情况下, GPU 必须交换大部分状态向量。这些部分的大小通常为数百兆字节或几千兆字节。因此,多 GPU 状态向量模拟对 GPU 互连的带宽非常敏感。 6park.com

DGX A100 完全符合这些要求,八款 NVIDIA A100 GPU 使用 NVLink 提供 600GB / s 的 GPU 到 GPU 直接带宽。我们选择了三种 30-32 量子位的常见量子计算算法,在 DGX A100 上用 cuStateVec 对 Cirq / qsim 进行基准测试: 6park.com

量子傅里叶变换( QFT )肖尔算法梧桐至上电路

与单次 GPU 运行相比,在八次 GPU 运行中,所有基准测试都显示出 4.5 – 7 倍加速之间良好的强缩放行为。 6park.com

图 3 。 DGX A100 上流行电路状态向量模拟的多重 GPU 缩放 6park.com

图 4 。流行量子电路模拟的加速比。在 DGX A100 上测量了 GPU 模拟的性能,并与 EPYC 7742 的两个插座的性能进行了比较. 6park.com

与两个 64 核 CPU 上的模拟时间相比, DGX-A100 在 50-90 倍之间提供了令人印象深刻的整体速度提升。 6park.com

总结

NVIDIA CuQuin SDK 中的 CuStEVEVEC 库旨在加速 GPU 上的量子电路的状态向量模拟器。谷歌针对 Cirq qsim 的模拟器是首批采用该库的模拟器之一,该库对现有程序的 GPU 加速使 Cirq 用户受益。随后将集成到更多量子电路框架,包括 IBM 的 Qiskit 软件。 6park.com

我们也在扩大规模。基于 cuStateVec 的多 GPU 模拟的初步结果显示,关键量子算法的加速比为 50 – 90 倍。我们希望 cuStateVec 成为开创量子计算新领域的宝贵工具。 6park.com

有没有关于如何改进 cuQuantum 库的反馈和建议?向 cuquantum-feedback@nvidia.com 发送电子邮件。

喜欢神游八荒朋友的这个贴子的话, 请点这里投票,“赞”助支持!
[举报反馈]·[ 神游八荒的个人频道 ]·[-->>参与评论回复]·[用户前期主贴]·[手机扫描浏览分享]·[返回科技频道首页]
帖子内容是网友自行贴上分享,如果您认为其中内容违规或者侵犯了您的权益,请与我们联系,我们核实后会第一时间删除。

所有跟帖:        ( 主贴楼主有权删除不文明回复,拉黑不受欢迎的用户 )


    用户名:密码:[--注册ID--]

    标 题:

    粗体 斜体 下划线 居中 插入图片插入图片 插入Flash插入Flash动画


         图片上传  Youtube代码器  预览辅助

    打开微信,扫一扫[Scan QR Code]
    进入内容页点击屏幕右上分享按钮

    楼主本栏目热帖推荐:

    >>>>查看更多楼主社区动态...






    [ 留园条例 ] [ 广告服务 ] [ 联系我们 ] [ 个人帐户 ] [ 版主申请 ] [ Contact us ]