在 Amazon ECS 任务定义中指定 GPU 数
要在容器实例和 Docker GPU 运行时上使用 GPU,请确保在任务定义中指定容器所需的 GPU 数量。您可以指定整数值、小数值(适用于分片 GPU)或 ALL。当指定 ALL 时,容器实例上的所有 GPU 都将分配给容器。如果指定小数值(例如 0.25),Amazon ECS 会将任务放置到提供所请求 GPU 容量的分片 GPU 实例上。由于已放置支持 GPU 的容器,Amazon ECS 容器代理会将所需数量的物理 GPU 固定到相应的容器中。为某个任务中的所有容器预留的 GPU 的数量不能超过该任务在其上启动的容器实例的可用 GPU 的数量。有关更多信息,请参阅 使用控制台创建 Amazon ECS 任务定义。
重要
如果任务定义中未指定 GPU 要求,则任务将使用原定设置 Docker 运行时。
下面显示了任务定义中的 GPU 要求的 JSON 格式:
{ "containerDefinitions": [ { ... "resourceRequirements" : [ { "type" : "GPU", "value" : "2" } ], }, ... }
要将容器实例上的所有 GPU 分配给容器,也可以将容器实例上 ALL 指定为值而非数字。
以下示例演示了指定 GPU 要求的 Docker 容器的语法。此容器使用两个 GPU,运行 nvidia-smi 实用程序,然后退出。
{ "containerDefinitions": [ { "memory": 80, "essential": true, "name": "gpu", "image": "nvidia/cuda:11.0.3-base", "resourceRequirements": [ { "type":"GPU", "value": "2" } ], "command": [ "sh", "-c", "nvidia-smi" ], "cpu": 100 } ], "family": "example-ecs-gpu" }
以下示例任务定义展示了一个打印可用 GPU 数量的 TensorFlow 容器。该任务在 Amazon ECS 托管实例上运行,需要一个 GPU,并使用 g4dn.xlarge 实例。
{ "family": "tensorflow-gpu", "networkMode": "awsvpc", "executionRoleArn": "arn:aws:iam::account-id:role/ecsTaskExecutionRole", "containerDefinitions": [ { "name": "tensorflow", "image": "tensorflow/tensorflow:latest-gpu", "essential": true, "command": [ "python", "-c", "import tensorflow as tf; print('Num GPUs Available: ', len(tf.config.list_physical_devices('GPU')))" ], "resourceRequirements": [ { "type": "GPU", "value": "1" } ], "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-group": "/ecs/tensorflow-gpu", "awslogs-region": "region", "awslogs-stream-prefix": "ecs" } } } ], "requiresCompatibilities": [ "MANAGED_INSTANCES" ], "cpu": "4096", "memory": "8192", }
指定分片 GPU
Amazon ECS 支持在 Amazon EC2 G6f 实例上进行分片 GPU 调度。G6f 实例提供 NVIDIA L4 GPU 的硬件分区式分片,每个实例会提供一个固定 GPU 分片(1/8、1/4 或 1/2),并具有专属 GPU 内存和计算资源。要使用分片 GPU,请在容器定义的 resourceRequirements 中指定一个小数值:
"resourceRequirements": [ { "type": "GPU", "value": "0.25" } ]
支持的分片值及其对应的 G6f 实例类型如下:
| GPU 值 | GPU 分片 | GPU 内存 | 实例类型 |
|---|---|---|---|
0.125 |
1/8 GPU | 3 GB | g6f.large、g6f.xlarge |
0.25 |
1/4 GPU | 6 GB | g6f.2xlarge |
0.5 |
1/2 GPU | 12 GB | g6f.4xlarge、gr6f.4xlarge |
以下示例任务定义在一个具有 1/4 NVIDIA L4 GPU(6 GB GPU 内存)的分片 GPU 上运行一个轻量级推理容器:
{ "family": "fractional-gpu-inference", "networkMode": "awsvpc", "executionRoleArn": "arn:aws:iam::account-id:role/ecsTaskExecutionRole", "containerDefinitions": [ { "name": "inference", "image": "nvidia/cuda:12.0.0-base-ubuntu22.04", "essential": true, "command": ["nvidia-smi"], "resourceRequirements": [ { "type": "GPU", "value": "0.25" } ], "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-group": "/ecs/fractional-gpu-inference", "awslogs-region": "region", "awslogs-stream-prefix": "ecs" } } } ], "requiresCompatibilities": [ "MANAGED_INSTANCES" ], "cpu": "2048", "memory": "4096" }
分片 GPU 注意事项
-
每个任务中只有一个容器可以请求分片 GPU 值。如果一个容器指定了分片 GPU,则该任务定义中的其他容器不能有 GPU 资源要求。
-
整数值(
1、2等)视为完整 GPU 请求,只能放置到具有完整 GPU 容量的实例上。小数值(0.125、0.25、0.5)视为分片 GPU 请求,将放置到具有相应分片 GPU 分区的实例上。 -
可以在同一个容量提供程序中同时包含分片 GPU 实例(G6f)和完整 GPU 实例(例如 g5 或 g6)。Amazon ECS 会根据声明的 GPU 值将任务路由到正确的实例类型。无需为每个 GPU 系列单独配置容量提供程序。
-
可以将分片 GPU 调度功能与 Amazon ECS 托管实例和 Amazon EC2 上的 Amazon ECS 配合使用。Fargate 和 Amazon ECS Anywhere 不支持分片 GPU 调度。
-
对于完整 GPU 工作负载,请与以前一样继续使用整数值:
"value": "1"。