

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

# 알고리즘 스크립트의 환경 정의
<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` 파라미터에 전달해야 합니다. 그렇지 않으면 양자 작업에 우선순위가 부여되지 않으며 일반 독립 실행형 양자 작업으로 청구됩니다.