Exécutez des conteneurs accélérés par GPU (Windows sur EC2 G-Series) - Amazon EKS

Aidez à améliorer cette page

Pour contribuer à ce guide de l’utilisateur, cliquez sur le lien Modifier cette page sur GitHub qui se trouve dans le volet droit de chaque page.

Exécutez des conteneurs accélérés par GPU (Windows sur EC2 G-Series)

Important

Le plug-in Kubernetes Device Plugin for DirectX de TensorWorks est un outil tiers qui n’est ni approuvé, ni pris en charge, ni maintenu par AWS. AWS n’assume aucune responsabilité quant à la sécurité, la fiabilité ou les performances de ce plug-in.

Découvrez comment exécuter des charges de travail de conteneurs Windows accélérées par GPU sur Amazon EKS (Elastic Kubernetes Service) à l’aide de GPU NVIDIA avec le plug-in Kubernetes Device Plugin for DirectX de TensorWorks. Pour plus d’informations, consultez Kubernetes Device Plugin for DirectX.

Il existe deux approches principales pour configurer l’accélération GPU pour vos conteneurs Windows :

  • Option 1 : créez une AMI EKS personnalisée optimisée pour Windows avec les pilotes de GPU requis préinstallés.

    • Utilisez cette approche lorsque vous avez besoin d’un environnement cohérent et préconfiguré, prêt à exécuter des conteneurs Windows accélérés par GPU, et que vous êtes en mesure d’investir les efforts supplémentaires nécessaires pour créer et maintenir l’AMI personnalisée.

  • Option 2 : installez les pilotes GPU nécessaires sur vos composants master EKS après le lancement de votre instance.

    • Utilisez cette approche lorsque vous souhaitez un processus de configuration plus simple et que vous n’avez pas d’objection à installer les pilotes GPU sur chaque nouveau composant master. Plus adapté à un environnement de développement lorsque vous évaluez ou prototypez des charges de travail accélérées par GPU.

Les deux approches peuvent être mises à profit en suivant les étapes décrites dans ce guide.

Considérations

Ce guide fournit les étapes à suivre pour installer et configurer l’accélération GPU pour vos conteneurs Windows à l’aide des GPU NVIDIA, des pilotes NVIDIA GRID et du plug-in Kubernetes Device Plugin for DirectX de TensorWorks. Les étapes ont été testées et vérifiées afin de fournir une accélération GPU pour vos charges de travail de conteneurs Windows sur Amazon EKS. Consultez Limitations connues pour plus d’informations sur les pilotes et les plug-ins d’appareils compatibles. Avant de démarrer, notez les points suivants :

  • Seuls les types d’instances de la famille G dotés de pilotes NVIDIA GRID ont été testés et vérifiés pour fonctionner avec ce guide. Bien que d’autres types d’instances et combinaisons de pilotes puissent également être capables d’exécuter des conteneurs Windows accélérés par GPU, ils peuvent nécessiter des étapes de configuration supplémentaires qui ne sont pas abordées dans ce guide.

  • Seules les charges de travail basées sur DirectX ont été testées et vérifiées pour fonctionner avec ce guide. Bien que d’autres API GPU telles que OpenGL, Vulkan et OpenCL puissent être compatibles avec l’exécution de conteneurs Windows accélérés par GPU, elles peuvent nécessiter des étapes de configuration supplémentaires qui ne sont pas abordées dans ce guide.

  • Il existe certaines limitations connues dont il faut tenir compte avant d’exécuter des conteneurs Windows accélérés par GPU. Pour plus d’informations, consultez la section Limitations connues.

Prérequis

Pour activer l’accélération GPU pour vos conteneurs Windows sur Amazon EKS, vous devez remplir les conditions suivantes avant de continuer :

  • Lancez un cluster Amazon EKS avec Kubernetes v1.27 ou une version plus récente.

  • Fournir des nœuds Windows avec Windows Server 2022 ou une version plus récente.

  • Fournissez des nœuds Windows dans la famille G de types d’instances, tels que G4 ou G5.

  • Provisionnez des nœuds Windows avec une exécution de conteneur avec containerd 1.7.x ou 2.x.x. (Consultez Récupérez les informations relatives à la version des AMI Windows pour vérifier la version de containerd dans votre AMI optimisée Amazon EKS.)

Installation du pilote GPU sur chaque nœud Windows

