本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
攜帶自己的容器的食譜
在本節中,我們將提供您需要的 step-by-step 指南 bring your own container (BYOC) 到 Braket 混合作業-腳本,文件和步驟來組合它們,以啟動和運行與您的自定義 Docker 圖像。我們為兩種常見情況提供食譜:
-
安裝其他軟件 Docker 圖像並在您的工作中僅使用 Python 算法腳本。
-
使用以非 Python 語言撰寫的演算法指令碼搭配混合工作,或使用 x86 以外的CPU架構。
對於案例 2,定義容器條目腳本更為複雜。
當 Braket 執行您的混合 Job 務時,它會啟動請求的 Amazon EC2 執行個體數量和類型,然後執行 Docker 由影像URI輸入指定的影像,以便在其上建立工作。使用此BYOC功能時,您可以指定URI託管在私有 Amazon ECR 儲存庫中的映像,您可以對其具有讀取存取權限。Braket 混合作業會使用該自訂映像來執行工作。
您需要構建的特定組件 Docker 可與「混合工作」搭配使用的影像。如果您不熟悉編寫和構建Dockerfiles
,我們建議您參考 Dockerfile 文檔
您的碼頭文件的基本圖像
如果您使用的是 Python,並且希望在 Braket 提供的容器中提供的軟件之上安裝軟件,則基本映像的選項是在我們的GitHub 存儲庫FROM [IMAGE_URI_HERE]
接下來,填寫剩下的 Dockerfile 以安裝並設定要新增至容器的軟體。預先構建的 Braket 映像將已經包含適當的容器入口點腳本,因此您無需擔心包含該腳本。
如果您想使用非 Python 語言,例如 C ++,Rust 或 Julia,或者如果您想為非 x86 CPU 體系結構構建圖像,例如ARM,您可能需要在準系統公共映像之上構建圖像。您可以在 Amazon 彈性容器註冊表公共圖庫
(選擇性) 修改後的容器進入點指令碼
注意
如果您只將其他軟件添加到預先構建的 Braket 映像中,則可以跳過本節。
若要在混合作業中執行非 Python 程式碼,您需要修改定義容器入口點的 Python 指令碼。例如,Amazon Braket Github 上的 braket_container.py
python 腳本thekick_off_customer_script()
您也可以選擇編寫一個全新的braket_container.py
. 它應該將輸入資料、來源存檔和其他必要檔案從 Amazon S3 複製到容器中,並定義適當的環境變數。
安裝所需的軟件和容器腳本 Dockerfile
注意
如果您使用預先構建的 Braket 圖像作為 Docker 基本映像,容器腳本已經存在。
如果您在上一個步驟中建立了修改過的容器指令碼,則需要將其複製到容器中,並將環境變數定義SAGEMAKER_PROGRAM
為braket_container.py
,或者您已命名為新容器入口點指令碼的名稱。
以下是可讓您在GPU加速Dockerfile
的工作執行個體上使用 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 儲存庫中託管的程式碼,請勿將SSH金鑰嵌入 Docker 圖像訪問它。相反,使用 Docker Compose 當你建立允許 Docker SSH在它建立的主機上訪問。有關更多信息,請參閱 Docker 中的安全地使用SSH密鑰訪問私有 Github 存儲庫
建立和上傳您的 Docker 形象
如果定義正確Dockerfile
,您現在可以按照以下步驟建立私有 Amazon ECR 儲存庫 (如果尚未存在)。您也可以建置、標記容器映像檔,並將其上傳至儲存庫。
您已準備好建立、標記和推送映像檔。請參閱 Docker 構建文檔docker 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 或任何其他想要使用您圖像的用戶,例如協作者或學生。您必須設定儲存庫原則,才能授與適當的權限。一般而言,只授予這些特定使用者的權限,IAM 您想要存取影像的角色,而不是允許任何擁有 image URI 拉他們。