

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

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

NVIDIA's CUDA-Q 是一種軟體程式庫，專為結合 CPUs、GPUs 和 Quantum 處理單元 (QPUs) 的程式設計混合量子演算法而設計。它提供統一的程式設計模型，可讓開發人員在單一程式中同時表達傳統和量子指令，簡化工作流程。 使用其內建 CPU 和 GPU 模擬器CUDA-Q加速量子程式模擬和執行時間。 CUDA-Q 可用於原生 Braket 筆記本執行個體 (NBIs) 和 Amazon Braket 混合任務。

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

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

CUDA-Q 預設會在 Braket NBI 環境中安裝 。您可以前往 Jupyter 啟動器頁面，然後選取 CUDA-Q和 Braket 圖磚來開啟CUDA-Q範例筆記本。這會在`0_Getting_started_with_CUDA-Q.ipynb`主視窗中開啟範例筆記本。如需更多CUDA-Q範例，請參閱 `nvidia_cuda_q/`目錄中的左側面板。

您也可以驗證 NBI 中安裝的 版本CUDA-Q或任何其他第三方套件。例如，您可以在筆記本程式碼儲存格中執行下列命令，以驗證安裝在環境中的 CUDA-Q、Qiskit、PennyLane 和 Braket 套件版本。

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

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

在 [Amazon Braket 混合任務](https://docs.aws.amazon.com/braket/latest/developerguide/braket-jobs.html)CUDA-Q上使用 可提供彈性的隨需運算環境。運算執行個體只會在工作負載期間執行，確保您只需支付使用量的費用。Amazon Braket Hybrid Jobs 也提供可擴展的體驗。使用者可以從較小的執行個體開始進行原型設計和測試，然後擴展到能夠處理更大工作負載的大型執行個體，以進行完整的實驗。

Amazon Braket Hybrid Jobs 支援 GPUs，對於最大化 CUDA-Q的潛力至關重要。與 CPU 型模擬器相比，GPUs 可大幅加速量子程式模擬，特別是在使用高 qubit 計數電路時。在 Amazon Braket 混合任務CUDA-Q上使用 時，平行化會變得直接。混合任務可簡化多個運算節點之間電路取樣和可觀測評估的分佈。這種CUDA-Q工作負載的無縫平行化可讓使用者更專注於開發工作負載，而不是為大規模實驗設定基礎設施。

若要開始使用，請參閱 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)，以使用 Braket 提供的CUDA-Q混合任務容器。

下列程式碼片段是使用 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 模擬器上的 Bell 電路。此範例會在您的筆記型電腦或 Braket Jupyter 筆記本上執行。由於 `local=True`設定，當您執行此指令碼時，容器會在您的本機環境中啟動，以執行用於測試和偵錯的CUDA-Q程式。完成測試後，您可以移除 `local=True`旗標，並在其中執行任務 AWS。若要進一步了解，請參閱[使用 Amazon Braket 混合任務](braket-jobs.md)。

如果您的工作負載具有高 qubit 計數、大量電路或大量反覆運算，您可以透過指定 `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 混合任務和 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):
    ...
```

Amazon Braket 範例 Github 中的[平行模擬筆記本](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 混合任務](braket-jobs.md)。若要進一步了解 CUDA-Q，請參閱 [NVIDIA CUDA-Q 文件](https://nvidia.github.io/cuda-quantum/latest/index.html)。