生成数据智能

在由 AWS Trainium 实例提供支持的 Amazon ECS 上扩展您的机器学习工作负载 | 亚马逊网络服务

日期:

使用容器运行机器学习 (ML) 工作负载正在成为一种常见做法。 容器不仅可以完全封装您的训练代码,还可以完全封装整个依赖项堆栈,直至硬件库和驱动程序。 您得到的是一个一致且可移植的 ML 开发环境。 使用容器,在集群上进行扩展变得更加容易。

2022 年底,AWS 宣布正式推出 Amazon EC2 Trn1 实例 powered by AWS 培训 加速器,专为高性能深度学习训练而打造。 与其他同类产品相比,Trn1 实例可节省高达 50% 的培训成本 亚马逊弹性计算云 (亚马逊 EC2)实例。 此外, AWS 神经元开发工具包 发布是为了改进这种加速,为开发人员提供工具来与这种技术交互,例如编译、运行时和配置文件,以实现高性能和具有成本效益的模型训练。

亚马逊弹性容器服务 (Amazon ECS) 是一种完全托管的容器编排服务,可简化容器化应用程序的部署、管理和扩展。 只需描述您的应用程序和所需的资源,Amazon ECS 将通过灵活的计算选项启动、监控和扩展您的应用程序,并自动集成到您的应用程序需要的其他支持性 AWS 服务。

在本文中,我们将向您展示如何使用 Amazon ECS 在容器中运行 ML 训练作业,以部署、管理和扩展您的 ML 工作负载。

解决方案概述

我们将引导您完成以下高级步骤:

  1. 提供 Trn1 实例的 ECS 集群 AWS CloudFormation.
  2. 使用 Neuron SDK 构建自定义容器镜像并将其推送到 Amazon Elastic Container注册 (Amazon ECR)。
  3. 创建任务定义以定义要由 Amazon ECS 运行的 ML 训练作业。
  4. 在 Amazon ECS 上运行 ML 任务。

先决条件

要继续学习,需要熟悉 Amazon EC2 和 Amazon ECS 等核心 AWS 服务。

提供 Trn1 实例的 ECS 集群

首先,启动提供的 CloudFormation模板,它将提供所需的资源,例如 VPC、ECS 集群和 EC2 Trainium 实例。

我们使用 Neuron SDK 在 AWS 推理 和基于 Trainium 的实例。 它支持您在端到端 ML 开发生命周期中创建新模型、优化它们,然后将它们部署到生产环境中。 要使用 Trainium 训练您的模型,您需要在运行 ECS 任务的 EC2 实例上安装 Neuron SDK,以映射与硬件关联的 NeuronDevice,以及将被推送到 Amazon ECR 以访问命令的 Docker 映像训练你的模型。

Amazon Linux 2 或 Ubuntu 20 的标准版本没有安装 AWS Neuron 驱动程序。 因此,我们有两种不同的选择。

第一个选项是使用已安装 Neuron SDK 的深度学习亚马逊机器映像 (DLAMI)。 样品可在 GitHub回购. 您可以根据 操作系统. 然后运行以下命令获取 AMI ID:

aws ec2 describe-images --region us-east-1 --owners amazon --filters 'Name=name,Values=Deep Learning AMI Neuron PyTorch 1.13.? (Amazon Linux 2) ????????' 'Name=state,Values=available' --query 'reverse(sort_by(Images, &CreationDate))[:1].ImageId' --output text

输出将如下所示:

ami-06c40dd4f80434809

此 AMI ID 会随时间变化,因此请确保使用命令获取正确的 AMI ID。

现在,您可以在 CloudFormation 脚本中更改此 AMI ID,并使用现成的 Neuron SDK。 为此,请寻找 EcsAmiId in Parameters:

"EcsAmiId": { "Type": "String", "Description": "AMI ID", "Default": "ami-09def9404c46ac27c" }

第二个选项是创建一个实例来填充 userdata 堆栈创建期间的字段。 您不需要安装它,因为 CloudFormation 会进行设置。 有关详细信息,请参阅 神经元设置指南.

对于这篇文章,我们使用选项 2,以防您需要使用自定义图像。 完成以下步骤:

  1. 启动提供的 CloudFormation 模板。
  2. 针对 键名,输入所需密钥对的名称,它将预加载参数。 对于这篇文章,我们使用 trainium-key.
  3. 输入堆栈的名称。
  4. 如果你在运行 us-east-1 区域,您可以保留以下值 ALB名称氨基酸 默认情况下。

要检查区域中哪些可用区有 Trn1 可用,请运行以下命令:

aws ec2 describe-instance-type-offerings --region us-east1 --location-type availability-zone --filter Name=instance-type,Values=trn1.2xlarge

  1. 下一页 并完成创建堆栈。

