

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Amazon Braket에서 CUDA-Q 사용
<a name="braket-using-cuda-q"></a>

NVIDIA's CUDA-Q는 CPU, GPU 및 QPU를 결합한 하이브리드 양자 알고리즘을 프로그래밍하기 위해 설계된 소프트웨어 라이브러리입니다. 이 라이브러리는 통합 프로그래밍 모델을 제공하여 개발자가 단일 프로그램 내에서 고전 명령과 양자 명령을 모두 표현할 수 있게 함으로써 워크플로를 간소화합니다. CUDA-Q는 기본 제공 CPU 및 GPU 시뮬레이터를 통해 양자 프로그램 시뮬레이션과 런타임을 가속화합니다. CUDA-Q는 네이티브 Braket 노트북 인스턴스(NBI)와 Amazon Braket Hybrid Jobs에서 사용할 수 있습니다.

**Topics**
+ [NBI에서의 CUDA-Q](#braket-cuda-q-nbis)
+ [하이브리드 작업에서의 CUDA-Q](#braket-cuda-q-hybrid-jobs)

## NBI에서의 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 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를 사용하면 병렬화가 간단해집니다. 하이브리드 작업은 여러 계산 노드에 걸쳐 회로 샘플링 및 관찰 가능 항목 평가의 분산을 단순화합니다. 이렇게 원활한 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 시뮬레이터에서 벨 회로를 시뮬레이션합니다. 이 예제는 렙톱 또는 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는 실행 전에 초기화되고 실행 후에 종료되어야 합니다.

다음으로, `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 예제 GitHub의 [병렬 시뮬레이션 노트북](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 콘솔](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)를 참조하세요.