Pour installer les pilotes NVIDIA GRID sur vos composants master EKS, suivez les étapes décrites dans Pilotes NVIDIA pour votre instance Amazon EC2. Accédez aux options d’installation – Option 3 : Pilotes GRID et suivez les étapes d’installation.

Installation pour Windows Server Core

Pour Windows Server Core, qui ne dispose pas d’une expérience de bureau, installez les pilotes NVIDIA GRID en mode silencieux à l’aide des commandes suivantes :

$nvidiaInstallerFilePath = nvidia-driver-installer.exe # Replace with path to installer $installerArguments = "-s -clean -noreboot -noeula" Start-Process -FilePath $nvidiaInstallerFilePath -ArgumentList $installerArguments -Wait -NoNewWindow -PassThru

Vérification de votre installation

Exécutez la commande PowerShell suivante pour afficher les informations de diagnostic relatives aux GPU de l’instance :

nvidia-smi

Cette commande affiche la version du pilote NVIDIA, ainsi que des informations sur le matériel GPU. Assurez-vous que le résultat de cette commande correspond à la version du pilote NVIDIA GRID que vous pensiez avoir installée.

Déploiement du plug-in du périphérique GPU sur chaque nœud

Pour permettre la détection et l’exposition des ressources GPU aux conteneurs sur vos nœuds Windows, vous aurez besoin d’un plug-in de périphérique. Déployez le plug-in DirectX Device de Tensorworks sur chaque composant master en l’exécutant en tant que DaemonSet dans votre cluster EKS. Suivez le guide d’installation spécifié dans le fichier README.md, qui comprend les étapes suivantes. Il est recommandé de :

  • Déployez le plug-in de l’appareil dans l’espace de noms kube-system.

  • Définissez des limites de ressources appropriées pour le DaemonSet afin de vous assurer qu’il ne consomme pas trop de ressources sur vos nœuds.

Note

Le plug-in DaemonSet s’exécutera sur chaque nœud en tant que conteneur de processus hôte avec des privilèges élevés. Il est recommandé de mettre en œuvre des contrôles RBAC pour restreindre l’accès à ce DaemonSet afin que seuls les utilisateurs autorisés puissent exécuter des commandes privilégiées.

Lors de l’exécution de conteneurs accélérés par GPU, le plug-in de périphérique prend en charge deux modes :

  • Mode à locataire unique : ce mode consacre toutes les ressources GPU à un seul conteneur sur l’instance. Installez les plug-ins de périphérique avec prise en charge de la location unique à l’aide de la commande suivante. Consultez README.md pour plus d’informations.

    kubectl apply -f "https://raw.githubusercontent.com/TensorWorks/directx-device-plugins/main/deployments/default-daemonsets.yml"
  • Mode à locataire multiple : ce mode permet de partager les ressources GPU entre plusieurs conteneurs de l’instance. Installez les plug-ins de périphériques avec prise en charge multi-locataires à l’aide de la commande suivante. Consultez README.md pour plus d’informations.

    kubectl apply -f "https://raw.githubusercontent.com/TensorWorks/directx-device-plugins/main/deployments/multitenancy-inline.yml"

    Vous pouvez également utiliser un ConfigMap pour spécifier la mutualisation.

    kubectl apply -f "https://raw.githubusercontent.com/TensorWorks/directx-device-plugins/main/deployments/multitenancy-configmap.yml"

Vérification du déploiement du plug-in de l’appareil

Après avoir déployé le plug-in du périphérique, remplacez <namespace> et exécutez la commande suivante pour vérifier que le plug-in DirectX Device Plugin fonctionne correctement sur tous vos nœuds Windows.

kubectl get ds device-plugin-wddm -n <namespace>

Vérifier que les conteneurs sont prêts à être déployés

Une fois que le plug-in DaemonSet du périphérique est exécuté sur les composants master Windows équipés de GPU, utilisez la commande suivante pour vérifier que chaque nœud dispose de GPU allouables. Le nombre correspondant doit correspondre au nombre de périphériques DirectX sur chaque nœud.

kubectl get nodes "-o=custom-columns=NAME:.metadata.name,DirectX:.status.allocatable.directx\.microsoft\.com/display"

Exécution de conteneurs Windows avec accélération par GPU

Avant de lancer vos pods, spécifiez le nom de la ressource directx.microsoft.com/display dans .spec.containers[].resources. Cela indiquera que vos conteneurs nécessitent des capacités compatibles avec le GPU, et le kube-scheduler tentera de placer vos pods sur votre nœud Windows préconfiguré disposant de ressources GPU disponibles.

