

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# CUDA-Q と Amazon Braket の併用方法
<a name="braket-using-cuda-q"></a>

NVIDIA's CUDA-Q は、CPU、GPU、量子処理ユニット (QPU) を組み合わせたハイブリッド量子アルゴリズムをプログラミングするために設計されたソフトウェアライブラリです。これは、開発者が古典命令と量子命令の両方を 1 つのプログラム内で表現できる統合されたプログラミングモデルを提供しているため、ワークフローを効率化できます。CUDA-Q は、埋め込みの CPU および GPU シミュレーターを使用することで、量子プログラムについてシミュレーションの高速化と実行時間の短縮を実現します。CUDA-Q は、ネイティブの Braket ノートブックインスタンス (NBI) と Amazon Braket Hybrid Jobs でご利用いただけます。

**Topics**
+ [

## NBI の CUDA-Q
](#braket-cuda-q-nbis)
+ [

## Hybrid Jobs での CUDA-Q
](#braket-cuda-q-hybrid-jobs)

## NBI の CUDA-Q
<a name="braket-cuda-q-nbis"></a>

CUDA-Q は、デフォルトで Braket NBI 環境にインストールされています。CUDA-Q のサンプルノートブックを開くには、Jupyter ランチャーページにアクセスし、[CUDA-Q と Braket タイル] を選択します。これにより、メインウィンドウでサンプルノートブック `0_Getting_started_with_CUDA-Q.ipynb` が開きます。その他の CUDA-Q のサンプルについては、左側のパネルにある `nvidia_cuda_q/` ディレクトリを参照してください。

また、CUDA-Q のバージョンや、NBI 内にインストールされているその他のサードパーティーパッケージを確認することもできます。例えば、環境にインストールされている CUDA-Q、Qiskit、PennyLane、および Braket パッケージのバージョンを確認するには、ノートブックのコードセルで次のコマンドを実行します。

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

## Hybrid Jobs での 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 Hybrid Jobs は、CUDA-Q の潜在能力を最大限に引き出すために不可欠な GPU をサポートしています。GPU は、CPU ベースのシミュレーターと比較して、量子プログラムのシミュレーションを大幅に高速化します。量子ビット数の大きな回路を使用する場合は特にそうなります。Amazon Braket Hybrid Jobs で CUDA-Q を使用すると、並列化が簡単になります。Hybrid Jobs が、回路のサンプリングとオブザーバブルの評価を複数の計算ノードに簡単に分散できるようにしたためです。この CUDA-Q ワークロードのシームレスな並列化により、ユーザーは大規模な実験の場合に、インフラストラクチャを構築せずにワークロードの開発に専念することができます。

開発を始めるには、Braket が提供する CUDA-Q ハイブリッドジョブコンテナを使用するための、「Amazon Braket examples」Github 内の「[CUDA-Q starter example](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 シミュレーターのベル回路をシミュレートしています。この例は、ラップトップまたは 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 と NBI は、CUDA-Q を使用した並列 GPU シミュレーションをサポートしています。複数のオブザーバブルまたは複数の回路の評価を並列化することで、ワークロードのパフォーマンスを改善できます。複数のオブザーバブルを並列化するには、アルゴリズムスクリプトに以下の変更を加えます。

`nvidia` バックエンドの `mgpu` オプションを設定します。これは、オブザーバブルを並列化するために必要です。並列化は GPU 間の通信に MPI を使用するため、実行前に MPI を初期化しておき、実行後は 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` デコレータ内で、次のコードスニペットに示すように、複数の GPU をホストするインスタンスタイプを指定します。

```
@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 examples」Github の「[parallel simulations](https://github.com/amazon-braket/amazon-braket-examples/blob/main/examples/nvidia_cuda_q/5_Multiple_GPU_simulations.ipynb)」ノートブックは、GPU バックエンドで量子プログラムシミュレーションを実行するとともにオブザーバブルと回路バッチの並列シミュレーションを実行する方法を示したエンドツーエンドのサンプルを提供しています。

### 量子コンピュータでワークロードを実行する
<a name="braket-using-cuda-q-quantum"></a>

シミュレーターのテストが完了したら、QPU での実験の実行に移ることができます。ターゲットを IQM、IonQ、または Rigetti デバイスなどの Amazon Braket QPU に切り替えるだけでよいのです。次のコードスニペットは、ターゲットを IQM Garnet デバイスに設定する方法を示しています。使用可能な QPU の一覧については、「[Amazon Braket console](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)を参照してください。