量子经典超级计算机编程

2023年07月20日 由 Susan 发表 496773 0
事实证明,异构计算架构(包含各种处理器类型协同工作的架构)在人工智能、机器学习 (ML)、量子物理学和通用数据科学中的计算工作负载的持续可扩展性方面极具价值。

这一发展的关键是能够抽象出异构架构,并推广一个框架,使设计和实现此类应用程序更加高效。实现这一点的最著名的编程模型是CUDA工具包,它允许按照单指令、多数据模型将工作并行卸载到数千个 GPU 内核。

最近,一种新形式的节点级协处理器技术引起了计算科学界的关注:量子计算机,它依靠量子物理的非直观定律,利用叠加、纠缠和干涉等原理来处理信息。这种独特的加速器技术可能在非常特定的应用中被证明是有用的,并准备与CPU和GPU协同工作,开创一个以前被认为不可行的计算进步时代。

那么问题就变成了:如果你使用量子协处理器增强现有的经典异构计算架构,你将如何以适合计算可扩展性的方式对其进行编程?

NVIDIA正在通过CUDA Quantum回答这个问题,CUDA Quantum是一种开源编程模型,使用量子内核扩展C++和Python,旨在在量子硬件上进行编译和执行。

这篇文章介绍了 CUDA 量子,重点介绍了它的独特功能,并展示了研究人员如何利用它来在日常量子算法研究和开发中积累动力。

CUDA 量子:你好量子世界


首先查看 CUDA Quantum 编程模型,使用 Pythonic 接口创建一个双量子位 GHZ 状态。这将使您习惯其语法。
import cudaq 

# Create the CUDA Quantum Kernel
kernel = cudaq.make_kernel()

# Allocate 2 qubits
qubits = kernel.qalloc(2)

# Prepare the bell state
kernel.h(qubits[0])
kernel.cx(qubits[0], qubits[1])

# Sample the final state generated by the kernel
result = cudaq.sample(kernel, shots_count = 1000)
print(result)
{11:487, 00:513}

语言规范借用了 CUDA 已被证明成功的概念;具体来说,在函数边界级别分离主机和设备代码。下面的代码片段在 C++ 中的 GHZ 状态准备示例中演示了此功能。
#include  
int main() {
// Define the CUDA Quantum kernel as a C++ lambda
auto ghz =[](int numQubits) __qpu__ {
// Allocate a vector of qubits
cudaq::qvector q(numQubits);

// Prepare the GHZ state, leverage standard
// control flow, specify the x operation
// is controlled.
h(q[0]);
for (int i = 0; i < numQubits - 1; ++i)
x(q[i], q[i + 1]);
};

// Sample the final state generated by the kernel
auto results = cudaq::sample(ghz, 15);
results.dump();

return 0;
}

CUDA Quantum 支持将量子代码定义为独立的内核表达式。这些表达式可以是 C++ 中的任何可调用表达式(此处显示了 lambda,并且隐式类型可调用),但必须使用属性进行批注,使 nvq++ 编译器能够单独编译它们。内核表达式可以按值(此处为量子比特数)接受经典输入,并利用标准C++控制流,例如循环和 if 语句。__qpu__

图形处理器的效用


扩大 QPU 并将其移出研究实验室并将它们托管在云上以供一般访问的实验工作是惊人的。然而,目前的QPU嘈杂且规模小,阻碍了算法研究的进步。为了帮助实现这一目标,电路仿真技术正在满足推进研究前沿的迫切要求。

台式机CPU可以模拟小规模的量子比特统计;但是,状态向量的内存需求随着量子比特的数量呈指数增长。一台典型的台式计算机拥有15 GB的RAM,使人能够缓慢地模拟大约 100 个量子比特。最新的 NVIDIA DGX H35 使您能够以无与伦比的速度超越量子位大关。

图 1 显示了 CPU 和 GPU 后端上 CUDA Quantum 的典型变分算法工作流的比较。这里对GPU的需求很明显,因为14个量子位的加速比是425倍,并且随着量子比特数的增加而增加。外推到 30 个量子位,CPU 到 GPU 的运行时间为 13 年,而 2 天。这释放了研究人员超越小规模概念验证结果的能力,以实现更接近实际应用的算法。

图1.典型量子神经网络工作流的 CPU 和 GPU 之间的性能比较(作为量子比特计数的函数)


与CUDA Quantum一起,NVIDA开发了cuQuantum,这是一个库,通过手动优化的CUDA内核,使用状态向量和张量网络方法对量子计算机进行闪电般的快速模拟。内存分配和处理完全在 GPU 上进行,从而显著提高性能和规模。CUDA Quantum与cuQuantum相结合,形成了一个强大的混合算法研究平台。

