GPU

Cette page vous explique comment utiliser les accélérateurs matériels de GPU NVIDIA® dans les nœuds de vos clusters Google Kubernetes Engine (GKE).

Présentation

GKE vous permet de créer des pools de nœuds équipés de GPU NVIDIA Tesla® K80, P100, P4, V100 et T4. Les GPU fournissent une puissance de calcul permettant de mener des tâches de deep learning telles que la reconnaissance d'image ou le traitement du langage naturel, ainsi que d'autres tâches gourmandes en ressources de calcul, telles que le transcodage de vidéos et le traitement d'images.

Vous pouvez également utiliser des GPU avec des VM préemptives si vos charges de travail peuvent tolérer les perturbations fréquentes des nœuds. L'utilisation de VM préemptives réduit le coût d'exécution des GPU. Pour en savoir plus, consultez la page GPU sur des instances préemptives.

Exigences

Les exigences des GPU sur GKE sont les suivantes :

Version de Kubernetes
Pour les pools de nœuds utilisant l'image de nœud Container-Optimized OS, les nœuds GPU sont disponibles à partir de la version GKE 1.9 ou ultérieure. Pour les pools de nœuds utilisant l'image de nœud Ubuntu, les nœuds GPU sont disponibles à partir de la version GKE 1.11.3 ou ultérieure.
Quota de GPU

Pour créer des nœuds GPU, vous devez disposer d'un quota de GPU Compute Engine dans la zone souhaitée. Pour vous assurer que vous disposez d'un quota de GPU suffisant dans votre projet, consultez la page Quotas dans Google Cloud Console.

En cas de besoin, vous devez demander un quota de GPU supplémentaire dans Cloud Console. Si vous disposez d'un compte de facturation établi, ce quota sera automatiquement attribué à votre projet après l'envoi de la demande de quota.

Pilotes de GPU NVIDIA

Vous devez installer manuellement des pilotes de GPU NVIDIA sur les nœuds. Cette procédure est présentée à la section Installer des pilotes d'appareils GPU NVIDIA sur cette même page.

Limites

Avant d'utiliser des GPU sur GKE, gardez à l'esprit les limites suivantes :

  • Vous ne pouvez pas ajouter de GPU à des pools de nœuds existants.
  • Les nœuds GPU ne peuvent pas être migrés à chaud lors d'événements de maintenance.

Disponibilité

Les GPU sont disponibles dans des régions et zones spécifiques. Lorsque vous demandez un quota de GPU, prenez en compte les régions dans lesquelles vous souhaitez exécuter les clusters.

Pour obtenir la liste complète des régions et des zones concernées, consultez la page GPU sur Compute Engine.

Vous pouvez également consulter les GPU disponibles dans votre zone à l'aide de l'outil de ligne de commande gcloud.

gcloud

Pour afficher la liste de tous les types d'accélérateurs GPU acceptés dans chaque zone, exécutez la commande suivante :

gcloud compute accelerator-types list

Tarifs

Pour obtenir plus d'informations sur le prix des GPU, consultez la grille tarifaire sur la page "GPU" de GCP.

Quota de GPU

Votre quota de GPU est le nombre total de GPU exécutables dans votre projet GCP. Pour créer des clusters avec des GPU, votre projet doit posséder un quota suffisant de GPU.

Votre quota de GPU doit être au moins équivalent au nombre total de GPU que vous avez l'intention d'exécuter dans le cluster. Si vous activez l'autoscaling de cluster, vous devez demander un quota de GPU au moins équivalent au nombre maximal de nœuds du cluster, multiplié par le nombre de GPU par nœud.

Par exemple, si vous créez un cluster de trois nœuds exécutant chacun deux GPU, votre projet nécessite un quota minimal de six GPU.

Demander un quota de GPU

Pour demander un quota de GPU, accédez à Cloud Console. Pour plus d'informations sur la demande de quotas, reportez-vous à la section Demander une augmentation de quota dans la documentation Compute Engine.

Console

