자체 컨테이너 사용 방법
이 섹션에서는 Braket Hybrid Jobs에 bring your own container (BYOC)를 적용하는 데 필요한 사항, 즉 스크립트, 파일 및 이를 결합하여 사용자 지정 Docker 이미지를 시작하고 실행하는 단계에 대한 단계별 가이드를 제공합니다. 두 가지 일반적인 사례에 대한 방법:
-
Docker 이미지에 추가 소프트웨어를 설치하고 해당 작업에 Python 알고리즘 스크립트만 사용합니다.
-
하이브리드 작업 또는 x86 이외의 CPU 아키텍처와 함께 비Python 언어로 작성된 알고리즘 스크립트를 사용합니다.
컨테이너 항목 스크립트 정의는 두 번째 사례에서 더 복잡합니다.
Braket은 하이브리드 작업을 실행할 때 요청된 수와 유형의 Amazon EC2 인스턴스를 시작한 다음, 이미지 URI 입력으로 지정된 Docker 이미지를 실행하여 해당 인스턴스에서 작업을 생성합니다. BYOC 기능을 사용할 때는 읽기 액세스 권한이 있는 비공개 Amazon ECR 리포지토리에 호스팅된 이미지 URI를 지정합니다. Braket Hybrid Jobs는 해당 사용자 지정 이미지를 사용하여 작업을 실행합니다.
하이브리드 작업과 함께 사용할 수 있는 Docker 이미지를 빌드하는 데 필요한 특정 구성 요소입니다. Dockerfiles 작성 및 빌드에 익숙하지 않은 경우 Dockerfile 설명서
Dockerfile의 기본 이미지
Python을 사용 중이고 Braket 제공 컨테이너에 제공된 것 외에도 추가로 소프트웨어를 설치하려는 경우, 기본 이미지에 대한 옵션은 GitHub 리포지토리FROM [IMAGE_URI_HERE]
다음으로, Dockerfile의 나머지 부분을 채워 컨테이너에 추가하려는 소프트웨어를 설치하고 설정합니다. 사전 빌드된 Braket 이미지에는 이미 적절한 컨테이너 진입점 스크립트가 포함되어 있으므로 이를 포함하는 것에 대해 걱정할 필요가 없습니다.
C++, Rust 또는 Julia와 같은 비Python 언어를 사용하거나 ARM과 같은 비x86 CPU 아키텍처용 이미지를 빌드하려는 경우 기본 공개 이미지를 기반으로 빌드해야 할 수 있습니다. 이러한 이미지는 Amazon Elastic Container Registry Public Gallery
(선택 사항) 수정된 컨테이너 진입점 스크립트
참고
사전 빌드된 Braket 이미지에 추가 소프트웨어만 추가하는 경우 이 섹션을 건너뛸 수 있습니다.
하이브리드 작업의 일부로 비Python 코드를 실행하려면 컨테이너 진입점을 정의하는 Python 스크립트를 수정합니다. 예를 들면, braket_container.py Amazon Braket Github의 python 스크립트thekick_off_customer_script()
완전히 새로운 braket_container.py를 작성하도록 선택할 수도 있습니다. 입력 데이터, 소스 아카이브 및 기타 필요한 파일을 Amazon S3에서 컨테이너로 복사하고 적절한 환경 변수를 정의해야 합니다.
Dockerfile을 사용하여 필요한 소프트웨어 및 컨테이너 스크립트 설치
참고
사전 빌드된 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 키를 안전하게 사용하는 방법
Docker 이미지 빌드 및 업로드
Dockerfile이 올바르게 정의되었으므로, 이제 다음 단계에 따라 비공개 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를 가진 사람 누구나 이미지를 가져오는 것을 허용하지 마세요.