View a markdown version of this page

Partagez des GPU sur Amazon ECS - Amazon Elastic Container Service

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Partagez des GPU sur Amazon ECS

De nombreuses charges de travail GPU, telles que l'inférence et la diffusion de petits modèles, n'utilisent qu'une fraction du calcul et de la mémoire d'un GPU. Sans partage, le reste de cette capacité reste inactif. Avec Amazon ECS, vous pouvez partager un seul document physique NVIDIA GPU sur plusieurs conteneurs, ce qui vous permet de regrouper davantage de charges de travail sur le même matériel et de réduire le gaspillage de GPU.

Avec Amazon ECS, vous pouvez utiliser NVIDIA Multi-Process Service (MPS) pour le partage de GPU. MPS est un NVIDIA CUDA fonctionnalité qui exécute plusieurs processus simultanément sur le même GPU, ce qui améliore l'utilisation du GPU et réduit les frais liés au changement de contexte. MPS fournit un partitionnement de la mémoire et du calcul, de sorte que chaque conteneur bénéficie d'une limite de mémoire configurable et d'un plafond de calcul optionnel.

Amazon ECS gère MPS pour toi. Il démarre le MPS démon sur les instances GPU, place les conteneurs sur les GPU en fonction de la mémoire disponible et applique des limites par conteneur.

MPS fournit un partage au niveau logiciel plutôt qu'un partitionnement au niveau matériel. Pour plus d'informations sur MPS, voir Multi-Process Service dans le NVIDIA documentation.

Amazon ECS prend en charge le partage de GPU avec MPS sur les instances gérées Amazon ECS et Amazon ECS sur Amazon EC2.

Quand utiliser le partage GPU

Partage de GPU avec MPS convient parfaitement pour :

  • Charges de travail d'inférence, génération d'intégration et serveurs de petits modèles qui n'utilisent pas pleinement un GPU

  • Multi-model serveur où plusieurs modèles peuvent partager un seul GPU

  • les environnements de développement et de test,

  • Exécution de plusieurs charges de travail GPU légères sur le même matériel pour réduire les coûts

Le partage de GPU n'est pas recommandé pour :

  • Entraînement sur grands modèles nécessitant toute la mémoire du GPU

  • Charges de travail sensibles aux défaillances du processeur graphique provenant de conteneurs voisins, car MPS est un partage au niveau logiciel et tous les conteneurs d'un GPU partagent la même chose CUDA contexte

  • Charges de travail nécessitant une isolation matérielle entre les processus

Comment fonctionne le partage de GPU

Vous configurez le partage GPU dans la définition du conteneur d'une définition de tâche. Dans chaque contenant resourceRequirements, vous fournissez un sharingStrategy avec une valeur de mémoire GPU au lieu de spécifier un entier dans value pour un GPU dédié.

Lorsqu'Amazon ECS place une tâche qui utilise le partage GPU, il additionne la mémoire GPU demandée par tous les conteneurs GPU de la tâche et recherche un GPU disposant de suffisamment de mémoire libre. Tous les conteneurs GPU d'une même tâche sont placés sur le même GPU physique. Si la tâche demande 4 000 Mo sur deux conteneurs, Amazon ECS trouve un seul GPU avec au moins 4 000 Mo de mémoire restante et y place les deux conteneurs.

Plusieurs tâches peuvent également partager le même GPU physique. Tant qu'il reste suffisamment de mémoire sur un GPU, Amazon ECS peut lui confier des tâches supplémentaires, même si ces tâches proviennent de différents services. Une tâche qui partage un GPU et une tâche qui utilise un GPU dédié peuvent être exécutées sur la même instance, sur des GPU différents.

Sur les instances gérées Amazon ECS, Amazon ECS surveille l'état des GPU et MPS démon sur chaque instance. Si Amazon ECS détecte une défaillance matérielle du processeur graphique ou MPS en cas de défaillance du démon, il vide l'instance et la remplace. Pour plus d'informations sur la réparation automatique des GPU, consultez Réparation automatique du processeur graphique pour les instances gérées par Amazon ECS.

