本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
自帶容器的配方
在本節中,我們提供step-by-step指南,說明您需要bring your own container (BYOC)執行的 Braket 混合任務:指令碼、檔案和合併這些任務的步驟,以啟動並使用自訂Docker映像執行。我們提供兩種常見案例的配方:
-
在Docker映像中安裝其他軟體,並在任務中僅使用 Python 演算法指令碼。
-
使用非浮水印語言撰寫的演算法指令碼搭配混合任務,或 x86 以外的 CPU 架構。
對於案例 2,定義容器項目指令碼更為複雜。
當 Braket 執行您的混合任務時,它會啟動請求的 Amazon EC2 執行個體數量和類型,然後執行Docker映像 URI 輸入指定的映像,以在其上建立任務。使用 BYOC 功能時,您可以指定在私有 Amazon ECR 儲存庫中託管的映像 URI,而您可以對其進行讀取存取。Braket Hybrid Jobs 使用該自訂映像來執行任務。
建置可與混合任務搭配使用之Docker映像所需的特定元件。如果您不熟悉撰寫和建置 Dockerfiles
,建議您在閱讀這些說明時,視需要參考 Dockerfile 文件
Dockerfile 的基礎映像
如果您使用的是 Python,而且想要在 Braket 提供的容器中提供的軟體上安裝軟體,則基礎映像的選項是其中一個 Braket 容器映像,託管在我們的 GitHub 儲存庫FROM [IMAGE_URI_HERE]
接下來,填寫其餘的 Dockerfile來安裝和設定您要新增至容器的軟體。預先建置的 Braket 映像將已包含適當的容器進入點指令碼,因此您不需要擔心是否包含該項目。
如果您想要使用非 Python 語言,例如 C++、Rust 或 Julia,或者想要為非 x86 CPU 架構建置映像,例如 ARM,您可能需要在裸機公有映像之上建置 。您可以在 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
,或您已命名為新容器進入點指令碼的內容。
以下是Dockerfile
可讓您在 GPU 加速任務執行個體上使用 Julia 的範例:
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 儲存庫中的程式碼,請勿在Docker映像中嵌入 SSH 金鑰來存取它。相反地,當您建置 Docker Compose 時請使用 ,以允許 Docker 存取其建置所在的主機電腦上的 SSH。如需詳細資訊,請參閱 Docker 中的安全使用 SSH 金鑰存取私有 Github 儲存庫
建置和上傳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提取它們。