在 Amazon Braket 上使用 CUDA-Q - Amazon Braket

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

在 Amazon Braket 上使用 CUDA-Q

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 的模拟器相比,可显著加快量子程序仿真速度,尤其是在使用高量子比特数电路时。在 Amazon Braket 混合作业CUDA-Q上使用时,并行化变得简单明了。Hybrid Jobs 简化了电路采样和可观察评估在多个计算节点上的分布。这种CUDA-Q工作负载的无缝并行化使用户能够将更多精力放在开发工作负载上,而不是为大规模实验设置基础架构。

要开始使用,请参阅 Amazon Braket 示例 Github 上的CUDA-Q入门示例,创建一个支持CUDA-Q自带容器 (BYOC) 的任务容器。确保您拥有相应的 IAM 权限,可以构建您的CUDA-Q容器并将其发布到 Amazon ECR 存储库。

以下代码片段是使用 Amazon Braket 混合任务运行CUDA-Q程序的hello-world示例。

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 模拟器运行。接下来,选择支持 NVIDIA GPU 的 Amazon EC2 实例类型。以下代码片段显示了 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 示例中的并行仿真笔记本 end-to-end提供了演示如何在 GPU 后端运行量子程序仿真以及如何对可观测物和电路批量进行并行仿真的示例。

在量子计算机上运行工作负载

完成模拟器测试后,您可以过渡到在上运行实验 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 文档