Procédez comme suit :

  1. Accédez au menu "Quotas Identity and Access Management (Cloud IAM)" dans Cloud Console.

    Accéder au menu Quotas

  2. Dans le menu déroulant Metrics (Métriques), cliquez sur None (Aucune), puis saisissez "gpus" dans le champ de recherche.

  3. Dans les résultats de recherche, sélectionnez les GPU souhaités :

    Capture d'écran du menu déroulant Métriques affichant les métriques de GPU sélectionnées.

  4. Fermez le menu déroulant Métriques.

Envoyer une demande de quota

Console

Procédez comme suit :

  1. Dans la liste des quotas de GPU, sélectionnez les quotas associés aux régions de votre choix, par exemple us-central1.
  2. Cliquez sur Modifier les quotas. Un formulaire de demande s'ouvre sur le côté droit de Cloud Console.
  3. Renseignez le champ Nouvelle limite de quota pour chaque demande de quota.
  4. Renseignez le champ Description de la demande en indiquant des informations sur votre demande.
  5. Cliquez sur OK.
  6. Cliquez sur Envoyer la requête.

Exécuter des GPU

Dans les sections suivantes, nous expliquons comment exécuter des GPU dans des clusters GKE.

Créer un pool de nœuds GPU avec autoscaling

Pour une utilisation optimale et rentable des GPU sur GKE, ainsi que de l'autoscaling de cluster, nous vous recommandons de créer des pools de nœuds GPU distincts dans les clusters.

Lorsque vous ajoutez un pool de nœuds GPU à un cluster existant qui exécute déjà un pool de nœuds non GPU, GKE rejette automatiquement les nœuds GPU en leur attribuant le rejet de nœud suivant :

  • Clé : nvidia.com/gpu
  • Effet : NoSchedule

En outre, par l'exécution du contrôleur d'admission ExtendedResourceToleration, GKE applique automatiquement les tolérances correspondantes aux pods qui demandent des GPU.

Ainsi, seuls les pods qui demandent des GPU sont planifiés sur les nœuds GPU, ce qui permet un autoscaling plus efficace : les nœuds GPU peuvent évoluer rapidement à la baisse si le nombre de pods demandant des GPU est insuffisant.

Vous créez un pool de nœuds GPU dans un cluster existant à l'aide de Cloud Console ou de l'outil de ligne de commande gcloud.

gcloud

Pour créer un pool de nœuds comportant des GPU, exécutez la commande suivante :

    gcloud container node-pools create [POOL_NAME] \
    --accelerator type=[GPU_TYPE],count=[AMOUNT] --zone [COMPUTE_ZONE] \
    --cluster [CLUSTER_NAME] [--num-nodes 3 --min-nodes 0 --max-nodes 5 \
    --enable-autoscaling]
    

où :

  • [POOL_NAME] est le nom que vous avez choisi pour le pool de nœuds.
  • [GPU_TYPE] est le type de GPU : nvidia-tesla-k80, nvidia-tesla-p100, nvidia-tesla-p4, nvidia-tesla-v100 ou nvidia-tesla-t4.
  • [AMOUNT] est le nombre de GPU à rattacher aux nœuds du pool de nœuds.
  • [COMPUTE_ZONE] est la zone de calcul dans laquelle créer le pool de nœuds, par exemple us-central1-c. Le cluster doit déjà s'exécuter dans la zone spécifiée.
  • [CLUSTER_NAME] est le nom du cluster dans lequel créer le pool de nœuds.
  • --num-nodes spécifie le nombre initial de nœuds à créer.
  • --min-nodes spécifie le nombre minimal de nœuds à exécuter à un moment donné.
  • --max-nodes spécifie le nombre maximal de nœuds pouvant être exécutés.
  • --enable-autoscaling permet d'activer l'autoscaling du pool de nœuds selon l'évolution de la charge de travail.

Par exemple, la commande suivante crée un pool de nœuds avec autoscaling, p100, doté de deux GPU P100, dans le cluster p100-cluster :

gcloud container node-pools create p100 \
    --accelerator type=nvidia-tesla-p100,count=2 \
    --zone us-central1-c --cluster p100-cluster \
    --num-nodes 3 --min-nodes 0 --max-nodes 5 --enable-autoscaling

