攜帶自己的容器的食譜 - Amazon Braket

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

攜帶自己的容器的食譜

在本節中,我們將提供您需要的 step-by-step 指南 bring your own container (BYOC) 到 Braket 混合作業-腳本,文件和步驟來組合它們,以啟動和運行與您的自定義 Docker 圖像。我們為兩種常見情況提供食譜:

  1. 安裝其他軟件 Docker 圖像並在您的工作中僅使用 Python 算法腳本。

  2. 使用以非 Python 語言撰寫的演算法指令碼搭配混合工作,或使用 x86 以外的CPU架構。

對於案例 2,定義容器條目腳本更為複雜。

當 Braket 執行您的混合 Job 務時,它會啟動請求的 Amazon EC2 執行個體數量和類型,然後執行 Docker 由影像URI輸入指定的影像,以便在其上建立工作。使用此BYOC功能時,您可以指定URI託管在私有 Amazon ECR 儲存庫中的映像,您可以對其具有讀取存取權限。Braket 混合作業會使用該自訂映像來執行工作。

您需要構建的特定組件 Docker 可與「混合工作」搭配使用的影像。如果您不熟悉編寫和構建Dockerfiles,我們建議您參考 Dockerfile 文檔Amazon ECR CLI 在閱讀這些說明時根據需要提供文檔。

您的碼頭文件的基本圖像

如果您使用的是 Python,並且希望在 Braket 提供的容器中提供的軟件之上安裝軟件,則基本映像的選項是在我們的GitHub 存儲庫和 Amazon 上託管的 Braket 容器映像之一。ECR您將需要向 Amazon 進行身份驗證ECR才能拉出圖像並在其上構建。例如,您的第一行 BYOC Docker 文件可以是:FROM [IMAGE_URI_HERE]

接下來,填寫剩下的 Dockerfile 以安裝並設定要新增至容器的軟體。預先構建的 Braket 映像將已經包含適當的容器入口點腳本,因此您無需擔心包含該腳本。

如果您想使用非 Python 語言,例如 C ++,Rust 或 Julia,或者如果您想為非 x86 CPU 體系結構構建圖像,例如ARM,您可能需要在準系統公共映像之上構建圖像。您可以在 Amazon 彈性容器註冊表公共圖庫中找到許多此類圖像。確保您選擇了一個適合該CPU體系結構的,並且在必要時,GPU您要使用的。

(選擇性) 修改後的容器進入點指令碼

注意

如果您只將其他軟件添加到預先構建的 Braket 映像中,則可以跳過本節。

若要在混合作業中執行非 Python 程式碼,您需要修改定義容器入口點的 Python 指令碼。例如,Amazon Braket Github 上的 braket_container.py python 腳本。這是 Braket 預先構建的圖像的腳本,用於啟動算法腳本並設置適當的環境變量。容器入口點腳本本身必須在 Python 中,但可以啟動非 Python 腳本。在預構建的示例中,您可以看到 Python 算法腳本作為 Python 子進程或作為全新進程啟動。透過修改此邏輯,您可以啟用入口點指令碼以啟動非 Python 演算法指令碼。例如,您可以根據檔案副檔名結尾來修改thekick_off_customer_script()函數來啟動 Rust 程序。

您也可以選擇編寫一個全新的braket_container.py. 它應該將輸入資料、來源存檔和其他必要檔案從 Amazon S3 複製到容器中,並定義適當的環境變數。

安裝所需的軟件和容器腳本 Dockerfile

注意

如果您使用預先構建的 Braket 圖像作為 Docker 基本映像,容器腳本已經存在。

如果您在上一個步驟中建立了修改過的容器指令碼,則需要將其複製到容器中,將環境變數定義SAGEMAKER_PROGRAMbraket_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 拉他們。