자체 컨테이너 가져오기 (BYOC) - Amazon Braket

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

자체 컨테이너 가져오기 (BYOC)

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

이러한 컨테이너 중 사용 사례를 지원하는 컨테이너가 없거나 해당 컨테이너를 확장하려는 경우 Braket Hybrid Jobs는 자체 사용자 지정 Docker 컨테이너 이미지 또는 BYOC (Bring Your Own Container) 를 사용하여 하이브리드 작업을 실행할 수 있도록 지원합니다. 하지만 본격적으로 살펴보기 전에 이 기능이 실제로 사용 사례에 적합한 기능인지 확인해 보겠습니다.

자체 컨테이너를 가져오는 것이 언제 올바른 결정일까요?

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

참고

공개적으로 사용할 수 있는 소수의 추가 Python 패키지 (일반적으로 10개 미만) 를 추가하려는 경우 BYOC가 올바른 선택이 아닐 수 있습니다. 를 사용하는 경우를 예로 들 수 있습니다. PyPi

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

BYOC는 작업 스크립트에 파이썬이 아닌 언어 (예: C++ 또는 Rust) 를 사용하거나 Braket의 사전 빌드된 컨테이너를 통해 사용할 수 없는 Python 버전을 사용하려는 경우에 필요합니다. 다음과 같은 경우에도 좋은 선택입니다.

  • 라이선스 키가 있는 소프트웨어를 사용하고 있는데 소프트웨어를 실행하려면 라이선스 서버에 대해 해당 키를 인증해야 합니다. BYOC를 사용하면 Docker 이미지에 라이센스 키를 포함하고 인증 코드를 포함할 수 있습니다.

  • 공개되지 않은 소프트웨어를 사용하고 있습니다. 예를 들어, 액세스하려면 특정 SSH 키가 필요한 사설 GitLab 또는 GitHub 저장소에서 소프트웨어가 호스팅됩니다.

  • Braket에서 제공하는 컨테이너에 패키지되지 않은 대규모 소프트웨어 제품군을 설치해야 합니다. BYOC를 사용하면 소프트웨어 설치로 인한 하이브리드 작업 컨테이너의 긴 시작 시간을 없앨 수 있습니다.

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

참고

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

자체 컨테이너 반입 레시피

이 섹션에서는 Braket Hybrid Jobs에 bring your own container (BYOC) 필요한 사항에 대한 step-by-step 가이드를 제공합니다. 즉, 사용자 지정 Docker 이미지를 시작하고 실행하기 위해 이를 결합하는 스크립트, 파일 및 단계를 설명합니다. 다음과 같은 두 가지 일반적인 경우에 대한 레시피를 제공합니다.

  1. Docker이미지에 추가 소프트웨어를 설치하고 작업에는 Python 알고리즘 스크립트만 사용하십시오.

  2. 하이브리드 작업에서는 Python이 아닌 언어로 작성된 알고리즘 스크립트 또는 x86 이외의 CPU 아키텍처를 사용하십시오.

케이스 2의 경우 컨테이너 입력 스크립트를 정의하는 것이 더 복잡합니다.

Braket은 하이브리드 작업을 실행할 때 요청된 개수와 유형의 Amazon EC2 인스턴스를 시작한 다음 이미지 URI 입력으로 지정된 이미지를 Docker 실행하여 해당 인스턴스에서 작업을 생성합니다. BYOC 기능을 사용할 때는 읽기 액세스 권한이 있는 프라이빗 Amazon ECR 리포지토리에 호스팅되는 이미지 URI를 지정합니다. Braket Hybrid Jobs는 해당 사용자 지정 이미지를 사용하여 작업을 실행합니다.

하이브리드 작업과 함께 사용할 수 있는 Docker 이미지를 만드는 데 필요한 특정 구성 요소. 작성 및 Dockerfiles 빌드에 익숙하지 않은 경우 이 지침을 읽는 동안 필요에 따라 Dockerfile 설명서 및 Amazon ECR CLI설명서를 참조하는 것이 좋습니다.

Dockerfile의 기본 이미지

Python을 사용하고 Braket에서 제공하는 컨테이너 위에 소프트웨어를 설치하려는 경우 기본 이미지 옵션은 GitHub 리포지토리와 Amazon ECR에서 호스팅되는 Braket 컨테이너 이미지 중 하나입니다. 이미지를 가져와서 그 위에 빌드하려면 Amazon ECR에 인증해야 합니다. 예를 들어 BYOC Docker 파일의 첫 번째 줄은 다음과 같을 수 있습니다. FROM [IMAGE_URI_HERE]

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