Console

  1. Accédez au menu Google Kubernetes Engine de Cloud Console.

    Accéder au menu Google Kubernetes Engine

  2. Sélectionnez le cluster souhaité.

  3. Cliquez sur Modifier.

  4. Dans Pools de nœuds, cliquez sur Ajouter un pool de nœuds.

  5. Facultatif : Dans la liste déroulante Autoscaling, cliquez sur On (Activé).

  6. Configurez le pool de nœuds comme vous le souhaitez. Ensuite, dans Type de machine, cliquez sur Personnaliser.

  7. Dans la liste déroulante Nombre de GPU, sélectionnez le nombre souhaité de GPU à exécuter par nœud.

  8. Dans la liste déroulante Type de GPU, sélectionnez le type de GPU souhaité.

  9. Acceptez l'avertissement en cochant la case Je comprends les restrictions.

  10. Cliquez sur Enregistrer.

Créer un cluster zonal comportant des GPU

Vous créez un cluster zonal qui exécute des GPU à l'aide de Cloud Console ou de l'outil de ligne de commande gcloud.

gcloud

Pour créer un cluster zonal comportant des GPU qui fonctionnent dans son pool de nœuds par défaut, exécutez la commande suivante :

    gcloud container clusters create [CLUSTER_NAME] \
    --accelerator type=[GPU_TYPE],count=[AMOUNT] \
    --zone [COMPUTE_ZONE]
    

où :

  • [CLUSTER_NAME] est le nom que vous avez choisi pour le cluster.
  • [GPU_TYPE] est le type de GPU : nvidia-tesla-k80, nvidia-tesla-p100, nvidia-tesla-p4, nvidia-tesla-v100 ou nvidia-tesla-t4.
  • [AMOUNT] correspond au nombre de GPU à exécuter dans le pool de nœuds par défaut.
  • [COMPUTE_ZONE] est la zone de calcul du cluster, telle que us-central1-c.

Par exemple, la commande suivante crée un cluster, p100, doté de trois nœuds (par défaut lorsque --num-nodes est omis) et deux GPU P100 par nœud :

gcloud container clusters create p100 \
    --accelerator type=nvidia-tesla-p100,count=2 \
    --zone us-central1-c

Console

  1. Accédez au modèle de cluster Calcul accéléré par GPU.

    Accéder au modèle "Calcul accéléré par GPU"

  2. Configurez le cluster selon vos besoins. Personnalisez ensuite le pool de nœuds GPU ou ajoutez des pools de nœuds GPU.

  3. Acceptez l'avertissement en cochant la case Je comprends les restrictions.

  4. Cliquez sur Créer.

Créer un cluster régional comportant des GPU

Par défaut, les clusters régionaux créent des nœuds dans trois zones d'une région. Cependant, aucune région Google Cloud ne comporte de GPU dans les trois zones. Lorsque vous créez un cluster régional avec des GPU, vous devez spécifier des zones à l'aide de la commande --node-locations. Vous pouvez également utiliser cette commande une fois votre cluster créé. Pour identifier les zones qui possèdent des GPU, consultez la section Disponibilité.

Vous pouvez créer un cluster de GPU régional à l'aide de l'outil de ligne de commande gcloud ou de Cloud Console.

gcloud

Pour créer un cluster régional comportant des GPU, exécutez la commande suivante :

    gcloud container clusters create [CLUSTER_NAME] \
    --accelerator type=[GPU_TYPE],count=[AMOUNT] \
    --region [REGION] --node-locations [ZONE],[ZONE]
    

où :

  • [CLUSTER_NAME] est le nom que vous choisissez pour le cluster.
  • [GPU_TYPE] est le type de GPU : nvidia-tesla-k80, nvidia-tesla-p100, nvidia-tesla-p4, nvidia-tesla-v100 ou nvidia-tesla-t4.
  • [AMOUNT] est le nombre de GPU à exécuter par nœud.
  • [REGION] est la région du cluster, telle que us-central1.
  • [ZONE] est une zone de calcul dans la région, telle que us-central1-c. La ou les zones doivent être associées aux types de GPU que vous spécifiez.

