

# 适用于 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/)（Inf1 是 EC2 启动类型支持的唯一实例）和 [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 实例（Inf1 是 EC2 启动类型支持的唯一实例）或 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 实例上获得性能提升。
+ Amazon ECS 支持两种配置 Neuron 设备访问权限的方法：
  + **托管 Neuron 设备分配**：在容器定义中使用类型为 `NeuronDevice` 的 `resourceRequirements` 参数。Amazon ECS 会自动发现 Neuron 设备并将其分配给容器。仅适用于托管实例。有关更多信息，请参阅 [托管 Neuron 设备分配](#ecs-inference-managed)。
  + **手动指定 Neuron 设备**：使用 `linuxParameters.devices` 参数明确指定 Neuron 设备路径。对 Amazon EC2 启动类型和托管实例都适用。有关更多信息，请参阅 [手动指定 Neuron 设备](#ecs-inference-ec2)。
**重要**  
始终使用一种方法以免产生冲突。

## 托管 Neuron 设备分配
<a name="ecs-inference-managed"></a>

对于托管实例，可使用容器定义中的 `resourceRequirements` 参数来请求 Neuron 设备。Amazon ECS 会自动发现实例上的 Neuron 设备、将其分配给任务，并将容器配置为可以访问该实例上的所有 Neuron 设备。由于该任务需要独占访问所有设备，因此每个实例仅运行一项 Neuron 任务。

**注意**  
`Inf1` 是 EC2 启动类型支持的唯一实例。要使用 Inf1 实例，请参阅[手动指定 Neuron 设备](#ecs-inference-ec2)。

### Neuron 实例选择
<a name="ecs-inference-managed-instance-selection"></a>

要为您的托管实例工作负载选择选择 Neuron 的实例类型，请使用容量提供程序的启动模板中的 `instanceRequirements` 对象。可使用以下属性选择支持 Neuron 的实例：
+ `acceleratorManufacturers`：使用 `amazon-web-services` 选择带有 AWS 加速器（包括 Inferentia 和 Trainium）的实例。
+ `acceleratorNames`：使用 `inferentia2`、`trainium` 或 `trainium2` 选择特定的加速器芯片。
+ `allowedInstanceTypes`：使用 `inf*` 和 `trn*` 按名称选择 Neuron 实例类型。

以下示例使用 `allowedInstanceTypes`：

```
{
    "instanceRequirements": {
        "allowedInstanceTypes": ["inf*", "trn*"]
    }
}
```

### 任务定义
<a name="ecs-inference-managed-task-def"></a>

要在任务定义中请求 Neuron 设备，需添加一个类型为 `NeuronDevice` 且值为 `ALL` 的 `resourceRequirements` 条目。这为容器提供了独占访问实例上所有 Neuron 设备的权限。

以下限制适用：
+ `resourceRequirements` 中最多只有一个容器定义可指定 `NeuronDevice`。
+ 在同一个任务定义中，不能将 Neuron 设备值为 `NeuronDevice` 和 `linuxParameters.devices` 的 `resourceRequirements` 合并起来。

任务开始后，可通过调用 `DescribeTasks` API 操作来验证 Neuron 设备分配。响应包括每个容器上都有一个 `neuronDeviceIds` 字段，显示所分配的 Neuron 设备的 ID。也可以调用 `DescribeContainerInstances` API 操作来查看容器实例的 `registeredResources` 和 `remainingResources` 字段中的 `NEURON_DEVICES`。

有关任务定义示例，请参阅[Neuron 任务定义示例](ecs-inference-task-def.md)。

## 手动指定 Neuron 设备
<a name="ecs-inference-ec2"></a>

通过这种方法，可在任务定义中使用 `linuxParameters.devices` 参数手动指定 AWS Trainium AWS 或 Inferentia 设备路径。这种方法对 EC2 启动类型和托管实例都适用。

每个 [AWS Trainium](https://aws.amazon.com/ai/machine-learning/trainium/) 或 [AWS Inferentia](https://aws.amazon.com/ai/machine-learning/inferentia/) 芯片上只能运行一个推理或推理训练任务。通过为每项任务分配不同的设备，就可以运行与实例上的芯片一样多的任务。

对于 EC2 启动类型，您可以在配置任务放置约束时，使用实例类型属性确保在指定的实例类型上启动任务。有关更多信息，请参阅 [Amazon ECS 如何将任务放置在容器实例上](task-placement.md)。

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

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


| 实例类型 | 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 | 

有关任务定义示例，请参阅[Neuron 任务定义示例](ecs-inference-task-def.md)。

### 托管实例
<a name="ecs-inference-manual-mi"></a>

托管实例会自动使用包含 Neuron 驱动程序的 AMI。无需其他 AMI 配置。

### EC2 启动类型
<a name="ecs-inference-manual-ec2"></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
```