图 2 将 CUDA Quantum 与领先的量子计算 SDK 进行了比较,两者都利用 NVIDIA cuQuantum 后端以最佳方式将电路仿真卸载到 NVIDIA GPU 上。在这种情况下,使用 CUDA 昆腾的好处是孤立的,与领先的框架相比,平均性能提高了 5 倍。

图2.CUDA Quantum 和领先框架之间的 GPU 到 GPU 比较,两者都将电路仿真卸载到 NVIDIA GPU,CUDA Quantum 平均快 5 倍



实现未来的多 QPU 工作流程


CUDA Quantum 不仅限于考虑当前基于云的量子执行模型,而是完全预测紧密联合的系统级量子加速。此外,CUDA Quantum 使应用程序开发人员能够设想具有多GPU后端的多QPU架构的工作流程。

对于前面的量子神经网络 (QNN) 示例,您可以使用多 GPU 功能运行数据集的正向传递,使我们能够执行未来的多 QPU 工作流。图 3 显示了跨两个 GPU 分布 QNN 工作流的结果,并展示了强大的扩展性能,表明所有 GPU 计算资源的有效使用。与单个 GPU 相比,使用两个 GPU 使整体工作流程快两倍,展示了强大的扩展性。 

图3.将 QNN 转发传递工作负载分发到由多 GPU 后端启用的多个 QPU 的结果


受益于多 QPU 并行化的另一个常见工作流是变分量子特征求解器 (VQE)。这需要由多个单个泡利张量积项组成的复合哈密顿量的期望值。如下所示的 CUDA 量子观察调用会自动批处理项(图 4),并卸载到多个 GPU 或 QPU(如果可用),从而展示了强大的扩展性(图 5)。



numQubits, numTerms = 30, 1e5
hamiltonian = cudaq.SpinOperator.random(numQubits, numTerms)
cudaq.observe(ansatz, hamiltonian, parameters)


图4.跨多个 NVIDIA A100 GPU 自动批处理哈密顿项



图5.由于优化的软件堆栈支持用户可用的硬件、GPU 或 QPU,因此获得了加速



GPU-QPU 工作流程


到目前为止,这篇文章已经探索了使用 GPU 来扩展量子电路模拟,使其超出 CPU 以及多 QPU 工作流程。以下部分将深入探讨使用 PyTorch 和 CUDA Quantum 的混合量子神经网络示例的真正异构计算。

如图 6 所示,混合量子神经网络将量子电路作为整个神经网络架构中的一个层包含在内。这是一个活跃的研究领域,在某些领域具有优势,可以改善泛化误差。

图6.由 GPU 加速的混合量子神经网络架构由 CUDA Quantum 实现


显然,在 GPU 上运行经典神经网络层并在 QPU 上运行量子电路是有利的。通过设置以下内容,可以使用 CUDA 昆腾加速整个工作流程:



quantum_device = cudaq.set_target('ion-trap') 
classical_device = torch.cuda.set_device(gpu0)

这样做的效用是深远的。CUDA 昆腾能够以紧密集成、无缝的方式卸载适用于 QPU 和 GPU 的相关内核。除了混合应用程序之外,涉及纠错、实时优化控制和通过 Clifford 数据回归缓解错误的工作流都将受益于紧密耦合的计算架构。

QPU 硬件提供商


嵌入在 CUDA 量子编程范式中的基础信息单元是 qudit,它表示能够访问d状态的量子比特。量子比特是一个特定的实例,其中 d=2。通过使用量子点,CUDA Quantum 可以有效地针对各种量子计算架构,包括超导电路、离子阱、中性原子、基于金刚石的光子系统等。

您可以方便地开发工作流程,nvq++ 编译器会自动在指定的架构上编译和执行程序。图 7 显示了新编译器产生的编译加速。编译涉及电路优化,分解为硬件支持的本机门集和量子比特路由。CUDA Quantum使用的nvq ++编译器与竞争对手相比平均快2.4倍。

图7.编译时间随 CUDA 量子和领先框架的量子比特数量而缩放


为了适应所需的后端,您可以简单地修改标志。图8显示了如何在模拟后端和 Quantinuum H1 离子阱系统之间无缝切换的示例。顶部显示了在 Python 中设置所需后端的语法,底部显示了在 C++ 中设置的语法。set_target()


图8.VQE 景观图演示在模拟或 QPU 硬件上的执行



来源:https://developer.nvidia.com/blog/programming-the-quantum-classical-supercomputer/

欢迎关注ATYUN官方公众号
商务合作及内容投稿请联系邮箱:bd@atyun.com
评论 登录
写评论取消
回复取消