Par exemple, la commande suivante crée un cluster (p100) doté de trois nœuds (par défaut lorsque --num-nodes est omis) et deux GPU P100 par nœud, dans deux zones au sein de la zone us-central1 :

gcloud container clusters create p100 \
    --accelerator type=nvidia-tesla-p100,count=2 \
    --region us-central1 \ --node-locations us-central1-a,us-central1-c

Console

  1. Accédez au modèle de cluster Calcul accéléré par GPU.

    Accéder au modèle "Calcul accéléré par GPU"

  2. Dans Type d'emplacement, sélectionnez Régional. Dans Région, sélectionnez la région souhaitée.

  3. Configurez le cluster selon vos besoins. Personnalisez ensuite le pool de nœuds GPU ou ajoutez des pools de nœuds GPU.

  4. Acceptez l'avertissement en cochant la case Je comprends les restrictions.

  5. Cliquez sur Créer.

Installer des pilotes d'appareils GPU NVIDIA

Après avoir ajouté des nœuds GPU au cluster, vous devez installer des pilotes d'appareils NVIDIA sur ces nœuds. Google fournit une interface DaemonSet qui installe automatiquement les pilotes.

Vous trouverez ci-dessous les instructions d'installation correspondant aux nœuds Container-Optimized OS (COS) ou aux nœuds Ubuntu.

COS

Pour déployer l'interface DaemonSet d'installation, exécutez la commande suivante :

kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/nvidia-driver-installer/cos/daemonset-preloaded.yaml

L'installation prend plusieurs minutes. Une fois installé, le plug-in d'appareils GPU NVIDIA indique la capacité des GPU NVIDIA via les API Kubernetes.

Le tableau suivant répertorie la version de GKE à partir de laquelle chaque version du pilote NVIDIA est compatible :

Version de GKE Pilote Nvidia
1.14.2-gke.3 et versions ultérieures 418.67
1.14.2-gke.2 et versions antérieures 418.67
1.13.6-gke.6 et versions ultérieures 418.67
1.13.6-gke.5 et versions antérieures 410.79
1.12.x 410.79
1.11.5 et versions ultérieures 410.79
1.10.5-gke.4 et versions ultérieures 396.46
1.10.2-gke.3 et versions ultérieures 390.46

Ubuntu

Notez que seules les versions 1.11.3 et ultérieures des nœuds Ubuntu sont compatibles avec les GPU.

Pour déployer l'interface DaemonSet d'installation, exécutez la commande suivante :

kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/nvidia-driver-installer/ubuntu/daemonset-preloaded.yaml

L'installation prend quelques secondes. Une fois installé, le plug-in d'appareils GPU NVIDIA indique la capacité des GPU NVIDIA via les API Kubernetes.

Le tableau suivant répertorie la version de GKE à partir de laquelle chaque version du pilote NVIDIA est compatible :

Version de GKE Pilote Nvidia
1.14.6-gke.13 et versions ultérieures 418.74
1.14.6-gke.12 et versions antérieures 410.104
1.13.9-gke.11 et versions ultérieures 418.74
1.13.9-gke.10 et versions antérieures 410.104
1.12.6-gke.6 et versions ultérieures 410.104
1.12.6-gke.5 et versions antérieures 384.111
1.11.8-gke.4 et versions ultérieures 410.104
1.11.8-gke.3 et versions antérieures 384.111

Configurer des pods pour qu'ils utilisent des GPU

Vous devez appliquer une limite de ressources pour configurer des pods afin qu'ils utilisent des GPU. Vous devez définir une limite de ressources dans une spécification de pod à l'aide de la paire clé-valeur suivante :

  • Clé : nvidia/gpu
  • Valeur : nombre de GPU à utiliser

Vous trouverez ci-dessous un exemple de spécification de pod utilisant des GPU :

apiVersion: v1
    kind: Pod
    metadata:
      name: my-gpu-pod
    spec:
      containers:
      - name: my-gpu-container
        image: nvidia/cuda:10.0-runtime-ubuntu18.04
        command: ["/bin/bash"]
        resources:
          limits:
           nvidia.com/gpu: 2