C++, Rust 또는 Julia와 같은 비Python 언어를 사용하거나 ARM과 같이 x86이 아닌 CPU 아키텍처용 이미지를 빌드하려는 경우 베어본 공개 이미지를 기반으로 빌드해야 할 수 있습니다. Amazon Elastic 컨테이너 레지스트리 공개 갤러리에서 이러한 이미지를 많이 찾을 수 있습니다. CPU 아키텍처에 적합한 것을 선택하고 필요한 경우 사용하려는 GPU를 선택하십시오.

(선택 사항) 수정된 컨테이너 진입점 스크립트

참고

사전 빌드된 Braket 이미지에 추가 소프트웨어만 추가하는 경우에는 이 섹션을 건너뛰어도 됩니다.

하이브리드 작업의 일부로 Python이 아닌 코드를 실행하려면 컨테이너 진입점을 정의하는 Python 스크립트를 수정해야 합니다. Amazon Braket braket_container.py Github에 있는 파이썬 스크립트를 예로 들어 보겠습니다. Braket에서 미리 빌드한 이미지가 알고리즘 스크립트를 시작하고 적절한 환경 변수를 설정하는 데 사용하는 스크립트입니다. 컨테이너 진입점 스크립트 자체는 Python으로 되어 있어야 하지만 Python이 아닌 스크립트를 시작할 수 있습니다. 사전 빌드된 예제에서 Python 알고리즘 스크립트가 Python 하위 프로세스로 시작되거나 완전히 새로운 프로세스로 실행되는 것을 볼 수 있습니다. 이 로직을 수정하면 엔트리 포인트 스크립트에서 Python이 아닌 알고리즘 스크립트를 실행하도록 할 수 있습니다. 예를 들어, 파일 확장자 끝에 따라 Rust 프로세스를 시작하도록 thekick_off_customer_script()함수를 수정할 수 있습니다.

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

ADockerfile: 필요한 소프트웨어를 모두 설치하고 컨테이너 스크립트를 포함합니다.

참고

미리 빌드된 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 실행하여 모든 관련 오픈 소스 라이선스를 준수하는지 확인합니다. 예를 들어, a에 의해 관리되는 설치된 코드의 출처를 적절하게 지정하는 경우를 들 수 있습니다. MIT license

비공개 코드 (예: 비공개 GitHub 또는 GitLab 리포지토리에서 호스팅되는 코드) 를 포함해야 하는 경우 이미지에 액세스하기 위해 SSH 키를 이미지에 내장하지 마십시오. Docker 대신 Docker Compose 빌드할 때 사용하여 SSH가 구축된 호스트 시스템에서 SSH에 액세스할 수 있도록 Docker 하세요. 자세한 내용은 Docker에서 SSH 키를 안전하게 사용하여 비공개 Github 리포지토리에 액세스하기 가이드를 참조하세요.

이미지 빌드 및 업로드 Docker

이제 적절하게 Dockerfile 정의되었으므로 프라이빗 Amazon ECR 리포지토리가 아직 없는 경우 단계를 따라 프라이빗 Amazon ECR 리포지토리를 생성할 준비가 된 것입니다. 또한 컨테이너 이미지를 빌드하고 태그를 지정하고 리포지토리에 업로드할 수 있습니다.

이제 이미지를 빌드하고 태그를 지정하고 푸시할 준비가 되었습니다. 옵션에 대한 전체 docker build설명과 몇 가지 예는 Docker 빌드 설명서를 참조하십시오.

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

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 또는 학생과 같이 이미지를 사용하려는 다른 사용자에게 읽기 권한을 제공하지 않습니다. 적절한 권한을 부여하려면 리포지토리 정책을 설정해야 합니다. 일반적으로 이미지에 액세스하려는 특정 사용자와 IAM 역할에게만 권한을 부여하십시오. 단, 권한이 있는 사람이 이미지를 image URI 가져오도록 허용하지 마십시오.

자체 컨테이너에서 Braket 하이브리드 작업 실행

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

기존 프로세서에서 코드를 실행하려면 를 업데이트하여 사용하는 instanceTypeinstanceCount 를 지정하십시오. InstanceConfig 참고로 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.p3.8xlarge", 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 값을 전달해야 합니다. jobToken CreateQuantumTask 그렇지 않으면 양자 작업에 우선 순위가 부여되지 않고 일반 독립형 양자 작업으로 요금이 청구됩니다.