堆叠完成后,您可以进入下一步。

使用 Neuron SDK 准备并推送 ECR 镜像

Amazon ECR 是一个完全托管的容器注册表,提供高性能托管,因此您可以在任何地方可靠地部署应用程序映像和构件。 我们使用 Amazon ECR 来存储自定义 Docker 映像,其中包含我们的脚本和 Neuron 包,这些映像需要使用在 Trn1 实例上运行的 ECS 作业来训练模型。 您可以使用 AWS命令行界面 (AWS CLI) 或 AWS管理控制台. 对于这篇文章,我们使用控制台。 完成以下步骤:

  1. 在 Amazon ECR 控制台上,创建一个新存储库。
  2. 针对 可见性设置选择 私做.
  3. 针对 存储库名称,输入名称。
  4. 创建存储库.

现在你有了一个存储库,让我们构建并推送一个图像,它可以在本地构建(到你的笔记本电脑中)或在 AWS 云9 环境。 我们正在训练多层感知器 (MLP) 模型。 原代码参考 多层感知器训练教程.

  1. 复制 火车模型.py 文件到项目中。

它已经与 Neuron 兼容,因此您无需更改任何代码。

  1. 5。 创建一个 Dockerfile 具有安装 Neuron SDK 和训练脚本的命令:
FROM amazonlinux:2 RUN echo $'[neuron] n
name=Neuron YUM Repository n
baseurl=https://yum.repos.neuron.amazonaws.com n
enabled=1' > /etc/yum.repos.d/neuron.repo RUN rpm --import https://yum.repos.neuron.amazonaws.com/GPG-PUB-KEY-AMAZON-AWS-NEURON.PUB RUN yum install aws-neuronx-collectives-2.* -y
RUN yum install aws-neuronx-runtime-lib-2.* -y
RUN yum install aws-neuronx-tools-2.* -y
RUN yum install -y tar gzip pip
RUN yum install -y python3 python3-pip
RUN yum install -y python3.7-venv gcc-c++
RUN python3.7 -m venv aws_neuron_venv_pytorch # Activate Python venv
ENV PATH="/aws_neuron_venv_pytorch/bin:$PATH"
RUN python -m pip install -U pip
RUN python -m pip install wget
RUN python -m pip install awscli RUN python -m pip config set global.extra-index-url https://pip.repos.neuron.amazonaws.com
RUN python -m pip install torchvision tqdm torch-neuronx neuronx-cc==2.* pillow
RUN mkdir -p /opt/ml/mnist_mlp
COPY model.py /opt/ml/mnist_mlp/model.py
COPY train.py /opt/ml/mnist_mlp/train.py
RUN chmod +x /opt/ml/mnist_mlp/train.py
CMD ["python3", "/opt/ml/mnist_mlp/train.py"]

要使用 Neuron 创建您自己的 Dockerfile,请参阅 在 AWS ML 加速器实例上开发,您可以在其中找到其他操作系统和 ML 框架的指南。

  1. 6. 构建镜像,然后使用以下代码将其推送到 Amazon ECR(提供您的区域、账户 ID 和 ECR 存储库):
aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin {your-account-id}.dkr.ecr.{your-region}.amazonaws.com docker build -t mlp_trainium . docker tag mlp_trainium:latest {your-account-id}.dkr.ecr.us-east-1.amazonaws.com/mlp_trainium:latest docker push {your-account-id}.dkr.ecr.{your-region}.amazonaws.com/{your-ecr-repo-name}:latest

在此之后,您的映像版本应该在您创建的 ECR 存储库中可见。

将 ML 训练作业作为 ECS 任务运行

要在 Amazon ECS 上运行 ML 训练任务,您首先需要创建一个 任务定义. 需要任务定义才能在 Amazon ECS 中运行 Docker 容器。

  1. 在Amazon ECS控制台上,选择 任务定义 在导航窗格中。
  2. 点击 创建新的任务定义 菜单中选择 使用 JSON 创建新的任务定义.

您可以使用以下内容 任务定义模板 作为基线。 请注意,在图像字段中,您可以使用上一步生成的图像。 确保它包含您的帐户 ID 和 ECR 存储库名称。