Configurer le partage du GPU

Pour partager un GPU, ajoutez sharingStrategy s'opposer à resourceRequirements de chaque conteneur GPU dans votre définition de tâche. Le sharingStrategy l'objet contient un nvidiaMps objet avec les champs suivants. Pour plus d’informations sur resourceRequirements, consultez Besoins en ressources.

memory

Obligatoire : oui

Limite de mémoire GPU pour le conteneur, en MiB. Cette valeur représente un plafond strict de la mémoire GPU que le conteneur peut utiliser. La valeur doit être supérieure à 0.

Pour connaître la mémoire GPU totale disponible sur une instance, utilisez le DescribeContainerInstances API (la totalMemoryInMiB champ) ou vérifiez les spécifications du GPU pour votre type d'instance.

maxComputePercent

Obligatoire : non

Le pourcentage maximum de calcul GPU que le conteneur peut utiliser, sous la forme d'un entier de 1 pour 100. Cela limite l'utilisation du processeur graphique du conteneur, et non une réservation. Lorsqu'un conteneur est inactif, son calcul inutilisé est disponible pour d'autres conteneurs sur le même GPU, chacun d'entre eux pouvant utiliser le sien maxComputePercent valeurs. Si vous ne spécifiez pas ce paramètre, le conteneur peut utiliser jusqu'à 100 pour cent.

Amazon ECS place les tâches uniquement en fonction de la mémoire du GPU, de sorte qu'il ne prend pas en compte le calcul lors de la prise de décisions de placement.

Vous pouvez définir la stratégie de partage dans l'éditeur de définition des tâches de la console Amazon ECS, ou avec JSON, AWS CLI, ou l'API.

Amazon ECS définit les variables d'environnement réservées suivantes dans chaque conteneur qui partage un GPU. Ne définissez pas ces variables dans la définition de votre conteneur.

  • CUDA_MPS_PINNED_DEVICE_MEM_LIMIT pour la limite de mémoire

  • CUDA_MPS_ACTIVE_THREAD_PERCENTAGE pour le plafond de calcul

L'exemple de définition de tâche suivant exécute deux conteneurs d'inférence qui partagent un GPU avec MPS, ainsi qu'un conteneur sidecar non GPU. Chaque conteneur GPU demande une quantité différente de mémoire GPU et de calcul.

Dans l'exemple suivant, remplacez account-id avec votre AWS ID de compte.

{ "family": "mps-inference", "networkMode": "awsvpc", "executionRoleArn": "arn:aws:iam::account-id:role/ecsTaskExecutionRole", "containerDefinitions": [ { "name": "model-a", "image": "nvidia/cuda:12.0.0-base-ubuntu22.04", "essential": true, "resourceRequirements": [ { "type": "GPU", "sharingStrategy": { "nvidiaMps": { "memory": 12288, "maxComputePercent": 50 } } } ] }, { "name": "model-b", "image": "nvidia/cuda:12.0.0-base-ubuntu22.04", "essential": true, "resourceRequirements": [ { "type": "GPU", "sharingStrategy": { "nvidiaMps": { "memory": 8192, "maxComputePercent": 25 } } } ] }, { "name": "log-router", "image": "public.ecr.aws/aws-observability/aws-for-fluent-bit:stable", "essential": false } ], "requiresCompatibilities": [ "MANAGED_INSTANCES" ], "cpu": "4096", "memory": "8192" }

Règles de validation

