在 Amazon ECS 的 Amazon Linux 2 上使用 Trn1 和 Inf1 实例 - Amazon Elastic Container Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

在 Amazon ECS 的 Amazon Linux 2 上使用 Trn1 和 Inf1 实例

您可以将 Amazon EC2 Trn1Amazon EC2 Inf1 实例注册到您的集群,以执行机器学习工作负载。

Amazon EC2 Trn1 实例由 Amazon Web Services 自定义构建的 Amazon Trainium 芯片提供技术支持。这些实例在云中为机器学习提供高性能的低成本训练。您可以在 Trn1 实例上使用具有 Amazon Neuron 的机器学习框架训练机器学习推理模型。然后,您可以在 Inf1 实例上运行模型来利用 Amazon Inferentia 芯片的加速。

Amazon EC2 Inf1 实例由 Amazon Web Services 自定义构建的 Amazon Inferentia 芯片提供技术支持。它们在云中提供高性能,以及最低成本的推理。

机器学习模型使用 Amazon Neuron 部署到容器中,它是专门的 SDK。SDL 由编译器、运行时和分析工具组成,可用于优化 Amazon 机器学习芯片的机器学习性能。AmazonNeuron 支持常用的机器学习框架,例如 TensorFlow、PyTorch 和 Apache MXNet。

注意事项

在 Amazon ECS 上开始部署 Neuron 之前,请注意以下事项:

  • 您的集群可以包含 Trn1、Inf1 和其他实例的组合。

  • 在容器中,您需要一个采用支持 Amazon Neuron 的机器学习框架的 Linux 应用程序。

    重要

    使用其他框架的应用程序可能不会在 Trn1 和 Inf1 实例上获得性能提升。

  • 每个 Amazon TrainiumAmazon Inferentia 芯片上只能运行一个推理或推理训练任务。每个芯片都有两个与之关联的内核。每个 Trn1 和 Inf1 实例都有芯片,您可以运行与之一样多的任务。

  • 在创建服务或运行独立任务时,您可以在配置任务放置约束时使用实例类型属性。这样可以确保在您指定的容器实例上启动任务。这样做可以帮助您优化总体资源利用率,并确保推理工作负载的任务位于 Trn1 或 Inf1 实例上。有关更多信息,请参阅Amazon ECS 任务放置

    在以下示例中,任务在您的 default 集群上的 Inf1.xlarge 实例上运行。

    aws ecs run-task \ --cluster default \ --task-definition ecs-inference-task-def \ --placement-constraints type=memberOf,expression="attribute:ecs.instance-type == Inf1.xlarge"
  • 无法在任务定义中定义 Neuron 资源需求。但您要将容器配置为使用主机容器实例上可用的特定 Amazon Trainium 或 AmazonInferentia 芯片。通过使用 linuxParameters 参数并指定设备详细信息来执行此操作。有关更多信息,请参阅任务定义要求

使用经 Amazon ECS 优化的 Amazon Linux 2(Inferentia)AMI

Amazon ECS 为 Amazon Trainium 和 Amazon Inferentia 工作负载提供了一个基于 Amazon Linux 2 的经 Amazon ECS 优化的 AMI。它附带适用于 Docker 的 Amazon Neuron 驱动程序和运行时。此 AMI 使得在 Amazon ECS 上运行机器学习 inference 工作负载变得更加轻松。

我们建议您在启动 Amazon EC2 Trn1 和 Inf1 实例时使用经 Amazon ECS 优化的 Amazon Linux 2(Inferentia)AMI。您可以使用 Amazon CLI 和以下命令检索当前经 Amazon ECS 优化的 Amazon Linux 2(Inferentia)AMI。

aws ssm get-parameters --names /aws/service/ecs/optimized-ami/amazon-linux-2/inf/recommended

下表提供了按地区检索当前经 Amazon ECS 优化的 Amazon Linux 2(Inferentia)AMI ID 的链接。

任务定义要求

