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

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

在亚马逊 ECS Amazon 上的 Amazon Linux 2 上使用 Neuron

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

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

Amazon EC2 Inf1 实例和 Inf2 实例由 Amazon Inferentia 芯片提供支持,,它们可在云中提供高性能和最低成本的推理。

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

注意事项

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

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

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

    重要

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

  • 每个 Amazon TrainiumAmazon Inferentia 芯片上只能运行一个推理或推理训练任务。对于 Inf1,每个芯片有 4 NeuronCores 个。对于 Trn1 和 Inf2,每个芯片有 2 个。 NeuronCores每个 Trn1、Inf1 和 Inf2 实例都有芯片,您可以运行与之一样多的任务。

  • 在创建服务或运行独立任务时,您可以在配置任务放置约束时使用实例类型属性。这样可以确保在您指定的容器实例上启动任务。这样做可以帮助您优化总体资源利用率,并确保推理工作负载的任务位于 Trn1、Inf1 和 Inf2 实例上。有关更多信息,请参阅 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 或 Amazon Inferentia 芯片。通过使用 linuxParameters 参数并指定设备详细信息来执行此操作。有关更多信息,请参阅 任务定义要求

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

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

建议您在启动 Amazon EC2 Trn1、Inf1 和 Inf2 实例时使用经 Amazon ECS 优化的 Amazon Linux 2(Neuron)AMI。

您可以使用以下命令检索当前经过亚马逊 ECS 优化的 Amazon Linux 2(Neuro Amazon CLI n)AMI。

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

以下区域支持亚马逊 ECS 优化的 Amazon Linux 2 (Neuron) AMI:

  • 美国东部(弗吉尼亚州北部)

  • 美国东部(俄亥俄州)

  • 美国西部(北加利福尼亚)

  • 美国西部(俄勒冈)

  • 亚太地区(孟买)

  • 亚太地区(大阪)

  • 亚太地区(首尔)

  • 亚太地区(东京)

  • 亚太地区(新加坡)

  • 亚太地区(悉尼)

  • 加拿大(中部)

  • 欧洲地区(法兰克福)

  • 欧洲地区(爱尔兰)

  • 欧洲地区(伦敦)

  • 欧洲地区(巴黎)

  • 欧洲(斯德哥尔摩)

  • South America(São Paulo)

任务定义要求

要在 Amazon ECS 上部署 Neuron,您的任务定义必须包含为其提供推理模型的预构建容器的容器定义。 TensorFlow它由 Dee Amazon p Learning Containers 提供。此容器包含 Amazon Neuron 运行时和 Servin TensorFlow g 应用程序。启动时,此容器会从 Amazon S3 获取您的模型,使用保存的模型启动 Neuron TensorFlow Servicing,然后等待预测请求。在以下示例中,容器镜像有 TensorFlow 1.15 和 Ubuntu 18.04。中保留了针对神经元优化的预建的 Deep Learning Containers 的完整列表。 GitHub有关更多信息,请参阅使用 Amazon 神经元 TensorFlow 服务

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

或者,您也可以构建自己的 Neuron 边车容器映像。有关更多信息,请参阅Amazon Deep Learning AMI 开发者指南》中的教程:神经元 TensorFlow 服务

任务定义必须特定于一种实例类型。您必须将容器配置为使用主机容器实例上可用的特定 Amazon Train Amazon ium 或 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
inf2.xlarge 8 16 1 /dev/neuron0
inf2.8xlarge 32 64 1 /dev/neuron0
inf2.24xlarge 96 384 6 /dev/neuron0, /dev/neuron1, /dev/neuron2, /dev/neuron3, /dev/neuron4, /dev/neuron5,
inf2.48xlarge 192 768 12 /dev/neuron0, /dev/neuron1, /dev/neuron2, /dev/neuron3, /dev/neuron4, /dev/neuron5, /dev/neuron6, /dev/neuron7, /dev/neuron8, /dev/neuron9, /dev/neuron10, /dev/neuron11

以下是 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" } ] }