AWS 深度学习容器
AWS 深度学习容器 (DLCs) 是一组用于在 TensorFlow、TensorFlow 2、PyTorch 和 MXNet 中训练和部署模型的 Docker 镜像。深度学习容器为 TensorFlow 和 MXNet 提供了优化的环境,包含 Nvidia CUDA (用于 GPU 实例)和 Intel MKL (用于 CPU 实例)库,这些容器在 Amazon 弹性容器注册表 (Amazon ECR) 中可用。
AWS DLCs 在 Amazon SageMaker 中用作 SageMaker 作业(如训练、推理、转换等)的默认载体。它们也经过测试,可用于 Amazon EC2、Amazon ECS 和 Amazon EKS 服务上的机器学习工作负载。
有关可用 DLC 镜像的列表,请参阅可用的深度学习容器镜像。您可以在此处找到有关 SageMaker 中可用镜像的更多信息。
许可证
本项目采用 Apache-2.0 许可证。
smdistributed.dataparallel
和 smdistributed.modelparallel
根据 AWS 客户协议 发布。
目录
入门
我们在此描述在 Amazon SageMaker、EC2、ECS 和 EKS 平台上构建和测试 DLCs 的设置。
我们以构建 MXNet GPU python3 训练 容器为例。
- 确保您可以访问 AWS 账户,即设置您的环境,使 awscli 可以通过 IAM 用户或 IAM 角色访问您的账户。我们建议使用 IAM 角色来使用 AWS。出于在个人账户中进行测试的目的,以下托管权限应该足够:
-- AmazonEC2ContainerRegistryFullAccess
-- AmazonEC2FullAccess
-- AmazonEKSClusterPolicy
-- AmazonEKSServicePolicy
-- AmazonEKSServiceRolePolicy
-- AWSServiceRoleForAmazonEKSNodegroup
-- AmazonSageMakerFullAccess
-- AmazonS3FullAccess - 在 us-west-2 区域创建一个名为 "beta-mxnet-training" 的 ECR 存储库
- 确保您的系统上设置了 docker 客户端 - osx/ec2
- 克隆存储库并设置以下环境变量:
export ACCOUNT_ID=<YOUR_ACCOUNT_ID> export REGION=us-west-2 export REPOSITORY_NAME=beta-mxnet-training
- 登录 ECR
aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin $ACCOUNT_ID.dkr.ecr.us-west-2.amazonaws.com
- 假设您的工作目录是克隆的存储库,创建一个虚拟环境来使用存储库并安装要求
python3 -m venv dlc source dlc/bin/activate pip install -r src/requirements.txt
- 执行初始设置
bash src/setup.sh mxnet
构建您的镜像
Dockerfile 的路径遵循特定模式,例如 mxnet/training/docker/<version>/<python_version>/Dockerfile.
这些路径由位于 mxnet/training/buildspec.yml 即 <framework>/<training|inference>/buildspec.yml 的 buildspec.yml 指定。如果您想为特定版本构建 Dockerfile,或引入框架的新版本,请按照上述方式重新创建文件夹结构,并修改 buildspec.yml 文件以指定要构建的 Dockerfile 版本。
- 要在本地构建 buildspec.yml 中指定的所有 Dockerfile,请使用以下命令
首次运行时,上述步骤应该需要一段时间才能完成,因为它必须首次下载所有基础层并创建中间层。 后续运行应该会快得多。python src/main.py --buildspec mxnet/training/buildspec.yml --framework mxnet
- 如果您只想构建单个镜像
python src/main.py --buildspec mxnet/training/buildspec.yml \ --framework mxnet \ --image_types training \ --device_types cpu \ --py_versions py3
- 参数 —image_types、—device_types 和 —py_versions 都是逗号分隔的列表,其可能的值如下:
--image_types <training/inference> --device_types <cpu/gpu> --py_versions <py2/py3>
- 例如,要构建所有 gpu 训练容器,可以使用以下命令
python src/main.py --buildspec mxnet/training/buildspec.yml \ --framework mxnet \ --image_types training \ --device_types gpu \ --py_versions py3
升级框架版本
- 假设,如果 MXNet 有新的框架版本(版本 1.7.0),则需要在 MXNet 训练的 buildspec.yml 文件中进行更改。
# mxnet/training/buildspec.yml 1 account_id: &ACCOUNT_ID <set-$ACCOUNT_ID-in-environment> 2 region: ®ION <set-$REGION-in-environment> 3 framework: &FRAMEWORK mxnet 4 version: &VERSION 1.6.0 *<--- 将此更改为 1.7.0>* ................
- 此版本的 Dockerfile 应位于 mxnet/docker/1.7.0/py3/Dockerfile.gpu。此路径由每个存储库的 docker_file 键指定。
# mxnet/training/buildspec.yml 41 images: 42 BuildMXNetCPUTrainPy3DockerImage: 43 <<: *TRAINING_REPOSITORY ................... 49 docker_file: !join [ docker/, *VERSION, /, *DOCKER_PYTHON_VERSION, /Dockerfile., *DEVICE_TYPE ]
- 按照上述方法构建容器。
向构建上下文添加构件
- 如果您正在从构建上下文复制构件,如下所示:
那么需要首先将 README-context.rst 复制到构建上下文中。您可以通过在框架 buildspec 文件的 context 键下添加构件来实现这一点:# deep-learning-containers/mxnet/training/docker/1.6.0/py3 COPY README-context.rst README.rst
# mxnet/training/buildspec.yml 19 context: 20 README.xyz: *<---- 对象名称(可以是任何内容)>* 21 source: README-context.rst *<--- 要复制的文件的路径>* 22 target: README.rst *<--- 构建上下文中对象的名称>*
- 将其添加到 context 下使其可用于所有镜像。如果您只需要将其用于训练或推理镜像,请将其添加到 training_context 或 inference_context 下。
19 context: ................. 23 training_context: &TRAINING_CONTEXT 24 README.xyz: 25 source: README-context.rst 26 target: README.rst ...............
- 如果您只需要将其用于单个容器,请将其添加到该特定镜像的 context 键下:
41 images: 42 BuildMXNetCPUTrainPy3DockerImage: 43 <<: *TRAINING_REPOSITORY ....................... 50 context: 51 <<: *TRAINING_CONTEXT 52 README.xyz: 53 source: README-context.rst 54 target: README.rst
- 按照上述方法构建容器。
添加包
以下步骤概述了如何向镜像添加包。有关自定义容器的更多信息,请参阅构建 AWS 深度学习容器自定义镜像。
- 假设您想向 MXNet 1.6.0 py3 GPU docker 镜像添加一个包,那么将 dockerfile 从:
更改为# mxnet/training/docker/1.6.0/py3/Dockerfile.gpu 139 RUN ${PIP} install --no-cache --upgrade \ 140 keras-mxnet==2.2.4.2 \ ........................... 159 ${MX_URL} \ 160 awscli
139 RUN ${PIP} install --no-cache --upgrade \ 140 keras-mxnet==2.2.4.2 \ ........................... 160 awscli \ 161 octopush
- 按照上述方法构建容器。
在本地运行测试
作为您的 PR 迭代的一部分,有时在本地运行测试会很有帮助,以避免使用过多的额外资源或等待构建完成。测试支持使用 pytest。
与本地构建类似,要进行本地测试,您需要访问个人/团队 AWS 账户。要进行测试:
-
在克隆了deep-learning-containers仓库的EC2实例上,或者在您的本地机器上,确保您已经本地拥有想要测试的镜像(可能需要从ECR中拉取)。然后切换到克隆的文件夹中。安装测试所需的依赖项。
cd deep-learning-containers/ pip install -r src/requirements.txt pip install -r test/requirements.txt
-
在shell中,将环境变量DLC_IMAGES设置为要测试的ECR URI的空格分隔列表。将CODEBUILD_RESOLVED_SOURCE_VERSION设置为一个唯一标识符,您可以用它来识别测试启动的资源。将PYTHONPATH设置为src/文件夹的绝对路径。 示例: [注意:将存储库名称更改为您账户中设置的名称]
export DLC_IMAGES="$ACCOUNT_ID.dkr.ecr.us-west-2.amazonaws.com/pr-pytorch-training:training-gpu-py3 $ACCOUNT_ID.dkr.ecr.us-west-2.amazonaws.com/pr-mxnet-training:training-gpu-py3" export PYTHONPATH=$(pwd)/src export CODEBUILD_RESOLVED_SOURCE_VERSION="my-unique-test"
-
我们的pytest框架期望根目录是test/dlc_tests,所以在shell中切换到这个目录
cd test/dlc_tests
-
要运行与特定平台上的镜像相关的所有测试(串行),请使用以下命令
# EC2 pytest -s -rA ec2/ -n=auto # ECS pytest -s -rA ecs/ -n=auto #EKS cd ../ export TEST_TYPE=eks python test/testrunner.py
移除
-n=auto
以顺序运行测试。 -
要运行特定的测试文件,提供测试文件的完整路径
pytest -s ecs/mxnet/training/test_ecs_mxnet_training.py
-
要运行特定的测试函数(在这个例子中我们使用cpu dgl ecs测试),将命令修改如下:
pytest -s ecs/mxnet/training/test_ecs_mxnet_training.py::test_ecs_mxnet_training_dgl_cpu
-
要运行SageMaker本地模式测试,启动一个带有最新Deep Learning AMI的CPU或GPU EC2实例。
- 克隆您的GitHub分支并运行以下命令
git clone https://github.com/{github_account_id}/deep-learning-containers/ cd deep-learning-containers && git checkout {branch_name}
- 登录到存在新构建的docker镜像的ECR仓库
$(aws ecr get-login --no-include-email --registry-ids ${aws_id} --region ${aws_region})
- 根据正在测试的镜像的框架和作业类型,切换到适当的目录(sagemaker_tests/{framework}/{job_type})。
下面的例子是测试mxnet_training镜像
cd test/sagemaker_tests/mxnet/training/ pip3 install -r requirements.txt
- 要运行SageMaker本地集成测试(除了tensorflow_inference),使用以下pytest命令:
python3 -m pytest -v integration/local --region us-west-2 \ --docker-base-name ${aws_account_id}.dkr.ecr.us-west-2.amazonaws.com/mxnet-inference \ --tag 1.6.0-cpu-py36-ubuntu18.04 --framework-version 1.6.0 --processor cpu \ --py-version 3
- 要测试tensorflow_inference py3镜像,运行以下命令:
python3 -m pytest -v integration/local \ --docker-base-name ${aws_account_id}.dkr.ecr.us-west-2.amazonaws.com/tensorflow-inference \ --tag 1.15.2-cpu-py36-ubuntu16.04 --framework-version 1.15.2 --processor cpu
- 克隆您的GitHub分支并运行以下命令
-
要在您的账户上运行SageMaker远程测试,请设置以下先决条件
- 在上述账户中创建一个名为"SageMakerRole"的IAM角色,并添加以下AWS托管策略
AmazonSageMakerFullAccess
- 根据正在测试的镜像的框架和作业类型,切换到适当的目录(sagemaker_tests/{framework}/{job_type})。
下面的例子是测试mxnet_training镜像
cd test/sagemaker_tests/mxnet/training/ pip3 install -r requirements.txt
- 要运行SageMaker远程集成测试(除了tensorflow_inference),使用以下pytest命令:
pytest integration/sagemaker/test_mnist.py \ --region us-west-2 --docker-base-name mxnet-training \ --tag training-gpu-py3-1.6.0 --framework-version 1.6.0 --aws-id {aws_id} \ --instance-type ml.p3.8xlarge
- 对于tensorflow_inference py3镜像,运行以下命令
python3 -m pytest test/integration/sagemaker/test_tfs. --registry {aws_account_id} \ --region us-west-2 --repo tensorflow-inference --instance-types ml.c5.18xlarge \ --tag 1.15.2-py3-cpu-build --versions 1.15.2
- 在上述账户中创建一个名为"SageMakerRole"的IAM角色,并添加以下AWS托管策略
-
要在您的账户上运行SageMaker基准测试,请执行以下步骤:
- 在deep-learning-containers/文件夹中创建一个名为
sm_benchmark_env_settings.config
的文件 - 将以下内容添加到文件中(注释行是可选的):
export DLC_IMAGES="<image_uri_1-you-want-to-benchmark-test>" # export DLC_IMAGES="$DLC_IMAGES <image_uri_2-you-want-to-benchmark-test>" # export DLC_IMAGES="$DLC_IMAGES <image_uri_3-you-want-to-benchmark-test>" export BUILD_CONTEXT=PR export TEST_TYPE=benchmark-sagemaker export CODEBUILD_RESOLVED_SOURCE_VERSION=$USER export REGION=us-west-2
- 运行:
source sm_benchmark_env_settings.config
- 要测试多个框架的所有镜像,运行:
pip install -r requirements.txt python test/testrunner.py
- 要测试单个框架镜像类型,运行:
# 假设当前工作目录是deep-learning-containers/ cd test/dlc_tests pytest benchmark/sagemaker/<framework-name>/<image-type>/test_*.py
- 这些测试中使用的脚本和模型资源将位于:
deep-learning-containers/test/dlc_tests/benchmark/sagemaker/<framework-name>/<image-type>/resources/
- 在deep-learning-containers/文件夹中创建一个名为
注意:SageMaker不支持tensorflow_inference py2镜像。