要在 Amazon ECS 上部署 Neuron,您的任务定义必须包含预构建容器的容器定义,该容器服务于 TensorFlow 的 推理模型。它是由 Amazon 深度学习容器提供的。此容器包含 Amazon Neuron 运行时和 TensorFlow 服务应用程序。在启动时,此容器将从 Amazon S3 获取您的模型,用保存的模型启动 Neuron TensorFlow 服务,并等待预测请求。在以下示例中,容器映像具有 TensorFlow 1.15 和 Ubuntu 18.04。GitHub 上维护了针对 Neuron 优化的预构建 Deep Learning Containers 的完整列表。有关更多信息,请参阅 Neuron Inference Containers

763104351884.dkr.ecr.us-east-1.amazonaws.com/tensorflow-inference-neuron:1.15.4-neuron-py37-ubuntu18.04

或者,您也可以构建自己的 Neuron 边车容器映像。有关更多信息,请参阅 GitHub 上的教程:Neuron TensorFlow 服务

任务定义必须特定于一种实例类型。您必须将容器配置为使用主机容器实例上可用的特定 Amazon Trainium 或 Amazon Inferentia 设备。您还可以使用 linuxParameters 参数执行此操作。下表详细介绍了特定于每种实例类型的芯片。

实例类型 vCPU RAM (GiB) Amazon ML 加速器芯片 设备路径
trn1.2xlarge 8 32 1 /dev/neuron0
trn1.32xlarge 128 512 16 /dev/neuron0, /dev/neuron1, /dev/neuron2, /dev/neuron3, /dev/neuron4, /dev/neuron5, /dev/neuron6, /dev/neuron7, /dev/neuron8, /dev/neuron9, /dev/neuron10, /dev/neuron11, /dev/neuron12, /dev/neuron13, /dev/neuron14, /dev/neuron15
inf1.xlarge 4 8 1 /dev/neuron0
inf1.2xlarge 8 16 1 /dev/neuron0
inf1.6xlarge 24 48 4 /dev/neuron0, /dev/neuron1, /dev/neuron2, /dev/neuron3
inf1.24xlarge 96 192 16 /dev/neuron0, /dev/neuron1, /dev/neuron2, /dev/neuron3, /dev/neuron4, /dev/neuron5, /dev/neuron6, /dev/neuron7, /dev/neuron8, /dev/neuron9, /dev/neuron10, /dev/neuron11, /dev/neuron12, /dev/neuron13, /dev/neuron14, /dev/neuron15

以下是 inf1.xlarge 的示例 Linux 任务定义,显示要使用的语法。

{ "family": "ecs-neuron", "requiresCompatibilities": ["EC2"], "placementConstraints": [ { "type": "memberOf", "expression": "attribute:ecs.os-type == linux" }, { "type": "memberOf", "expression": "attribute:ecs.instance-type == inf1.xlarge" } ], "executionRoleArn": "${YOUR_EXECUTION_ROLE}", "containerDefinitions": [ { "entryPoint": [ "/usr/local/bin/entrypoint.sh", "--port=8500", "--rest_api_port=9000", "--model_name=resnet50_neuron", "--model_base_path=s3://your-bucket-of-models/resnet50_neuron/" ], "portMappings": [ { "hostPort": 8500, "protocol": "tcp", "containerPort": 8500 }, { "hostPort": 8501, "protocol": "tcp", "containerPort": 8501 }, { "hostPort": 0, "protocol": "tcp", "containerPort": 80 } ], "linuxParameters": { "devices": [ { "containerPath": "/dev/neuron0", "hostPath": "/dev/neuron0", "permissions": [ "read", "write" ] } ], "capabilities": { "add": [ "IPC_LOCK" ] } }, "cpu": 0, "memoryReservation": 1000, "image": "763104351884.dkr.ecr.us-east-1.amazonaws.com/tensorflow-inference-neuron:1.15.4-neuron-py37-ubuntu18.04", "essential": true, "name": "resnet50" } ] }