自带容器的食谱 - Amazon Braket

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

自带容器的食谱

在本节中,我们将为您提供所需内容的 step-by-step指南 bring your own container (BYOC) 到 Braket Hybrid Jobs — 脚本、文件和将它们组合在一起的步骤,以便启动和运行你的自定义任务 Docker 图片。我们提供两种常见案例的食谱:

  1. 在 a 中安装其他软件 Docker 图像并在作业中仅使用 Python 算法脚本。

  2. 使用使用非 Python 语言编写的算法脚本与 Hybrid Jobs 或 x86 之外的CPU架构搭配使用。

对于案例 2,定义容器入口脚本更为复杂。

当 Braket 运行您的混合 Job 时,它会启动所请求的数量和类型的 Amazon EC2 实例,然后运行 Docker 图像由在它们上创建任务的图像URI输入指定。使用该BYOC功能时,您可以指定URI托管在您拥有读取权限的私有 Amazon ECR 存储库中的图像。Braket Hybrid Jobs 使用该自定义镜像来运行作业。

你需要构建的特定组件 Docker 可以与混合作业一起使用的图像。如果你不熟悉写作和构建Dockerfiles,我们建议你参阅 Dockerfile 文档和 Amazon ECR CLI 在阅读这些说明时,请根据需要提供文档

你的 Dockerfile 的基础镜像

如果您使用的是 Python,并且想在 Braket 提供的容器中提供的内容之上安装软件,那么基础映像的一个选项是托管在我们的GitHub 存储库和亚马逊上的 Braket 容器镜像。ECR您需要向 Amazon 进行身份验证ECR才能提取图片并在其基础上进行构建。例如,你的第一行 BYOC Docker 文件可能是:FROM [IMAGE_URI_HERE]

接下来,填写其余部分 Dockerfile 来安装和设置要添加到容器中的软件。预先构建的 Braket 镜像已经包含了相应的容器入口点脚本,因此您无需担心包含该脚本。

如果你想使用非 Python 语言,比如 C++、Rust 或 Julia,或者你想为非 x86 CPU 架构构建镜像,比如ARM,你可能需要在基本公共镜像的基础上构建。您可以在 Amazon Elastic Container Registry 公共图库中找到许多这样的图片。请务必选择适合架构的CPU架构,如有必要,还要选择GPU要使用的架构。

(可选)修改后的容器入口点脚本

注意

如果您只是在预先构建的 Braket 镜像中添加其他软件,则可以跳过本节。

要在混合作业中运行非 Python 代码,您需要修改定义容器入口点的 Python 脚本。例如,亚马逊 Braket braket_container.py Github 上的 python 脚本。这是 Braket 预先构建的图像用来启动算法脚本和设置相应环境变量的脚本。容器入口点脚本本身必须使用 Python,但可以启动非 Python 脚本。在预先构建的示例中,您可以看到 Python 算法脚本要么作为 Python 子进程启动,要么作为全新的进程启动。通过修改此逻辑,您可以启用入口点脚本来启动非 Python 算法脚本。例如,您可以修改thekick_off_customer_script()函数以启动 Rust 进程,具体取决于文件扩展名的结尾。

你也可以选择写一个全新的东西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 去拉他们。