Utiliser plusieurs types de GPU

Si vous souhaitez utiliser plusieurs types d'accélérateurs GPU par cluster, vous devez créer plusieurs pools de nœuds, chacun avec son propre type d'accélérateur. GKE associe un sélecteur unique aux nœuds GPU pour faciliter le placement des charges de travail GPU sur les nœuds ayant des types de GPU spécifiques :

  • Clé : cloud.google.com/gke-accelerator
  • Valeur : nvidia-tesla-k80, nvidia-tesla-p100, nvidia-tesla-p4, nvidia-tesla-v100 ou nvidia-tesla-t4.

Vous pouvez cibler certains types de GPU en ajoutant le sélecteur de nœud suivant à la spécification de pod de la charge de travail. Exemple :

apiVersion: v1
    kind: Pod
    metadata:
      name: my-gpu-pod
    spec:
      containers:
      - name: my-gpu-container
        image: nvidia/cuda:10.0-runtime-ubuntu18.04
        command: ["/bin/bash"]
        resources:
          limits:
           nvidia.com/gpu: 2
      nodeSelector:
        cloud.google.com/gke-accelerator: nvidia-tesla-k80 # or nvidia-tesla-p100 or nvidia-tesla-p4 or nvidia-tesla-v100 or nvidia-tesla-t4

À propos des bibliothèques CUDA

CUDA® est la plate-forme informatique parallèle et le modèle de programmation NVIDIA pour les GPU. Les pilotes d'appareils NVIDIA que vous installez dans le cluster incluent des bibliothèques CUDA.

Les bibliothèques CUDA et les utilitaires de débogage sont disponibles dans le conteneur sous /usr/local/nvidia/lib64 et /usr/local/nvidia/bin, respectivement.

Les applications CUDA exécutées dans des pods utilisant des GPU NVIDIA doivent détecter de manière dynamique les bibliothèques CUDA. Pour ce faire, vous devez inclure /usr/local/nvidia/lib64 dans la variable d'environnement LD_LIBRARY_PATH.

Vous devez utiliser des images de base CUDA Docker basées sur Ubuntu pour les applications CUDA exécutées dans GKE, où LD_LIBRARY_PATH est déjà défini correctement. La dernière version compatible de CUDA est 10.0 sur COS (1.11.5 et versions ultérieures) et Ubuntu (1.11.8-gke.4 et versions ultérieures, 1.12.6-gke.6 et versions ultérieures).

Surveiller des nœuds GPU

GKE expose les métriques Stackdriver Monitoring suivantes pour les conteneurs utilisant des GPU. Vous pouvez surveiller les performances des charges de travail des GPU à l'aide de ces métriques :

  • Cycle d'utilisation (container/accelerator/duty_cycle) : durée exprimée en pourcentage de la dernière période d'échantillonnage (10 secondes) pendant laquelle l'accélérateur a été en mode de traitement actif. Entre 1 et 100.
  • Utilisation de la mémoire (container/accelerator/memory_used) : quantité de mémoire d'accélérateur allouée, en octets.
  • Capacité de mémoire (container/accelerator/memory_total) : mémoire totale de l'accélérateur, en octets.

Ces métriques sont disponibles dans Stackdriver.

Pour en savoir plus sur la surveillance des clusters et de leurs ressources, consultez la page consacrée à Monitoring.

Afficher les métriques d'utilisation

Pour afficher les métriques d'utilisation des GPU des charges de travail, vous devez accéder au tableau de bord Charges de travail dans Cloud Console.

Console

Pour afficher l'utilisation des GPU des charges de travail, procédez comme suit :

  1. Accédez au menu Charges de travail dans Cloud Console.

    Accéder au menu Google Kubernetes Engine

  2. Sélectionnez la charge de travail souhaitée.

Le tableau de bord "Charges de travail" affiche les graphiques sur l'utilisation et la capacité de la mémoire des GPU, ainsi que leur cycle de travail.

Étapes suivantes