

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

# 하이브리드 작업 사용자 지정
<a name="braket-jobs-customize"></a>

Amazon Braket은 하이브리드 작업 실행 방식을 사용자 지정하여 특정 요구 사항에 맞게 환경을 조정할 수 있는 여러 가지 방법을 제공합니다. 이 섹션에서는 알고리즘 스크립트 환경 정의부터 자체 컨테이너 사용(BYOC)에 이르기까지 하이브리드 작업을 사용자 지정하는 옵션을 살펴봅니다. 하이퍼파라미터를 사용하여 워크플로를 최적화하고 작업 인스턴스를 구성하며 파라메트릭 컴파일을 활용하여 성능을 개선하는 방법을 알아봅니다. 이러한 사용자 지정 기법은 Amazon Braket에서 하이브리드 양자 계산의 잠재력을 극대화하는 데 도움이 됩니다.

**Topics**
+ [알고리즘 스크립트의 환경 정의](braket-jobs-script-environment.md)
+ [하이퍼파라미터 사용](braket-jobs-hyperparameters.md)
+ [하이브리드 작업 인스턴스 구성](braket-jobs-configure-job-instance-for-script.md)
+ [파라메트릭 컴파일을 사용하여 하이브리드 작업 가속화](braket-jobs-parametric-compilation.md)

# 알고리즘 스크립트의 환경 정의
<a name="braket-jobs-script-environment"></a>

Amazon Braket은 알고리즘 스크립트의 컨테이너에서 정의한 환경을 지원합니다.
+ 기본 컨테이너(`image_uri`가 지정되지 않은 경우의 기본값)
+ CUDA-Q가 포함된 컨테이너
+ Tensorflow 및 PennyLane이 포함된 컨테이너
+ PyTorch, PennyLane 및 CUDA-Q가 포함된 컨테이너

다음 표에는 컨테이너와 컨테이너에 포함된 라이브러리에 대한 세부 정보가 나와 있습니다.


**Amazon Braket 컨테이너**  

| Type | 기본 | CUDA-Q | TensorFlow | PyTorch | 
| --- | --- | --- | --- | --- | 
|   **이미지 URI**   |  292282985366.dkr.ecr.us-west-2.amazonaws.com/amazon-braket-base-jobs:latest  |  292282985366.dkr.ecr.us-west-2.amazonaws.com/amazon-braket-cudaq-jobs:latest  |  292282985366.dkr.ecr.us-east-1.amazonaws.com/amazon-braket-tensorflow-jobs:latest  |  292282985366.dkr.ecr.us-west-2.amazonaws.com/amazon-braket-pytorch-jobs:latest  | 
|   **상속된 라이브러리**   |  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/braket/latest/developerguide/braket-jobs-script-environment.html)  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/braket/latest/developerguide/braket-jobs-script-environment.html)  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/braket/latest/developerguide/braket-jobs-script-environment.html)  | 
|   **추가 라이브러리**   |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/braket/latest/developerguide/braket-jobs-script-environment.html)  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/braket/latest/developerguide/braket-jobs-script-environment.html)  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/braket/latest/developerguide/braket-jobs-script-environment.html)  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/braket/latest/developerguide/braket-jobs-script-environment.html)  | 

