本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
自带集装箱的食谱
在本节中,我们提供了 Braket Hybrid Jobs 需要做什么的 step-by-step指南,包括脚本、文件和将它们组合在一起的步骤,以便启动和运行自定义Docker映像。bring your own container (BYOC)我们提供两种常见案例的食谱:
-
在Docker镜像中安装其他软件,并在作业中仅使用 Python 算法脚本。
-
使用使用非 Python 语言编写的算法脚本与 Hybrid Jobs 或 x86 之外的 CPU 架构搭配使用。
对于案例 2,定义容器入口脚本更为复杂。
当 Braket 运行你的 Hybrid Job 时,它会启动所请求的数量和类型的 Amazon EC2 实例,然后运行在这些实例上创建任务时输入的图像 URI 所指定的图像。Docker使用 BYOC 功能时,您可以指定托管在您拥有读取权限的私有 Amazon ECR 存储库中的图像 URI。Braket Hybrid Jobs 使用该自定义镜像来运行作业。
构建可用于 Hybrid Jobs 的Docker映像所需的特定组件。如果您不熟悉编写和构建Dockerfiles
,我们建议您在阅读这些说明时根据需要参阅 Dockerfile 文档和Amazon ECR CLI文档
你的 Dockerfile 的基础镜像
如果您使用的是 Python,并且想要在 Braket 提供的容器中提供的内容之上安装软件,那么基础映像的一个选项是托管在我们的GitHub 存储库和 Amazon ECR 上的 BrakeFROM [IMAGE_URI_HERE]
接下来,填写Dockerfile要安装的其余部分,然后设置要添加到容器中的软件。预先构建的 Braket 镜像已经包含了相应的容器入口点脚本,因此您无需担心包含该脚本。
如果你想使用非 Python 语言,例如 C++、Rust 或 Julia,或者你想为非 x86 CPU 架构(比如 ARM)构建镜像,则可能需要在基本公共镜像的基础上构建。您可以在 Amazon Elastic Container Registry 公共图库
(可选)修改后的容器入口点脚本
注意
如果您只是在预先构建的 Braket 镜像中添加其他软件,则可以跳过本节。
要在混合作业中运行非 Python 代码,您需要修改定义容器入口点的 Python 脚本。例如,亚马逊 Braket braket_container.py
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 存储库中的代码,请不要在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