为确保已安装 Neuron,您可以检查音量是否 /dev/neuron0 映射到设备块中。 这映射到单个 NeuronDevice 在具有两个内核的 trn1.2xlarge 实例上运行。

  1. 使用以下模板创建任务定义:
{ "family": "mlp_trainium", "containerDefinitions": [ { "name": "mlp_trainium", "image": "{your-account-id}.dkr.ecr.us-east-1.amazonaws.com/{your-ecr-repo-name}", "cpu": 0, "memoryReservation": 1000, "portMappings": [], "essential": true, "environment": [], "mountPoints": [], "volumesFrom": [], "linuxParameters": { "capabilities": { "add": [ "IPC_LOCK" ] }, "devices": [ { "hostPath": "/dev/neuron0", "containerPath": "/dev/neuron0", "permissions": [ "read", "write" ] } ] }, , "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-create-group": "true", "awslogs-group": "/ecs/task-logs", "awslogs-region": "us-east-1", "awslogs-stream-prefix": "ecs" } } } ], "networkMode": "awsvpc", "placementConstraints": [ { "type": "memberOf", "expression": "attribute:ecs.os-type == linux" }, { "type": "memberOf", "expression": "attribute:ecs.instance-type == trn1.2xlarge" } ], "requiresCompatibilities": [ "EC2" ], "cpu": "1024", "memory": "3072"
}

您还可以使用以下命令在 AWS CLI 上完成此步骤 任务定义 或者使用以下命令:

aws ecs register-task-definition --family mlp-trainium --container-definitions '[{ "name": "my-container-1", "image": "{your-account-id}.dkr.ecr.us-east-1.amazonaws.com/{your-ecr-repo-name}", "cpu": 0, "memoryReservation": 1000, "portMappings": [], "essential": true, "environment": [], "mountPoints": [], "volumesFrom": [], "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-create-group": "true", "awslogs-group": "/ecs/task-logs", "awslogs-region": "us-east-1", "awslogs-stream-prefix": "ecs" } }, "linuxParameters": { "capabilities": { "add": [ "IPC_LOCK" ] }, "devices": [{ "hostPath": "/dev/neuron0", "containerPath": "/dev/neuron0", "permissions": ["read", "write"] }] }
}]' --requires-compatibilities EC2
--cpu "8192" --memory "16384" --placement-constraints '[{ "type": "memberOf", "expression": "attribute:ecs.instance-type == trn1.2xlarge"
}, { "type": "memberOf", "expression": "attribute:ecs.os-type == linux"
}]'

在 Amazon ECS 上运行任务

在我们创建 ECS 集群、将图像推送到 Amazon ECR 并创建任务定义后,我们运行任务定义以在 Amazon ECS 上训练模型。

  1. 在Amazon ECS控制台上,选择 集群 在导航窗格中。
  2. 打开你的集群。
  3. 点击 任务 标签,选择 运行新任务.

  1. 针对 发射类型,选择 EC2.

  1. 针对 申请类型, 选择 任务.
  2. 针对 家庭, 选择您创建的任务定义。

  1. 网络相关 部分,指定由 CloudFormation 堆栈、子网和安全组创建的 VPC。

  1. 创建.

您可以在 Amazon ECS 控制台上监控您的任务。

您还可以使用 AWS CLI 运行任务:

aws ecs run-task --cluster <your-cluster-name> --task-definition <your-task-name> --count 1 --network-configuration '{"awsvpcConfiguration": {"subnets": ["<your-subnet-name> "], "securityGroups": ["<your-sg-name> "] }}'

结果将类似于以下屏幕截图。

您还可以通过 亚马逊CloudWatch 日志组。

训练模型后,您可以将它们存储在 亚马逊简单存储服务 (亚马逊S3)。

清理

为避免额外费用,您可以将 Auto Scaling 组更改为 最小容量所需容量 为零,关闭 Trainium 实例。 要进行彻底清理,请删除 CloudFormation 堆栈以移除由此模板创建的所有资源。

结论

在本文中,我们展示了如何使用 Amazon ECS 部署您的 ML 训练作业。 我们创建了一个 CloudFormation 模板来创建 Trn1 实例的 ECS 集群,构建了一个自定义 Docker 镜像,将其推送到 Amazon ECR,并使用 Trainium 实例在 ECS 集群上运行 ML 训练作业。

有关 Neuron 的更多信息以及您可以使用 Trainium 做什么,请查看以下资源:


作者简介

纪列美·里奇 是 Amazon Web Services 的高级初创公司解决方案架构师,帮助初创公司实现应用程序的现代化和优化成本。 他在金融领域的公司拥有超过 10 年的经验,目前正在与一个 AI/ML 专家团队合作。

埃万德罗佛朗哥 是一名 AI/ML 专家解决方案架构师,致力于 Amazon Web Services。 他帮助 AWS 客户克服与基于 AWS 的 AI/ML 相关的业务挑战。 他从事技术工作超过 15 年,从软件开发、基础设施、无服务器到机器学习。

马修·麦克莱恩 领导 Annapurna ML 解决方案架构团队,帮助客户采用 AWS Trainium 和 AWS Inferentia 产品。 他热衷于生成式 AI,在过去 10 年里一直在帮助客户采用 AWS 技术。

现货图片

最新情报

现货图片

在线答疑

你好呀! 我怎么帮你?