Amazon ECS applique les règles suivantes aux configurations de partage de GPU :

  • Un besoin en ressources GPU utilise soit value (un GPU dédié) ou sharingStrategy (un GPU partagé), mais pas les deux. Lorsque vous spécifiez sharingStrategy, vous devez omettre value.

  • Tous les conteneurs GPU d'une tâche doivent utiliser la même stratégie de partage. Si un contenant utilise sharingStrategy, aucun autre conteneur de cette tâche ne peut demander un GPU dédié avec value.

  • Le memory la valeur est requise et doit être supérieure à 0.

  • La valeur maxComputePercent est facultative. Si vous le spécifiez, la valeur doit être un entier compris entre 1 pour 100.

  • Pour les instances gérées Amazon ECS, la tâche requiresCompatibilities doit inclure MANAGED_INSTANCES. Pour Amazon ECS sur Amazon EC2, utilisez EC2 type de lancement.

  • Le partage GPU n'est pas pris en charge pour les définitions de tâches qui nécessitent EXTERNAL compatibilité (Amazon ECS Anywhere).

  • Vous ne pouvez pas spécifier sharingStrategy dans une dérogation de conteneur. Dérogations de conteneurs dans le RunTask et StartTask les requêtes ne prennent pas en charge la configuration de partage du GPU, alors définissez sharingStrategy dans la définition de la tâche à la place. Les services exécutent la définition de tâche telle qu'elle est enregistrée et ne sont pas affectés.

Configurer le partage GPU par type de lancement

Avec Amazon ECS Managed Instances, Amazon ECS sélectionne et gère les instances GPU pour vous. Vous n'avez besoin d'aucune configuration au-delà de la définition de la tâche.

Avec Amazon ECS sur Amazon EC2, lancez un NVIDIA Instance GPU avec Amazon ECS AL2023 GPU-optimized AMI. Partage de GPU avec MPS sur Amazon ECS sur Amazon EC2 nécessite la version agent de conteneur Amazon ECS 1.107.0 ou version ultérieure et Amazon ECS AL2023 GPU-optimized Version AMI 20261019 ou plus tard. Une fois l'instance enregistrée auprès de votre cluster, la configuration de définition des tâches est la même que pour les instances gérées Amazon ECS.

Considérations

  • Partage de GPU avec MPS est compatible avec les modèles G4dn, G5, G6, G6e, G7, G7e, P3, P4d, P5, P5e, P5en et P6-B200 familles d'instances. Le partage de GPU n'est pas pris en charge sur AWS Fargate, Amazon ECS Express Mode ou tâches de démon gérées par Amazon ECS.

  • Partage de GPU avec MPS sur Amazon ECS sur Amazon EC2 nécessite la version agent de conteneur Amazon ECS 1.107.0 ou version ultérieure et Amazon ECS AL2023 GPU-optimized Version AMI 20261019 ou plus tard.

  • Exécutez un seul processus GPU par conteneur lorsque vous utilisez NVIDIA MPS pour le partage de GPU. Pour les applications qui nécessitent plusieurs processus GPU, configurez la mémoire GPU requise en fonction de l'utilisation maximale combinée de la mémoire de tous les processus. Utilisez les contrôles au niveau de l'application pour maintenir la consommation totale dans les limites de la valeur configurée. Amazon ECS utilise cette valeur pour déterminer l'emplacement des conteneurs sur les GPU partagés. Par conséquent, les applications multiprocessus peuvent consommer plus de mémoire GPU que ce qui est configuré, ce qui peut entraîner des problèmes de mémoire.

  • Si un conteneur déclenche une erreur GPU fatale, telle qu'un accès illégal à la mémoire depuis un noyau GPU défectueux, les conteneurs partageant ce GPU physique peuvent être affectés. Les conteneurs des autres GPU de la même instance ne sont pas affectés.

  • Le maxComputePercent La valeur est un plafond et non une réservation garantie. Lorsqu'un conteneur est inactif, son calcul inutilisé est disponible pour d'autres conteneurs sur le même GPU, chacun d'entre eux pouvant utiliser le sien maxComputePercent valeurs.

  • Le partage GPU n'est pas pris en charge pour les définitions de tâches qui nécessitent EXTERNAL compatibilité (Amazon ECS Anywhere).

  • Les tâches provenant de différents services utilisant le même fournisseur de capacité peuvent être placées sur le même GPU. Pour empêcher les tâches de différents services de partager un GPU, utilisez des fournisseurs de capacité distincts ou des clusters distincts pour ces services.

  • Pour les GPU partagés avec MPS, Amazon ECS n'émet pas les métriques GPU suivantes par tâche et par conteneur :

    • Le TaskGPUUtilization et ContainerGPUUtilization métriques.

    • Le TaskGPUMemoryUtilization et ContainerGPUMemoryUtilization métriques.

    • Le TaskGPUMemoryTotal et ContainerGPUMemoryTotal métriques.

    • Le TaskGPUMemoryUsed et ContainerGPUMemoryUsed métriques.

  • Les métriques GPU par tâche et par conteneur suivantes restent disponibles pour les GPU partagés avec MPS:

    • Le TaskGPUPowerDraw et ContainerGPUPowerDraw métriques.

    • Le TaskGPUTemperature et ContainerGPUTemperature métriques.

    • Le TaskGPURestartAppXidCount et ContainerGPURestartAppXidCount métriques.

  • Instance-level Les métriques du GPU restent disponibles, notamment InstanceGPUUsageTotal et InstanceGPULimit.

