

# 适用于 AWS 神经元机器学习工作负载的 Amazon ECS 任务定义
<a name="ecs-inference"></a>

您可以将 [Amazon EC2 Trn1](https://aws.amazon.com/ec2/instance-types/trn1/)、[Amazon EC2 Trn2](https://aws.amazon.com/ec2/instance-types/trn2/)、[Amazon EC2 Inf1](https://aws.amazon.com/ec2/instance-types/inf1/) 和 [Amazon EC2 Inf2](https://aws.amazon.com/ec2/instance-types/inf2/) 实例注册到您的集群，以执行机器学习工作负载。

Amazon EC2 Trn1 和 Trn2 实例由 [AWS Trainium](https://aws.amazon.com/ai/machine-learning/trainium/) 芯片提供技术支持。这些实例在云中为机器学习提供高性能的低成本训练。您可以在 Trn1 或 Trn2 实例上使用具有 AWS Neuron 的机器学习框架训练机器学习推理模型。然后，您可以在 Inf1 实例或 Inf2 实例上运行模型来利用 AWS Inferentia 芯片的加速。

Amazon EC2 Inf1 实例和 Inf2 实例由 [AWS Inferentia](https://aws.amazon.com/ai/machine-learning/inferentia/) 芯片提供支持，，它们可在云中提供高性能和最低成本的推理。

机器学习模型使用 [AWS Neuron](https://aws.amazon.com/ai/machine-learning/neuron/) 部署到容器中，它是专门的软件开发工具包（SDK）。SDL 由编译器、运行时和分析工具组成，可用于优化 AWS 机器学习芯片的机器学习性能。AWSNeuron 支持常用的机器学习框架，例如 TensorFlow、PyTorch 和 Apache MXNet。

## 注意事项
<a name="ecs-inference-considerations"></a>

在 Amazon ECS 上开始部署 Neuron 之前，请注意以下事项：
+ 您的集群可以包含 Trn1、Trn2、Inf1、Inf2 和其他实例的组合。
+ 在容器中，您需要一个采用支持 AWS Neuron 的机器学习框架的 Linux 应用程序。
**重要**  
使用其他框架的应用程序可能不会在 Trn1、Trn2、Inf1 和 Inf2 实例上获得性能提升。
+ 每个 [AWS Trainium](https://aws.amazon.com/ai/machine-learning/trainium/) 或 [AWS Inferentia](https://aws.amazon.com/ai/machine-learning/inferentia/) 芯片上只能运行一个推理或推理训练任务。对于 Inf1，每个芯片有 4 个 NeuronCore。对于 Trn1、Trn2 和 Inf2，每个芯片有 2 个 NeuronCore。每个 Trn1、Trn2、Inf1 和 Inf2 实例都有芯片，您可以运行与之一样多的任务。
+ 在创建服务或运行独立任务时，您可以在配置任务放置约束时使用实例类型属性。这样可以确保在您指定的容器实例上启动任务。这样做可以帮助您优化总体资源利用率，并确保推理工作负载的任务位于 Trn1、Trn2、Inf1 和 Inf2 实例上。有关更多信息，请参阅 [Amazon ECS 如何将任务放置在容器实例上](task-placement.md)。

  在以下示例中，任务在您的 `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 资源需求。但您要将容器配置为使用主机容器实例上可用的特定 AWS Trainium 或 AWSInferentia 芯片。通过使用 `linuxParameters` 参数并指定设备详细信息来执行此操作。有关更多信息，请参阅 [任务定义要求](#ecs-inference-requirements)。

## 使用经 Amazon ECS 优化的 Amazon Linux 2023（Neuron）AMI
<a name="ecs-inference-ami2023"></a>

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

我们建议您在启动 Amazon EC2 Trn1、Inf1 和 Inf2 实例时使用经 Amazon ECS 优化的 Amazon Linux 2023（Neuron）AMI。

您可以使用 AWS CLI 和以下命令检索当前经 Amazon ECS 优化的 Amazon Linux 2023（Neuron）AMI。

```
aws ssm get-parameters --names /aws/service/ecs/optimized-ami/amazon-linux-2023/neuron/recommended
```

## 任务定义要求
<a name="ecs-inference-requirements"></a>

要在 Amazon ECS 上部署 Neuron，您的任务定义必须包含预构建容器的容器定义，该容器服务于 TensorFlow 的 推理模型。它是由 AWS Deep Learning Containers 提供的。此容器包含 AWS Neuron 运行时和 TensorFlow 服务应用程序。在启动时，此容器将从 Amazon S3 获取您的模型，用保存的模型启动 Neuron TensorFlow 服务，并等待预测请求。在以下示例中，容器映像具有 TensorFlow 1.15 和 Ubuntu 18.04。GitHub 上维护了针对 Neuron 优化的预构建 Deep Learning Containers 的完整列表。有关更多信息，请参阅[使用 AWS Neuron TensorFlow Serving](https://docs.aws.amazon.com/dlami/latest/devguide/tutorial-inferentia-tf-neuron-serving.html)。

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

或者，您也可以构建自己的 Neuron 边车容器映像。有关更多信息，请参阅《AWS Deep Learning AMIs 开发人员指南》**中的[教程：Neuron TensorFlow Serving](https://github.com/aws-neuron/aws-neuron-sdk/blob/master/frameworks/tensorflow/tensorflow-neuron/tutorials/tutorials-tensorflow-utilizing-neuron-capabilities.rst)。

任务定义必须特定于一种实例类型。您必须将容器配置为使用主机容器实例上可用的特定 AWS Trainium 或 AWS Inferentia 设备。您还可以使用 `linuxParameters` 参数执行此操作。对于示例任务定义，请参阅 [在 Amazon ECS 任务定义中指定 AWS Neuron 机器学习](ecs-inference-task-def.md)。下表详细介绍了特定于每种实例类型的芯片。


| 实例类型 | vCPU | RAM (GiB) | AWS 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  | 
| trn2.48xlarge | 192 | 1536 | 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 | 

# 在 Amazon ECS 任务定义中指定 AWS Neuron 机器学习
<a name="ecs-inference-task-def"></a>

以下是 `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://amzn-s3-demo-bucket/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"
        }
    ]
}
```