[aws/amazon-braket-containers](https://github.com/aws/amazon-braket-containers)에서 오픈 소스 컨테이너 정의를 보고 액세스할 수 있습니다. 사용 사례에 가장 적합한 컨테이너를 선택합니다. Braket에서 사용 가능한 AWS 리전(us-east-1, us-west-1, us-west-2, eu-north-1, eu-west-2)을 사용할 수 있지만 컨테이너 리전은 하이브리드 작업의 리전과 일치해야 합니다. 하이브리드 작업을 생성할 때 하이브리드 작업 스크립트의 `create(…​)` 직접 호출에 다음 세 인수 중 하나를 추가하여 컨테이너 이미지를 지정합니다. Amazon Braket 컨테이너는 인터넷 연결이 가능하므로 런타임(시작 또는 런타임 시 비용 발생) 시 선택한 컨테이너에 추가 종속성을 설치할 수 있습니다. 다음 예제는 us-west-2 리전에 대한 것입니다.
+  **기본 이미지:** image\$1uri="292282985366.dkr.ecr.us-west-2.amazonaws.com/amazon-braket-base-jobs:latest"
+  **CUDA-Q 이미지:** image\$1uri="292282985366.dkr.ecr.us-west-2.amazonaws.com/amazon-braket-cudaq-jobs:latest"
+  **Tensorflow 이미지:** image\$1uri="292282985366.dkr.ecr.us-west-2.amazonaws.com/amazon-braket-tensorflow-jobs:latest"
+  **PyTorch 이미지:** image\$1uri="292282985366.dkr.ecr.us-west-2.amazonaws.com/amazon-braket-pytorch-jobs:latest"

Amazon Braket SDK의 `retrieve_image()` 함수를 사용하여 `image-uris`를 검색할 수도 있습니다. 다음 예제에서는 us-west-2에서 검색하는 방법을 보여줍니다 AWS 리전.

```
from braket.jobs.image_uris import retrieve_image, Framework

image_uri_base = retrieve_image(Framework.BASE, "us-west-2")
image_uri_cudaq = retrieve_image(Framework.CUDAQ, "us-west-2")
image_uri_tf = retrieve_image(Framework.PL_TENSORFLOW, "us-west-2")
image_uri_pytorch = retrieve_image(Framework.PL_PYTORCH, "us-west-2")
```

# 자체 컨테이너 사용(Bring Your Own Container, BYOC)
<a name="braket-jobs-byoc"></a>

Amazon Braket Hybrid Jobs는 다양한 환경에서 코드를 실행하기 위해 사전 빌드된 세 개의 컨테이너를 제공합니다. 이러한 컨테이너 중 하나가 사용 사례를 지원하는 경우 하이브리드 작업을 생성할 때 알고리즘 스크립트만 제공하면 됩니다. 사소한 누락 종속성은 `pip`을 사용하여 알고리즘 스크립트 또는 `requirements.txt` 파일에서 추가할 수 있습니다.

이러한 컨테이너 중 사용 사례를 지원하는 컨테이너가 없거나 컨테이너를 확장하려는 경우 Braket Hybrid Jobs는 자체 사용자 지정 Docker 컨테이너 이미지로 하이브리드 작업을 실행하거나 자체 컨테이너를 사용(BYOC)할 수 있도록 지원합니다. 사용 사례에 적합한 기능인지 확인하세요.

**Topics**
+ [자체 컨테이너 사용이 올바른 결정인 시기는 언제인가요?](#bring-own-container-decision)
+ [자체 컨테이너 사용 방법](bring-own-container-recipe.md)
+ [자체 컨테이너에서 Braket 하이브리드 작업 실행](running-hybrid-jobs-in-own-container.md)

## 자체 컨테이너 사용이 올바른 결정인 시기는 언제인가요?
<a name="bring-own-container-decision"></a>

Braket Hybrid Jobs에서 자체 컨테이너를 사용(BYOC)하면 자체 소프트웨어를 패키지 환경에 설치하여 유연하게 사용할 수 있습니다. 특정 요구 사항에 따라, 전체 BYOC Docker 빌드 - Amazon ECR 업로드 - 사용자 지정 이미지 URI 주기를 거치지 않고도 동일한 유연성을 달성할 수 있는 방법이 있을 수 있습니다.

**참고**  
공개적으로 사용할 수 있는 소수의 추가 Python 패키지(일반적으로 10개 미만)를 추가하려는 경우 BYOC가 적합하지 않을 수 있습니다. 예를 들어 PyPi를 사용하는 경우입니다.

이 경우 사전 빌드된 Braket 이미지 중 하나를 사용한 다음, 작업 제출 시 소스 디렉터리에 `requirements.txt` 파일을 포함할 수 있습니다. 파일은 자동으로 읽히며 `pip`는 지정된 버전이 포함된 패키지를 정상적으로 설치합니다. 많은 수의 패키지를 설치하는 경우 해당 작업의 런타임이 크게 증가할 수 있습니다. 사용하려는 사전 빌드된 컨테이너의 Python 버전과 CUDA 버전(해당하는 경우)을 확인하여 소프트웨어가 작동하는지 테스트합니다.

작업 스크립트에 비Python 언어(예: C\$1\$1 또는 Rust)를 사용하거나 Braket 사전 빌드 컨테이너를 통해 제공되지 않는 Python 버전을 사용하려는 경우 BYOC가 필요합니다. 이는 다음과 같은 경우에도 좋은 선택입니다.
+ 라이선스 키와 함께 소프트웨어를 사용 중이며 소프트웨어를 실행하려면 라이선스 서버에 대해 해당 키를 인증해야 합니다. BYOC를 사용하면 Docker 이미지에 라이선스 키를 임베드하고 이를 인증하는 코드를 포함할 수 있습니다.
+ 공개적으로 사용할 수 없는 소프트웨어를 사용하고 있습니다. 예를 들어, 소프트웨어가 특정 SSH 키가 있어야 액세스할 수 있는 비공개 GitLab 또는 GitHub 리포지토리에 호스팅되는 경우입니다.
+ Braket 제공 컨테이너에 패키징되지 않은 대규모 소프트웨어 제품군을 설치해야 합니다. BYOC를 사용하면 소프트웨어 설치로 인해 하이브리드 작업 컨테이너의 시작 시간이 길어지는 문제를 해결할 수 있습니다.

또한 BYOC를 사용하면 소프트웨어로 Docker 컨테이너를 빌드하여 사용자에게 제공함으로써 고객이 사용자 지정 SDK 또는 알고리즘을 사용하도록 할 수 있습니다. Amazon ECR에서 적절한 권한을 설정하여 이 작업을 수행할 수 있습니다.

**참고**  
해당하는 모든 소프트웨어 라이선스를 준수해야 합니다.

# 자체 컨테이너 사용 방법
<a name="bring-own-container-recipe"></a>

이 섹션에서는 Braket Hybrid Jobs에 bring your own container (BYOC)를 적용하는 데 필요한 사항, 즉 스크립트, 파일 및 이를 결합하여 사용자 지정 Docker 이미지를 시작하고 실행하는 단계에 대한 단계별 가이드를 제공합니다. 두 가지 일반적인 사례에 대한 방법:

1. Docker 이미지에 추가 소프트웨어를 설치하고 해당 작업에 Python 알고리즘 스크립트만 사용합니다.

1. 하이브리드 작업 또는 x86 이외의 CPU 아키텍처와 함께 비Python 언어로 작성된 알고리즘 스크립트를 사용합니다.

*컨테이너 항목 스크립트* 정의는 두 번째 사례에서 더 복잡합니다.

Braket은 하이브리드 작업을 실행할 때 요청된 수와 유형의 Amazon EC2 인스턴스를 시작한 다음, 이미지 URI 입력으로 지정된 Docker 이미지를 실행하여 해당 인스턴스에서 작업을 생성합니다. BYOC 기능을 사용할 때는 읽기 액세스 권한이 있는 [비공개 Amazon ECR 리포지토리](https://docs.aws.amazon.com/AmazonECR/latest/userguide/Repositories.html)에 호스팅된 이미지 URI를 지정합니다. Braket Hybrid Jobs는 해당 사용자 지정 이미지를 사용하여 작업을 실행합니다.

하이브리드 작업과 함께 사용할 수 있는 Docker 이미지를 빌드하는 데 필요한 특정 구성 요소입니다. `Dockerfiles` 작성 및 빌드에 익숙하지 않은 경우 [Dockerfile 설명서](https://docs.docker.com/reference/dockerfile/) 및 [Amazon ECR CLI 설명서](https://docs.aws.amazon.com/AmazonECR/latest/userguide/getting-started-cli.html)를 참조하세요.

**Topics**
+ [Dockerfile의 기본 이미지](#base-image-dockerfile)
+ [(선택 사항) 수정된 컨테이너 진입점 스크립트](#modified-container-entry-point)
+ [`Dockerfile`을 사용하여 필요한 소프트웨어 및 컨테이너 스크립트 설치](#install-docketfile)

## Dockerfile의 기본 이미지
<a name="base-image-dockerfile"></a>

Python을 사용 중이고 Braket 제공 컨테이너에 제공된 것 외에도 추가로 소프트웨어를 설치하려는 경우, 기본 이미지에 대한 옵션은 [GitHub 리포지토리](https://github.com/amazon-braket/amazon-braket-containers)와 Amazon ECR에 호스팅된 Braket 컨테이너 이미지 중 하나입니다. 이미지를 가져와 이를 기반으로 빌드하려면 [Amazon ECR에 인증](https://docs.aws.amazon.com/AmazonECR/latest/userguide/getting-started-cli.html#cli-authenticate-registry)해야 합니다. 예를 들어 BYOC Docker 파일의 첫 번째 줄은 다음과 같을 수 있습니다. `FROM [IMAGE_URI_HERE]` 

다음으로, Dockerfile의 나머지 부분을 채워 컨테이너에 추가하려는 소프트웨어를 설치하고 설정합니다. 사전 빌드된 Braket 이미지에는 이미 적절한 컨테이너 진입점 스크립트가 포함되어 있으므로 이를 포함하는 것에 대해 걱정할 필요가 없습니다.

C\$1\$1, Rust 또는 Julia와 같은 비Python 언어를 사용하거나 ARM과 같은 비x86 CPU 아키텍처용 이미지를 빌드하려는 경우 기본 공개 이미지를 기반으로 빌드해야 할 수 있습니다. 이러한 이미지는 [Amazon Elastic Container Registry Public Gallery](https://gallery.ecr.aws/)에서 찾을 수 있습니다. CPU 아키텍처에 적합한 아키텍처와 필요시 사용하려는 GPU를 선택해야 합니다.

## (선택 사항) 수정된 컨테이너 진입점 스크립트
<a name="modified-container-entry-point"></a>

**참고**  
사전 빌드된 Braket 이미지에 추가 소프트웨어만 추가하는 경우 이 섹션을 건너뛸 수 있습니다.

하이브리드 작업의 일부로 비Python 코드를 실행하려면 컨테이너 진입점을 정의하는 Python 스크립트를 수정합니다. 예를 들면, [`braket_container.py` Amazon Braket Github의 python 스크립트](https://github.com/amazon-braket/amazon-braket-containers/blob/main/src/braket_container.py)입니다. 이는 Braket이 사전 빌드한 이미지가 알고리즘 스크립트를 실행하고 적절한 환경 변수를 설정하는 데 사용하는 스크립트입니다. 컨테이너 진입점 스크립트 자체는 Python으로 작성**되어야** 하지만, 비Python 스크립트를 실행할 수 있습니다. 사전 빌드된 예제에서 볼 수 있듯이, Python 알고리즘 스크립트는 [Python 하위 프로세스](https://github.com/amazon-braket/amazon-braket-containers/blob/main/src/braket_container.py#L274) 또는 [완전히 새로운 프로세스](https://github.com/amazon-braket/amazon-braket-containers/blob/main/src/braket_container.py#L257)로 실행됩니다. 이 논리를 수정하면 진입점 스크립트가 비Python 알고리즘 스크립트를 실행하도록 할 수 있습니다. 예를 들어, 파일 확장자 끝에 따라 Rust 프로세스를 실행하도록 [https://github.com/amazon-braket/amazon-braket-containers/blob/main/src/braket_container.py#L139](https://github.com/amazon-braket/amazon-braket-containers/blob/main/src/braket_container.py#L139) 함수를 수정할 수 있습니다.

완전히 새로운 `braket_container.py`를 작성하도록 선택할 수도 있습니다. 입력 데이터, 소스 아카이브 및 기타 필요한 파일을 Amazon S3에서 컨테이너로 복사하고 적절한 환경 변수를 정의해야 합니다.

## `Dockerfile`을 사용하여 필요한 소프트웨어 및 컨테이너 스크립트 설치
<a name="install-docketfile"></a>

**참고**  
사전 빌드된 Braket 이미지를 Docker 기본 이미지로 사용하는 경우 컨테이너 스크립트가 이미 있습니다.

이전 단계에서 수정된 컨테이너 스크립트를 생성한 경우 컨테이너에 이를 복사**하고** 환경 변수 `SAGEMAKER_PROGRAM`을 `braket_container.py`로 정의하거나 새 컨테이너 진입점 스크립트에 지정한 이름으로 정의해야 합니다.

다음은 GPU 가속 작업 인스턴스에서 Julia를 사용할 수 있게 하는 `Dockerfile`의 예제입니다.

```
FROM nvidia/cuda:12.2.0-devel-ubuntu22.04

    
 ARG DEBIAN_FRONTEND=noninteractive
 ARG JULIA_RELEASE=1.8
 ARG JULIA_VERSION=1.8.3


 ARG PYTHON=python3.11 
 ARG PYTHON_PIP=python3-pip
 ARG PIP=pip


 ARG JULIA_URL = https://julialang-s3.julialang.org/bin/linux/x64/${JULIA_RELEASE}/
 ARG TAR_NAME = julia-${JULIA_VERSION}-linux-x86_64.tar.gz


 ARG PYTHON_PKGS = # list your Python packages and versions here


 RUN curl -s -L ${JULIA_URL}/${TAR_NAME} | tar -C /usr/local -x -z --strip-components=1 -f -


 RUN apt-get update \

    && apt-get install -y --no-install-recommends \

    build-essential \

    tzdata \

    openssh-client \

    openssh-server \

    ca-certificates \

    curl \

    git \

    libtemplate-perl \

    libssl1.1 \

    openssl \

    unzip \ 

    wget \

    zlib1g-dev \

    ${PYTHON_PIP} \

    ${PYTHON}-dev \




 RUN ${PIP} install --no-cache --upgrade ${PYTHON_PKGS}


 RUN ${PIP} install --no-cache --upgrade sagemaker-training==4.1.3


 # Add EFA and SMDDP to LD library path
 ENV LD_LIBRARY_PATH="/opt/conda/lib/python${PYTHON_SHORT_VERSION}/site-packages/smdistributed/dataparallel/lib:$LD_LIBRARY_PATH"
 ENV LD_LIBRARY_PATH=/opt/amazon/efa/lib/:$LD_LIBRARY_PATH


 # Julia specific installation instructions
 COPY Project.toml /usr/local/share/julia/environments/v${JULIA_RELEASE}/
 RUN JULIA_DEPOT_PATH=/usr/local/share/julia \

    julia -e 'using Pkg; Pkg.instantiate(); Pkg.API.precompile()'
 # generate the device runtime library for all known and supported devices
 RUN JULIA_DEPOT_PATH=/usr/local/share/julia \

    julia -e 'using CUDA; CUDA.precompile_runtime()'


 # Open source compliance scripts
 RUN HOME_DIR=/root \

 && curl -o ${HOME_DIR}/oss_compliance.zip https://aws-dlinfra-utilities.s3.amazonaws.com/oss_compliance.zip \

 && unzip ${HOME_DIR}/oss_compliance.zip -d ${HOME_DIR}/ \

 && cp ${HOME_DIR}/oss_compliance/test/testOSSCompliance /usr/local/bin/testOSSCompliance \

 && chmod +x /usr/local/bin/testOSSCompliance \

 && chmod +x ${HOME_DIR}/oss_compliance/generate_oss_compliance.sh \

 && ${HOME_DIR}/oss_compliance/generate_oss_compliance.sh ${HOME_DIR} ${PYTHON} \

 && rm -rf ${HOME_DIR}/oss_compliance*


 # Copying the container entry point script
 COPY braket_container.py /opt/ml/code/braket_container.py
 ENV SAGEMAKER_PROGRAM braket_container.py
```

이 예제에서는 모든 관련 오픈 소스 라이선스를 준수하기 AWS 위해에서 제공하는 스크립트를 다운로드하고 실행합니다. 예를 들어, MIT license에 의해 관리되는 모든 설치된 코드를 적절하게 속성화합니다.

비공개 코드(예: 비공개 GitHub 또는 GitLab 리포지토리에 호스팅된 코드)를 포함해야 하는 경우, 해당 코드에 액세스하기 위해 SSH 키를 Docker 이미지에 임베드하지 **마세요**. 대신, 빌드할 때 Docker Compose를 사용하여 Docker가 빌드된 호스트 시스템에서 SSH에 액세스할 수 있도록 허용합니다. 자세한 내용은 [비공개 GitHub 리포지토리에 액세스하기 위해 Docker에서 SSH 키를 안전하게 사용하는 방법](https://www.fastruby.io/blog/docker/docker-ssh-keys.html) 가이드를 참조하세요.

**Docker 이미지 빌드 및 업로드**

`Dockerfile`이 올바르게 정의되었으므로, 이제 다음 단계에 따라 [비공개 Amazon ECR 리포지토리를 생성](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-create.html)할 준비가 되었습니다(아직 없는 경우). 컨테이너 이미지를 빌드하고 태그를 지정하여 리포지토리에 업로드할 수도 있습니다.

이미지를 빌드, 태그 지정 및 푸시할 준비가 되었습니다. `docker build`에 대한 옵션의 자세한 설명과 몇 가지 예제는 [Docker 빌드 설명서](https://docs.docker.com/reference/cli/docker/buildx/build/)를 참조하세요.

위에 정의된 샘플 파일의 경우 다음을 실행할 수 있습니다.

```
aws ecr get-login-password --region ${your_region} | docker login --username AWS --password-stdin ${aws_account_id}.dkr.ecr.${your_region}.amazonaws.com
 docker build -t braket-julia .
 docker tag braket-julia:latest ${aws_account_id}.dkr.ecr.${your_region}.amazonaws.com/braket-julia:latest
 docker push ${aws_account_id}.dkr.ecr.${your_region}.amazonaws.com/braket-julia:latest
```

**적절한 Amazon ECR 권한 할당**

Braket Hybrid Jobs Docker 이미지는 비공개 Amazon ECR 리포지토리에 호스팅되어야 합니다. 기본적으로 비공개 Amazon ECR 리포지토리는 Braket Hybrid Jobs IAM role 또는 공동 작업자나 학생 등 해당 이미지를 사용하려는 다른 사용자에게 읽기 액세스 권한을 제공하지 **않습니다**. 적절한 권한을 부여하려면 [리포지토리 정책을 설정](https://docs.aws.amazon.com/AmazonECR/latest/userguide/set-repository-policy.html)해야 합니다. 일반적으로, 이미지에 액세스하려는 특정 사용자와 IAM 역할에만 권한을 부여하고, image URI를 가진 사람 누구나 이미지를 가져오는 것을 허용하지 마세요.

# 자체 컨테이너에서 Braket 하이브리드 작업 실행
<a name="running-hybrid-jobs-in-own-container"></a>

자체 컨테이너로 하이브리드 작업을 생성하려면 지정된 인수 `image_uri`로 `AwsQuantumJob.create()`를 직접적으로 호출합니다. QPU, 온디맨드 시뮬레이터를 사용하거나 Braket Hybrid Jobs에서 사용할 수 있는 고전 프로세서에서 로컬로 코드를 실행할 수 있습니다. 실제 QPU에서 실행하기 전에 SV1, DM1 또는 TN1과 같은 시뮬레이터에서 코드를 테스트하는 것이 좋습니다.

고전 프로세서에서 코드를 실행하려면 `InstanceConfig`를 업데이트하여 사용하는 `instanceType` 및 `instanceCount`를 지정합니다. `instance_count` > 1을 지정하는 경우 코드가 여러 호스트에서 실행될 수 있는지 확인해야 합니다. 선택할 수 있는 인스턴스 수의 상한은 5입니다. 예제:

```
job = AwsQuantumJob.create(
    source_module="source_dir",
    entry_point="source_dir.algorithm_script:start_here",
    image_uri="111122223333.dkr.ecr.us-west-2.amazonaws.com/my-byoc-container:latest",
    instance_config=InstanceConfig(instanceType="ml.g4dn.xlarge", instanceCount=3),
    device="local:braket/braket.local.qubit",
    # ...)
```

**참고**  
디바이스 ARN을 사용하여 하이브리드 작업 메타데이터로 사용한 시뮬레이터를 추적합니다. 허용되는 값은 형식 `device = "local:<provider>/<simulator_name>"`을 따라야 합니다. `<provider>` 및 `<simulator_name>`은 문자, 숫자, `_`, `-`, `.`으로만 구성되어야 합니다. 문자열은 256자로 제한됩니다.  
BYOC를 사용할 계획이고 Braket SDK를 사용하여 양자 작업을 생성하지 않는 경우 환경 변수 `AMZN_BRAKET_JOB_TOKEN`의 값을 `CreateQuantumTask` 요청의 `jobToken` 파라미터에 전달해야 합니다. 그렇지 않으면 양자 작업에 우선순위가 부여되지 않으며 일반 독립 실행형 양자 작업으로 청구됩니다.

# 하이퍼파라미터 사용
<a name="braket-jobs-hyperparameters"></a>

하이브리드 작업을 생성할 때 학습률 또는 단계 크기와 같이 알고리즘에 필요한 하이퍼파라미터를 정의할 수 있습니다. 하이퍼파라미터 값은 일반적으로 알고리즘의 다양한 측면을 제어하는 데 사용되며 알고리즘의 성능을 최적화하기 위해 조정되는 경우가 많습니다. Braket 하이브리드 작업에서 하이퍼파라미터를 사용하려면 이름과 값을 딕셔너리로 명시적으로 지정해야 합니다. 최적의 값 집합을 검색할 때 테스트할 하이퍼파라미터 값을 지정합니다. 하이퍼파라미터를 사용하기 위한 첫 번째 단계는 하이퍼파라미터를 딕셔너리로 설정하고 정의하는 것이며, 이는 다음 코드에서 확인할 수 있습니다.

```
from braket.devices import Devices

device_arn = Devices.Amazon.SV1

hyperparameters = {"shots": 1_000}
```

그런 다음 위에 제공된 코드 조각에 정의된 하이퍼파라미터를 전달하여 원하는 알고리즘에 사용합니다. 다음 코드 예제를 실행하려면 하이퍼파라미터 파일과 동일한 경로에 “src”라는 디렉터리를 생성합니다. "src" 디렉터리 내에 [0\$1Getting\$1started\$1papermill.ipynb](https://github.com/amazon-braket/amazon-braket-examples/blob/main/examples/hybrid_jobs/7_Running_notebooks_as_hybrid_jobs/src/0_Getting_started_papermill.ipynb), [notebook\$1runner.py](https://github.com/amazon-braket/amazon-braket-examples/blob/main/examples/hybrid_jobs/7_Running_notebooks_as_hybrid_jobs/src/notebook_runner.py) 및 [requirements.txt](https://github.com/amazon-braket/amazon-braket-examples/blob/main/examples/hybrid_jobs/7_Running_notebooks_as_hybrid_jobs/src/requirements.txt) 코드 파일을 추가합니다.

```
import time
from braket.aws import AwsQuantumJob

job = AwsQuantumJob.create(
    device=device_arn,
    source_module="src",
    entry_point="src.notebook_runner:run_notebook",
    input_data="src/0_Getting_started_papermill.ipynb",
    hyperparameters=hyperparameters,
    job_name=f"papermill-job-demo-{int(time.time())}",
)

# Print job to record the ARN
print(job)
```

하이브리드 작업 스크립트 *내에서* 하이퍼파라미터에 액세스하려면 [notebook\$1runner.py](https://github.com/amazon-braket/amazon-braket-examples/blob/main/examples/hybrid_jobs/7_Running_notebooks_as_hybrid_jobs/src/notebook_runner.py) python 파일의 `load_jobs_hyperparams()` 함수를 참조하세요. 하이브리드 작업 스크립트 *외부*에서 하이퍼파라미터에 액세스하려면 다음 코드를 실행합니다.

```
from braket.aws import AwsQuantumJob

# Get the job using the ARN
job_arn = "arn:aws:braket:us-east-1:111122223333:job/5eabb790-d3ff-47cc-98ed-b4025e9e296f"  # Replace with your job ARN
job = AwsQuantumJob(arn=job_arn)

# Access the hyperparameters
job_metadata = job.metadata()
hyperparameters = job_metadata.get("hyperParameters", {})
print(hyperparameters)
```

하이퍼파라미터 사용 방법에 대한 자세한 내용은 [Amazon Braket Hybrid Jobs와 PennyLane을 활용한 QAOA](https://github.com/amazon-braket/amazon-braket-examples/blob/main/examples/hybrid_jobs/2_Using_PennyLane_with_Braket_Hybrid_Jobs/Using_PennyLane_with_Braket_Hybrid_Jobs.ipynb) 및 [Amazon Braket Hybrid Jobs에서의 양자 기계 학습](https://github.com/amazon-braket/amazon-braket-examples/blob/main/examples/hybrid_jobs/1_Quantum_machine_learning_in_Amazon_Braket_Hybrid_Jobs/Quantum_machine_learning_in_Amazon_Braket_Hybrid_Jobs.ipynb) 자습서를 참조하세요.

# 하이브리드 작업 인스턴스 구성
<a name="braket-jobs-configure-job-instance-for-script"></a>

알고리즘에 따라 요구 사항이 다를 수 있습니다. 기본적으로 Amazon Braket은 `ml.m5.large` 인스턴스에서 알고리즘 스크립트를 실행합니다. 그러나 다음 가져오기 및 구성 인수를 사용하여 하이브리드 작업을 생성할 때 이 인스턴스 유형을 사용자 지정할 수 있습니다.

```
from braket.jobs.config import InstanceConfig

job = AwsQuantumJob.create(
    ...
    instance_config=InstanceConfig(instanceType="ml.g4dn.xlarge"), # Use NVIDIA T4 instance with 4 GPUs.
    ...
    ),
```

임베디드 시뮬레이션을 실행 중이고 디바이스 구성에서 로컬 디바이스를 지정한 경우, `instanceCount`를 지정하고 둘 이상으로 설정하여 `InstanceConfig`에서 둘 이상의 인스턴스를 추가로 요청할 수 있습니다. 상한은 5입니다. 예를 들어 다음과 같이 인스턴스 3개를 선택할 수 있습니다.

```
from braket.jobs.config import InstanceConfig
job = AwsQuantumJob.create(
    ...
    instance_config=InstanceConfig(instanceType="ml.g4dn.xlarge", instanceCount=3), # Use 3 NVIDIA T4 instances
    ...
    ),
```

여러 인스턴스를 사용하는 경우 데이터 병렬 기능을 사용하여 하이브리드 작업을 배포하는 것이 좋습니다. 이 [QML을 위한 병렬화 훈련](https://github.com/amazon-braket/amazon-braket-examples/blob/main/examples/hybrid_jobs/5_Parallelize_training_for_QML/Parallelize_training_for_QML.ipynb) 예제를 확인하는 방법에 대한 자세한 내용은 다음 예제 노트북을 참조하세요.

다음 세 개의 표에는 표준, 고성능 및 GPU 가속 인스턴스에 사용할 수 있는 인스턴스 유형과 사양이 나와 있습니다.

**참고**  
하이브리드 작업에 대한 기본 고전 컴퓨팅 인스턴스 할당량을 보려면 [Amazon Braket 할당량](braket-quotas.md) 페이지를 참조하세요.


| 표준 인스턴스 | vCPU | 메모리(GiB) | 
| --- | --- | --- | 
|  ml.m5.large(기본값)  |  4  |  16  | 
|  ml.m5.xlarge  |  4  |  16  | 
|  ml.m5.2xlarge  |  8  |  32  | 
|  ml.m5.4xlarge  |  16  |  64  | 
|  ml.m5.12xlarge  |  48  |  192  | 
|  ml.m5.24xlarge  |  96  |  384  | 


| 고성능 인스턴스 | vCPU | 메모리(GiB) | 
| --- | --- | --- | 
|  ml.c5.xlarge  |  4  |  8  | 
|  ml.c5.2xlarge  |  8  |  16  | 
|  ml.c5.4xlarge  |  16  |  32  | 
|  ml.c5.9xlarge  |  36  |  72  | 
|  ml.c5.18xlarge  |  72  |  144  | 
|  ml.c5n.xlarge  |  4  |  10.5  | 
|  ml.c5n.2xlarge  |  8  |  21  | 
|  ml.c5n.4xlarge  |  16  |  32  | 
|  ml.c5n.9xlarge  |  36  |  72  | 
|  ml.c5n.18xlarge  |  72  |  192  | 


| GPU 가속 인스턴스 | GPU | vCPU | 메모리(GiB) | GPU 메모리(GiB) | 
| --- | --- | --- | --- | --- | 
|  ml.p4d.24xlarge  |  8  |  96  |  1152  |  320  | 
|  ml.g4dn.xlarge  |  1  |  4  |  16  |  16  | 
|  ml.g4dn.2xlarge  |  1  |  8  |  32  |  16  | 
|  ml.g4dn.4xlarge  |  1  |  16  |  64  |  16  | 
|  ml.g4dn.8xlarge  |  1  |  32  |  128  |  16  | 
|  ml.g4dn.12xlarge  |  4  |  48  |  192  |  64  | 
|  ml.g4dn.16xlarge  |  1  |  64  |  256  |  16  | 

각 인스턴스는 30GB의 기본 데이터 스토리지(SSD) 구성을 사용합니다. 그러나 `instanceType`을 구성하는 것과 동일한 방식으로 스토리지를 조정할 수 있습니다. 다음 예제에서는 총 스토리지를 50GB로 늘리는 방법을 보여줍니다.

```
from braket.jobs.config import InstanceConfig

job = AwsQuantumJob.create(
    ...
    instance_config=InstanceConfig(
        instanceType="ml.g4dn.xlarge",
        volumeSizeInGb=50,
    ),
    ...
    ),
```

## `AwsSession`에서 기본 버킷 구성
<a name="braket-jobs-configure-default-bucket"></a>

자체 `AwsSession` 인스턴스를 활용하면 기본 Amazon S3 버킷의 사용자 지정 위치를 지정하는 등 향상된 유연성을 누릴 수 있습니다. 기본적으로 `AwsSession`에는 `"amazon-braket-{id}-{region}"`의 사전 구성된 Amazon S3 버킷 위치가 있습니다. 그러나 `AwsSession`을 생성할 때 기본 Amazon S3 버킷 위치를 재정의할 수 있는 옵션이 있습니다. 다음 코드 예제에서 볼 수 있듯이, 사용자는 `aws_session` 파라미터를 제공하여 선택적으로 `AwsSession` 객체를 `AwsQuantumJob.create()` 메서드로 전달할 수 있습니다.

```
aws_session = AwsSession(default_bucket="amazon-braket-s3-demo-bucket")

# Then you can use that AwsSession when creating a hybrid job
job = AwsQuantumJob.create(
    ...
    aws_session=aws_session
)
```

# 파라메트릭 컴파일을 사용하여 하이브리드 작업 가속화
<a name="braket-jobs-parametric-compilation"></a>

 Amazon Braket은 특정 QPU에서 파라메트릭 컴파일을 지원합니다. 따라서 하이브리드 알고리즘의 모든 반복에 대해 회로를 한 번만 컴파일하여 계산 비용이 많이 드는 컴파일 단계와 관련된 오버헤드를 줄일 수 있습니다. 각 단계에서 회로를 다시 컴파일할 필요가 없으므로 하이브리드 작업의 런타임이 크게 향상됩니다. 파라미터화된 회로를 Braket Hybrid Job으로 지원되는 QPU 중 하나에 제출하기만 하면 됩니다. 장기 실행 하이브리드 작업의 경우, Braket은 회로를 컴파일할 때 하드웨어 공급자의 업데이트된 보정 데이터를 자동으로 사용하여 최고 품질의 결과를 보장합니다.

파라메트릭 회로를 생성하려면 먼저 알고리즘 스크립트에 파라미터를 입력으로 제공해야 합니다. 이 예제에서는 작은 파라미터 회로를 사용하고 각 반복 사이의 모든 고전적 처리를 무시합니다. 일반적인 워크로드의 경우 여러 회로를 일괄적으로 제출하고 각 반복에서 파라미터를 업데이트하는 등의 고전적 처리를 수행합니다.

```
import os

from braket.aws import AwsDevice
from braket.circuits import Circuit, FreeParameter

def start_here():

    print("Test job started.")

    # Use the device declared in the job script
    device = AwsDevice(os.environ["AMZN_BRAKET_DEVICE_ARN"])

    circuit = Circuit().rx(0, FreeParameter("theta"))
    parameter_list = [0.1, 0.2, 0.3]
    
    for parameter in parameter_list:
        result = device.run(circuit, shots=1000, inputs={"theta": parameter})

    print("Test job completed.")
```

다음 작업 스크립트를 사용하여 하이브리드 작업으로 실행할 알고리즘 스크립트를 제출할 수 있습니다. 파라메트릭 컴파일을 지원하는 QPU에서 하이브리드 작업을 실행할 때 회로는 첫 번째 실행 시에만 컴파일됩니다. 다음 실행에서는 컴파일된 회로가 재사용되므로 추가 코드 줄 없이 하이브리드 작업의 런타임 성능이 향상됩니다.

```
from braket.aws import AwsQuantumJob

job = AwsQuantumJob.create(
    device=device_arn,
    source_module="algorithm_script.py",
)
```

**참고**  
파라메트릭 컴파일은 펄스 레벨 프로그램을 제외한 Rigetti Computing의 모든 초전도 게이트 기반 QPU에서 지원됩니다.