À titre d’exemple, voir la commande ci-dessous qui lance un Job pour exécuter une simulation Monte Carlo afin d’estimer la valeur de pi. Cet exemple est tiré du référentiel GitHub Kubernetes Device Plugins for DirectX, qui propose plusieurs exemples que vous pouvez exécuter pour tester les capacités GPU de votre nœud Windows.

cat <<EOF | kubectl apply -f - apiVersion: batch/v1 kind: Job metadata: name: example-cuda-montecarlo-wddm spec: template: spec: containers: - name: example-cuda-montecarlo-wddm image: "index.docker.io/tensorworks/example-cuda-montecarlo:0.0.1" resources: limits: directx.microsoft.com/display: 1 nodeSelector: "kubernetes.io/os": windows restartPolicy: Never backoffLimit: 0 EOF

Limitations connues

Tous les GPU sont utilisables

Tous les GPU de l’instance seront utilisables par chaque conteneur en cours d’exécution sur l’hôte, même si vous demandez un nombre spécifique de GPU pour un conteneur donné. De plus, par défaut, tous les conteneurs exécutés sur l’hôte utilisent le GPU avec l’index 0, même si plusieurs GPU sont disponibles sur le nœud. Ainsi, pour que les tâches multi-GPU fonctionnent correctement, vous devez désigner explicitement le périphérique GPU spécifique à utiliser dans le code de votre application.

La mise en œuvre exacte pour attribuer un périphérique à utiliser pour l’application dépendra du langage de programmation ou du cadre que vous utilisez. Par exemple, si vous utilisez la programmation CUDA, pour sélectionner un GPU spécifique, vous pouvez spécifier explicitement le périphérique à utiliser dans le code de votre application à l’aide de la fonction cudaSetDevice().

La nécessité de spécifier explicitement le périphérique est due à un problème connu affectant les conteneurs Windows. Vous pouvez suivre les progrès réalisés dans la résolution de ce problème dans le numéro #333 de Microsoft/Windows-Containers. Le tableau suivant représente une représentation visuelle et un exemple pratique de ce comportement d’allocation de GPU.

Considérons un scénario dans lequel il existe un seul nœud Windows de l’instance EC2 type g4dn.12xlarge, équipé de quatre GPU. Imaginons un scénario dans lequel trois pods sont lancés sur cette instance. Le tableau montre que, quel que soit le nombre de GPU demandé par chaque conteneur, les trois pods ont accès aux quatre GPU de l’instance et utilisent par défaut le GPU avec l’index de périphérique 0.

Pod GPU demandés Accès GPU réel Utilisation de GPU par défaut Indices de GPU disponibles Total des GPU d’instance

Pod 1

1 GPU

Les 4 GPU

GPU avec indice 0

0, 1, 2, 3

4

Pod 2

2 GPU

Les 4 GPU

GPU avec indice 0

0, 1, 2, 3

4

Pod 3

1 GPU

Les 4 GPU

GPU avec indice 0

0, 1, 2, 3

4

Prise en charge du plug-in Kubernetes

L’implémentation officielle par NVIDIA du plug-in pour appareil Kubernetes n’est pas compatible avec Windows. Vous pouvez suivre la progression de l’ajout du support officiel pour Windows dans le numéro #419 de NVIDIA/k8s-device-plug-in.

Limitations des instances de calcul GPU

En fonction de la configuration de votre compte AWS, vous pouvez être soumis à des limites de service concernant le nombre et les types d’instances de calcul GPU Amazon EC2 que vous pouvez lancer. Si vous avez besoin d’une capacité supplémentaire, vous pouvez demander une augmentation de quota.

Doit créer une AMI optimisée pour le GPU pour Windows

Amazon EKS ne fournit aucun composant géré EKS Windows GPU Optimized AMI ou EC2 Image Builder. Vous devrez suivre les étapes décrites dans ce guide pour créer une AMI EKS Windows Optimized personnalisée avec les pilotes GPU requis préinstallés, ou installer les pilotes GPU nécessaires sur vos composants master EKS après avoir lancé vos instances.

Inferentia et Trainium ne sont pas pris en charge

Les charges de travail basées sur AWS Inferentia et AWSTrainium ne sont pas prises en charge sous Windows.