

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

# 在 Amazon Braket 上使用 CUDA-Q
<a name="braket-using-cuda-q"></a>

NVIDIA's CUDA-Q是一个软件库，专为编程组合了 CPUs GPUs、和量子处理单元 (QPUs) 的混合量子算法而设计。它提供了统一的编程模型，允许开发人员在单个程序中表达经典指令和量子指令，从而简化工作流程。 CUDA-Q利用其内置 CPU 和 GPU 模拟器加速量子程序仿真和运行时间。 CUDA-Q适用于原生 Braket 笔记本实例 (NBIs) 和 Amazon Braket 混合任务。

**Topics**
+ [CUDA-Q in NBIs](#braket-cuda-q-nbis)
+ [混合工作中的 CUDA-Q](#braket-cuda-q-hybrid-jobs)

## CUDA-Q in NBIs
<a name="braket-cuda-q-nbis"></a>

CUDA-Q 默认安装在 Braket NBI 环境中。您可以通过前往 Jupyter 启动器页面并选择 CUDA-Q 和 Braket 图块来打开 CUDA-Q 示例 Notebook。这将在主窗口 `0_Getting_started_with_CUDA-Q.ipynb` 中打开示例 Notebook。有关更多 CUDA-Q 示例，请参阅 `nvidia_cuda_q/` 目录中的左侧面板。

您还可以验证 NBI 中安装的 CUDA-Q 或任何其他第三方软件包的版本。例如，您可以在笔记本代码单元中运行以下命令来验证环境中安装的CUDA-Q、Qiskit 和 Braket 软件包的版本。 PennyLane

```
%pip freeze | grep -i -e cudaq -e qiskit -e pennylane -e braket
```

## 混合工作中的 CUDA-Q
<a name="braket-cuda-q-hybrid-jobs"></a>

在 [Amazon Braket Hybrid Jobs](https://docs.aws.amazon.com/braket/latest/developerguide/braket-jobs.html) 上使用 CUDA-Q 可提供灵活的按需计算环境。计算实例仅在您的工作负载持续时间内运行，确保您只需按实际使用量付费。Amazon Braket Hybrid Jobs 还提供了可扩展的体验。用户可以从较小的实例开始进行原型设计和测试，然后纵向扩展到能够处理更多工作负载以进行完整实验的大型实例。

Amazon Braket 混合工作支持 GPUs 对于最大限度地发挥潜CUDA-Q力至关重要。 GPUs 与基于 CPU 的模拟器相比，可显著加快量子程序仿真速度，尤其是在使用高量子比特数电路时。在 Amazon Braket Hybrid Jobs 上使用 CUDA-Q 时，并行化变得简单明了。Hybrid Jobs 简化了电路采样和可观察评估在多个计算节点上的分布。借助这种 CUDA-Q 工作负载的无缝并行化，用户能够将更多精力放在开发工作负载上，而不是为大规模实验设置基础架构。

要开始使用 Braket 提供的 CUDA-Q 混合作业容器，请参阅 Github 上的 Amazon Braket 示例 Github 上的 [CUDA-Q 入门](https://github.com/amazon-braket/amazon-braket-examples/blob/main/examples/nvidia_cuda_q/0_Getting_started_with_CUDA-Q.ipynb)示例。

以下代码片段是使用 Amazon Braket Hybrid Jobs 运行 CUDA-Q 程序的 `hello-world` 示例。

```
image_uri = retrieve_image(Framework.CUDAQ, AwsSession().region)

@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 模拟器上的贝尔电路。此示例在您的 Notebook 或 Braket Jupyter Notebook 上本地运行。由于 `local=True` 设置的原因，当您运行此脚本时，将在您的本地环境中启动一个容器来运行 CUDA-Q 程序以进行测试和调试。完成测试后，您可以移除 `local=True` 标志并继续在 AWS上运行作业。要了解更多信息，请参阅[使用 Amazon Braket Hybrid Jobs](braket-jobs.md)。

如果您的工作负载具有较高的量子比特数、大量的电路或大量的迭代，则可以通过指定 `instance_config` 设置来使用更强大的 CPU 计算资源。以下代码段演示如何在 `hybrid_job` 装饰器中配置 `instance_config` 设置。有关所支持实例类型的更多信息，请参阅[实例类型](braket-jobs-configure-job-instance-for-script.md)。有关实例类型的列表，请参阅 [Amazon EC2 实例类型](https://aws.amazon.com/ec2/instance-types/)。

```
@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.g4dn.xlarge"),
)
def my_job_script():
    ...
```

Amazon Braket Hybrid Jobs NBIs 并支持并行 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.g4dn.12xlarge", instanceCount=1),
    image_uri=image_uri,
)
def parallel_observables_gpu_job(sagemaker_mpi_enabled=True):
    ...
```

Github 上的 Amazon Braket 示例中的[并行仿真笔记本](https://github.com/amazon-braket/amazon-braket-examples/blob/main/examples/nvidia_cuda_q/5_Multiple_GPU_simulations.ipynb) end-to-end提供了演示如何在 GPU 后端运行量子程序仿真以及如何对可观测物和电路批量进行并行仿真的示例。

### 在量子计算机上运行工作负载
<a name="braket-using-cuda-q-quantum"></a>

完成模拟器测试后，您可以过渡到在上运行实验 QPUs。只需将目标切换到 Amazon Braket QPU，如 IQM、IonQ 或 Rigetti 设备即可。以下代码片段说明了如何将目标设置为 IQM Garnet 设备。有关可用列表 QPUs，请参阅 [Amazon Braket 控制台](https://console.aws.amazon.com/braket/home)。

```
device_arn = "arn:aws:braket:eu-north-1::device/qpu/iqm/Garnet"
cudaq.set_target("braket", machine=device_arn)
```

有关混合任务的更多信息，请参阅开发者指南中的[使用 Amazon Braket Hybrid Jobs](braket-jobs.md)。要了解有关 CUDA-Q 的更多信息，请参阅 [NVIDIA CUDA-Q 文档](https://nvidia.github.io/cuda-quantum/latest/index.html)。