本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
自带容器的食谱
在本节中,我们将为您提供所需内容的 step-by-step指南 bring your own container (BYOC) 到 Braket Hybrid Jobs — 脚本、文件和将它们组合在一起的步骤,以便启动和运行你的自定义任务 Docker 图片。我们提供两种常见案例的食谱:
-
在 a 中安装其他软件 Docker 图像并在作业中仅使用 Python 算法脚本。
-
使用使用非 Python 语言编写的算法脚本与 Hybrid Jobs 或 x86 之外的CPU架构搭配使用。
对于案例 2,定义容器入口脚本更为复杂。
当 Braket 运行您的混合 Job 时,它会启动所请求的数量和类型的 Amazon EC2 实例,然后运行 Docker 图像由在它们上创建任务的图像URI输入指定。使用该BYOC功能时,您可以指定URI托管在您拥有读取权限的私有 Amazon ECR 存储库中的图像。Braket Hybrid Jobs 使用该自定义镜像来运行作业。
你需要构建的特定组件 Docker 可以与混合作业一起使用的图像。如果你不熟悉写作和构建Dockerfiles
,我们建议你参阅 Dockerfile
你的 Dockerfile 的基础镜像
如果您使用的是 Python,并且想在 Braket 提供的容器中提供的内容之上安装软件,那么基础映像的一个选项是托管在我们的GitHub 存储FROM [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 存储库中的代码,请不要将SSH密钥嵌入到 Docker 图片来访问它。相反,使用 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 去拉他们。