Especificación de GPU en una definición de tareas de Amazon ECS
Para utilizar las GPU en una instancia de contenedor y el tiempo de ejecución de GPU de Docker, asegúrese de designar el número de GPU que requiere el contenedor en la definición de tareas. Puede especificar un valor entero, un valor decimal para las GPU fraccionarias o ALL. Cuando especifica ALL, todas las GPU de la instancia de contenedor se asignan al contenedor. Cuando especifica un valor decimal, como 0.25, Amazon ECS asigna la tarea a una instancia de GPU fraccionaria que proporciona la capacidad de GPU solicitada. Cuando haya contenedores que admiten GPU, el agente de contenedores de Amazon ECS fijará el número deseado de GPU físicas en el contenedor correspondiente. El número de unidades GPU reservadas para todos los contenedores de una tarea no puede superar el número de GPU disponibles en la instancia de contenedor en la que se lanza la tarea. Para obtener más información, consulte Creación de una definición de tareas de Amazon ECS mediante la consola.
importante
Si los requisitos de GPU no se especifican en la definición de tareas, la tarea utilizará el tiempo de ejecución predeterminado de Docker.
A continuación, se muestra el formato JSON de los requisitos de GPU en una definición de tareas:
{ "containerDefinitions": [ { ... "resourceRequirements" : [ { "type" : "GPU", "value" : "2" } ], }, ... }
También puede especificar ALL como valor en lugar de un número para asignar todas las GPU de la instancia de contenedor al contenedor.
El ejemplo siguiente muestra la sintaxis de un contenedor de Docker que especifica un requisito de GPU. Este contenedor utiliza dos GPU, ejecuta la utilidad nvidia-smi y, luego, se cierra.
{ "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" }
El siguiente ejemplo de definición de tarea muestra un contenedor de TensorFlow que imprime el número de GPU disponibles. La tarea se pone en marcha en instancias administradas de Amazon ECS, requiere una GPU y utiliza una instancia de 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", }
Especificar GPU fraccionarias
Amazon ECS admite la programación fraccionada de GPU con instancias G6f de Amazon EC2. Las instancias G6f proporcionan fracciones de una GPU NVIDIA L4 particionadas por hardware, donde cada instancia expone un segmento fijo de GPU (1/8, 1/4 o 1/2) con memoria de GPU y procesamiento dedicados. Para usar una GPU fraccionaria, especifique un valor decimal en la definición de su contenedor resourceRequirements:
"resourceRequirements": [ { "type": "GPU", "value": "0.25" } ]
Los valores fraccionarios admitidos y sus tipos de instancia G6f correspondientes son:
| Valor de GPU | Fracción de GPU | Memoria de GPU | Tipos de instancias |
|---|---|---|---|
0.125 |
GPU 1/8 | 3 GB | g6f.large, g6f.xlarge |
0.25 |
GPU 1/4 | 6 GB | g6f.2xlarge |
0.5 |
GPU 1/2 | 12 GB | g6f.4xlarge, gr6f.4xlarge |
El siguiente ejemplo de definición de tarea ejecuta un contenedor de inferencias ligero en una GPU fraccionaria con 1/4 de GPU NVIDIA L4 (memoria de GPU de 6 GB):
{ "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" }
Consideraciones sobre GPU fraccionarias
-
Solo un contenedor por tarea puede solicitar un valor de GPU fraccionario. Si un contenedor especifica una GPU fraccionaria, ningún otro contenedor de esa definición de tarea puede requerir recursos de GPU.
-
Los valores enteros (
1,2, etc.) se tratan como solicitudes de GPU completas y solo se colocan en instancias con capacidad total de GPU. Los valores decimales (0.125,0.25,0.5) se tratan como solicitudes fraccionarias de GPU y se colocan en las instancias con la partición fraccionaria de GPU correspondiente. -
Puede incluir tanto instancias de GPU fraccionarias (G6f) como instancias de GPU completas (como g5 o g6) en el mismo proveedor de capacidad. Amazon ECS asigna las tareas al tipo de instancia adecuado según el valor de GPU declarado. No necesita proveedores de capacidad distintos para cada familia de GPU.
-
Puede utilizar la programación fraccionaria de la GPU con las instancias administradas de Amazon ECS y Amazon ECS en Amazon EC2. Fargate y Amazon ECS Anywhere no admiten la programación fraccionaria de GPU.
-
Para cargas de trabajo de GPU completas, siga utilizando valores enteros como antes:
"value": "1".