本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
NVIDIA’s CUDA-Q 是一个软件库,专为编程组合了 CPUs GPUs、和量子处理单元 (QPUs) 的混合量子算法而设计。它提供了统一的编程模型,允许开发人员在单个程序中表达经典指令和量子指令,从而简化工作流程。CUDA-Q 利用其内置 CPU 和 GPU 模拟器加速量子程序仿真和运行时间。
使用 CUDA-Q 在 Amazon Braket 上,Hybrid Jobs 提供了灵活的按需计算环境。计算实例仅在您的工作负载持续时间内运行,确保您只需为实际用量付费。Amazon Braket Hybrid Jobs 还提供了可扩展的体验。用户可以从较小的实例开始进行原型设计和测试,然后扩展到能够处理更多工作负载以进行完整实验的大型实例。
Amazon Braket 混合工作支持对于最大限度 GPUs 地发挥作用至关重要 CUDA-Q的潜力。 GPUs 与基于 CPU 的模拟器相比,可显著加快量子程序仿真速度,尤其是在使用高量子比特数电路时。使用时并行化变得直截了当 CUDA-Q 在 Amazon Braket Hybrid Jobs 上。Hybrid Jobs 简化了电路采样和可观察评估在多个计算节点上的分布。这种无缝并行化 CUDA-Q 工作负载允许用户将更多精力放在开发工作负载上,而不是为大规模实验设置基础架构。
要开始使用,请参阅 CUDA-Q Amazon Braket
以下代码片段是运行的hello-world
示例 CUDA-Q 与 Amazon Braket Hybrid Jobs 合作。
image_uri = "<ecr-image-uri>"
@hybrid_job(device='local:nvidia/qpp-cpu', image_uri=image_uri)
def hello_quantum():
import cudaq
# define the backend
device=get_job_device_arn()
cudaq.set_target(device.split('/')[-1])
# define the Bell circuit
kernel = cudaq.make_kernel()
qubits = kernel.qalloc(2)
kernel.h(qubits[0])
kernel.cx(qubits[0], qubits[1])
# sample the Bell circuit
result = cudaq.sample(kernel, shots_count=1000)
measurement_probabilities = dict(result.items())
return measurement_probabilities
上面的示例模拟了 CPU 仿真器上的贝尔电路。此示例在您的笔记本电脑或 Braket Jupyter 笔记本电脑上本地运行。由于local=True
设置的原因,当您运行此脚本时,将在您的本地环境中启动一个容器来运行 CUDA-Q 程序进行测试和调试。完成测试后,您可以移除该local=True
标志并运行您的作业 AWS。要了解更多信息,请参阅 Amazon Braket 混合作业入门。
如果您的工作负载具有较高的量子比特数、大量的电路或大量的迭代,则可以通过指定设置来使用更强大的 CPU 计算资源。instance_config
以下代码片段显示了如何在hybrid_job
装饰器中配置instance_config
设置。有关支持的实例类型的更多信息,请参阅配置混合作业实例以运行您的脚本。有关实例类型的列表,请参阅 Amazon EC2 实例类型
@hybrid_job(
device="local:nvidia/qpp-cpu",
image_uri=image_uri,
instance_config=InstanceConfig(instanceType="ml.c5.2xlarge"),
)
def my_job_script():
...
对于要求更高的工作负载,您可以将工作负载运行在 CUDA-Q GPU 模拟器。要启用 GPU 模拟器,请使用后端名称nvidia
。后nvidia
端的运行方式是 CUDA-Q GPU 模拟器。接下来,选择支持的 Amazon EC2 实例类型 NVIDIA GPU。以下代码片段显示了 GPU 配置的装饰器hybrid_job
。
@hybrid_job(
device="local:nvidia/nvidia",
image_uri=image_uri,
instance_config=InstanceConfig(instanceType="ml.p3.2xlarge"),
)
def my_job_script():
...
Amazon Braket Hybrid Jobs 支持并行 GPU 模拟 CUDA-Q。 您可以并行计算多个可观测值或多个电路,以提高工作负载的性能。要并行化多个可观察对象,请对算法脚本进行以下更改。
设置后nvidia
端的mgpu
选项。这是并行化可观察对象所必需的。并行化使用 MPI 进行相互通信 GPUs,因此 MPI 需要在执行前初始化,并在执行之后完成。
接下来,通过设置指定执行模式execution=cudaq.parallel.mpi
。以下代码片段显示了这些更改。
cudaq.set_target("nvidia", option="mqpu")
cudaq.mpi.initialize()
result = cudaq.observe(
kernel, hamiltonian, shots_count=n_shots, execution=cudaq.parallel.mpi
)
cudaq.mpi.finalize()
在hybrid_job
装饰器中指定托管多个实例类型, GPUs 如以下代码片段所示。
@hybrid_job(
device="local:nvidia/nvidia-mqpu",
instance_config=InstanceConfig(instanceType="ml.p3.8xlarge", instanceCount=1),
image_uri=image_uri,
)
def parallel_observables_gpu_job(sagemaker_mpi_enabled=True):
...
Github 上的 Amazon Braket 示例中的并行仿真笔记本
在量子计算机上运行工作负载
完成模拟器测试后,您可以过渡到在上运行实验 QPUs。只需将目标切换到 Amazon Braket QPU 即可,比如 IQM, IonQ,或 Rigetti 设备。以下代码片段说明了如何将目标设置为 IQM Garnet 设备。有关可用列表 QPUs,请参阅 Amazon Braket 控制台
device_arn = "arn:aws:braket:eu-north-1::device/qpu/iqm/Garnet"
cudaq.set_target("braket", machine=device_arn)
有关 Amazon Braket 混合任务的更多信息,请参阅开发者指南中的使用 Amazon Braket 混合任务。了解相关更多信息 CUDA-Q,请参阅 CUDA-Q 文档