Surveillez le partage du GPU

Vous pouvez confirmer qu'un GPU est partagé et suivre son utilisation à l'aide de l'API Amazon ECS et d'Amazon CloudWatch métriques.

Confirmez qu'un GPU est partagé

Pour confirmer qu'un GPU est partagé, appelez le DescribeContainerInstances API. La réponse inclut gpuDevices champ avec le mode de partage, le nombre de conteneurs et la mémoire restante pour chaque GPU. Voici un exemple de réponse.

{ "containerInstances": [ { "ec2InstanceId": "i-0c74b75400ab4228d", "runningTasksCount": 1, "gpuDevices": [ { "gpuId": "GPU-70d3bdaf-8635-81e0-8e44-446248a92c83", "sharingMode": "NVIDIA_MPS", "totalMemoryInMiB": 22587, "remainingMemoryInMiB": 16587, "containerCount": 2 } ] } ] }

Afficher la configuration par tâche

Pour afficher la configuration de partage pour chaque tâche, appelez le DescribeTasks API. Chaque contenant gpuSharingStrategy affiche ses limites de mémoire et de calcul, et les conteneurs qui partagent un GPU répertorient la même valeur dans gpuIds. Voici un exemple de réponse.

{ "tasks": [ { "lastStatus": "RUNNING", "launchType": "MANAGED_INSTANCES", "containers": [ { "name": "mps-a", "gpuIds": ["GPU-70d3bdaf-8635-81e0-8e44-446248a92c83"], "gpuSharingStrategy": { "nvidiaMps": { "memory": 4000, "maxComputePercent": 50 } } }, { "name": "mps-b", "gpuIds": ["GPU-70d3bdaf-8635-81e0-8e44-446248a92c83"], "gpuSharingStrategy": { "nvidiaMps": { "memory": 2000, "maxComputePercent": 50 } } } ] } ] }

Suivez l'utilisation du GPU

  • Densité de tâches plus élevée: avec le partage de GPU, davantage de tâches sont exécutées sur la même instance. Utilisez le RunningTaskCount métrique permettant de comparer le nombre de tâches par service avant et après l'activation du partage. Pour la densité de tâches par instance, utilisez le instance_number_of_running_tasks métrique, qui CloudWatch Container Insights collecte pour chaque instance EC2 lorsque vous déployez CloudWatch agent pour collecter des métriques au niveau de l'instance EC2.

  • Moins de GPU pour une charge de travail identique: Les InstanceGPUUsageTotal métrique en CloudWatch Container Insights indique le nombre de GPU physiques utilisés. Avec MPS, la même charge de travail utilise moins de GPU.

  • Hauteur du processeur graphique de l'instance: Comparez InstanceGPUUsageTotal avec InstanceGPULimit pour voir le niveau de remplissage d'une instance. Avec MPS, davantage de tâches peuvent être effectuées avant qu'une instance ne soit à court de GPU.