Exécuter des GPU multi-instances


Cette page explique comment partitionner un GPU NVIDIA® A100 pour partager un seul GPU sur plusieurs conteneurs sur Google Kubernetes Engine (GKE).

Dans cette page, nous partons du principe que vous maîtrisez les concepts de Kubernetes tels que les Pods, les nœuds, les déploiements et les espaces de noms, et que vous connaissez les concepts de GKE tels que les pools de nœuds, l'autoscaling et le provisionnement automatique.

Présentation

Kubernetes attribue un GPU complet par conteneur même si le conteneur n'a besoin que d'une fraction du GPU pour sa charge de travail, ce qui peut entraîner une perte de ressources et un coût excessif, en particulier si vous utilisez la dernière génération de puissants GPU. Pour améliorer l'utilisation des GPU, les GPU multi-instances vous permettent de partitionner un seul GPU NVIDIA A100 et de créer jusqu'à sept tranches. Chaque tranche peut être allouée à un conteneur du nœud de manière indépendante, pour un maximum de sept conteneurs par GPU NVIDIA A100. Les GPU multi-instances fournissent une isolation matérielle entre les charges de travail, et des QoS cohérents et prévisibles pour tous les conteneurs exécutés sur le GPU.

Pour les applications CUDA, les GPU multi-instances présentent généralement une grande transparence. Chaque partition de GPU apparaît comme une ressource GPU standard et le modèle de programmation reste inchangé.

Pour en savoir plus sur les GPU multi-instances, consultez le guide de l'utilisateur sur les GPU multi-instance NVIDIA.

Partitions de GPU multi-instances

Le GPU A100 comprend sept unités de calcul et huit unités de mémoire, qui peuvent être partitionnées en instances de GPU de différentes tailles. Les tailles de partition des GPU utilisent la syntaxe suivante : [compute]g.[memory]gb. Par exemple, une taille de partition de GPU de 1g.5gb fait référence à une instance GPU dotée d'une unité de calcul (1/7e de flux multiprocesseurs sur le GPU) et d'une unité de mémoire (5 Go). La taille de partition des GPU A100 peut être spécifiée lors de la création d'un cluster. Consultez la section Créer un cluster avec les GPU multi-instances activés pour obtenir un exemple.

La table de partitionnement du guide de l'utilisateur sur les GPU multi-instances NVIDIA répertorie toutes les différentes tailles de partitions de GPU, ainsi que la quantité de ressources de calcul et de mémoire disponibles sur chaque partition de GPU. Le tableau indique également le nombre d'instances de GPU pour chaque taille de partition pouvant être créée sur le GPU A100.

Le tableau suivant répertorie les tailles de partition compatibles avec GKE :

Taille de la partition Instances de GPU Unités de calcul par instance Unités de mémoire par instance
1g.5gb 7 1 1
2g.10gb 3 2 2
3g.20gb 2 3 4
7g.40gb 1 7 8

Chaque GPU sur chaque nœud d'un pool est partitionné de la même manière. Par exemple, considérons un pool de nœuds avec deux nœuds, quatre GPU sur chaque nœud et une taille de partition de 1g.5gb. GKE crée sept partitions de taille 1g.5gb sur chaque GPU. Étant donné qu'il y a quatre GPU sur chaque nœud, il y aura 28 partitions de GPU 1g.5gb disponibles sur chaque nœud. Étant donné qu'il y a deux nœuds dans le pool de nœuds, un total de 56 partitions de GPU 1g.5gb sont disponibles dans l'ensemble du pool de nœuds.

Pour créer un cluster GKE avec plusieurs types de partitions de GPU, vous devez créer plusieurs pools de nœuds. Par exemple, si vous souhaitez que les nœuds possèdent des partitions de GPU 1g.5gb et 3g.20gb dans un cluster, vous devez créer deux pools de nœuds, l'un avec une taille de partition de GPU définie sur 1g.5gb, et l'autre avec 3g.20gb.

Chaque nœud comporte un libellé avec la taille des partitions de GPU disponibles sur le nœud. Cette attribution de libellé permet aux charges de travail de cibler les nœuds avec la taille de partition de GPU nécessaire. Par exemple, sur un nœud doté d'instances de GPU 1g.5gb, le nœud présente le libellé suivant :

cloud.google.com/gke-gpu-partition-size=1g.5gb

Fonctionnement

Pour utiliser des GPU multi-instances, vous devez effectuer les tâches suivantes :

  1. Créer un cluster avec les GPU multi-instances activés.
  2. Installer des pilotes et configurez les partitions de GPU.
  3. Vérifier le nombre de ressources GPU disponibles sur le nœud.
  4. Déployer des conteneurs sur le nœud.

Tarifs

Les GPU multi-instances sont exclusifs aux GPU A100 et soumis à la tarification des GPU A100 en plus des autres produits permettant d'exécuter vos charges de travail. Vous ne pouvez associer que des GPU A100 entiers aux nœuds de votre cluster pour le partitionnement. Pour en savoir plus sur les tarifs des GPU, consultez la page Tarifs des GPU.

Limites

  • L'utilisation de partitions de GPU multi-instances avec GKE n'est pas recommandée pour les charges de travail non approuvées.
  • L'autoscaling et le provisionnement automatique des partitions GPU sont entièrement compatibles avec GKE version 1.20.7-gke.400 ou ultérieure. Dans les versions antérieures, seuls les pools de nœuds avec au moins un nœud peuvent faire l'objet d'un autoscaling en fonction des tailles de partition de GPU spécifiques dont ont besoin les charges de travail.
  • Les métriques d'utilisation du GPU (par exemple, duty_cycle) ne sont pas disponibles pour les instances de GPU.

Avant de commencer

Avant de commencer, effectuez les tâches suivantes :

  • Assurez-vous d'avoir activé l'API Google Kubernetes Engine.
  • Activer l'API Google Kubernetes Engine
  • Assurez-vous d'avoir installé le SDK Cloud.
  • Configurez les paramètres de l'outil de ligne de commande gcloud par défaut pour votre projet en utilisant l'une des méthodes suivantes:
    • Utilisez gcloud init si vous souhaitez suivre les étapes de définition des paramètres par défaut du projet.
    • Utilisez gcloud config pour définir individuellement l'ID, la zone et la région de votre projet.

    gcloud init

    1. Exécutez gcloud init et suivez les instructions :

      gcloud init

      Si vous utilisez SSH sur un serveur distant, utilisez l'option --console-only pour empêcher la commande d'ouvrir un navigateur :

      gcloud init --console-only
    2. Suivez les instructions pour autoriser l'outil gcloud à utiliser votre compte Google Cloud.
    3. Créez ou sélectionnez une configuration.
    4. Choisissez un projet Google Cloud.
    5. Choisissez une zone Compute Engine par défaut.
    6. Choisissez une région Compute Engine par défaut.

    gcloud config

    1. Définissez votre ID de projet par défaut :
      gcloud config set project PROJECT_ID
    2. Définissez votre région Compute Engine par défaut (par exemple, us-central1):
      gcloud config set compute/region COMPUTE_REGION
    3. Définissez votre zone Compute Engine par défaut (par exemple, us-central1-c):
      gcloud config set compute/zone COMPUTE_ZONE
    4. Mettez à jour gcloud vers la dernière version :
      gcloud components update

    En définissant des emplacements par défaut, vous pouvez éviter les erreurs dans l'outil gcloud, telles que les suivantes: One of [--zone, --region] must be supplied: Please specify location.

  • Les GPU multi-instances sont compatibles avec GKE version 1.19.7-gke.2503 ou ultérieure.
  • Vous devez disposer d'un quota de GPU NVIDIA A100 suffisant. Consultez la section Demander une augmentation de quota.

Créer un cluster avec les GPU multi-instances activés

Lorsque vous créez un cluster avec des GPU multi-instances, vous devez spécifier gpuPartitionSize avec acceleratorType et acceleratorCount. Étant donné que les GPU multi-instances ne sont compatibles qu'avec les GPU A100, la valeur de acceleratorType doit être nvidia-tesla-a100.

L'exemple suivant montre comment créer un cluster GKE avec un nœud, et sept partitions de GPU de taille 1g.5gb sur le nœud. Les autres étapes de cette page utilisent une taille de partition de GPU de 1g.5gb, ce qui crée sept partitions sur chaque GPU. Vous pouvez également utiliser l'une des tailles de partition de GPU compatibles mentionnées précédemment.

  1. Pour créer un cluster avec des GPU multi-instances activés à l'aide de l'outil de ligne de commande gcloud, exécutez la commande suivante :

    gcloud container clusters create CLUSTER_NAME  \
        --project=PROJECT_ID  \
        --zone ZONE  \
        --cluster-version=CLUSTER_VERSION  \
        --accelerator type=nvidia-tesla-a100,count=1,gpu-partition-size=1g.5gb  \
        --machine-type=a2-highgpu-1g  \
        --num-nodes=1
    

    Remplacez l'élément suivant :

    • CLUSTER_NAME : nom de votre nouveau cluster
    • PROJECT_ID : ID de votre projet Google Cloud
    • ZONE : zone de calcul du plan de contrôle du cluster.
    • CLUSTER_VERSION : la version doit être 1.19.7-gke.2503 ou ultérieure.
  2. Configurez kubectl pour vous connecter au cluster nouvellement créé :

    gcloud container clusters get-credentials CLUSTER_NAME
    

    Voici la sortie de la commande get-credentials :

    Fetching cluster endpoint and auth data.
    kubeconfig entry generated for CLUSTER_NAME.
    

Installer des pilotes et configurer des partitions de GPU

Après avoir créé le cluster, vous devez mettre à jour le plug-in de l'appareil et installer les pilotes d'appareils NVIDIA sur les nœuds.

  1. Mettez à jour le plug-in de l'appareil pour activer la découverte des instances de GPU :

    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/cmd/nvidia_gpu/device-plugin.yaml
    
  2. Les GPU multi-instances nécessitent un pilote NVIDIA version 450.80.02 ou ultérieure. Une fois le pilote installé, le mode GPU multi-instance doit être activé, suivi d'un redémarrage du nœud pour que les modifications prennent effet. Une fois que les GPU sont en mode GPU multi-instance, les partitions de GPU requises doivent être créées.

    Exécutez la commande DaemonSet suivante pour effectuer toutes ces actions :

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

    Cette tâche redémarre le nœud pour activer le mode GPU multi-instance. Cette opération peut prendre quelques minutes.

Vérifier le nombre de ressources GPU disponibles sur le nœud

Exécutez la commande suivante pour vérifier que la capacité et le nombre allouables des ressources nvidia.com/gpu sont de 7 :

kubectl describe nodes

Voici la sortie de la commande :

...
Capacity:
  ...
  nvidia.com/gpu:             7
Allocatable:
  ...
  nvidia.com/gpu:             7

Déployer des conteneurs sur le nœud

Vous pouvez déployer jusqu'à un conteneur par appareil GPU multi-instance sur le nœud. Dans cet exemple, avec une taille de partition de 1g.5gb, sept partitions de GPU multi-instances sont disponibles sur le nœud. Par conséquent, vous pouvez déployer jusqu'à sept conteneurs qui demandent des GPU sur ce nœud.

  1. Voici un exemple simple qui démarre le conteneur cuda:11.0-base et exécute nvidia-smi pour imprimer l'UUID du GPU dans le conteneur. Dans cet exemple, il y a sept conteneurs, et chaque conteneur reçoit une partition GPU. Cet exemple définit également le sélecteur de nœuds pour cibler les nœuds avec des partitions de GPU 1g.5gb.

    cat <<EOF | kubectl apply -f -
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: cuda-simple
    spec:
      replicas: 7
      selector:
        matchLabels:
          app: cuda-simple
      template:
        metadata:
          labels:
            app: cuda-simple
        spec:
          nodeSelector:
            cloud.google.com/gke-gpu-partition-size: 1g.5gb
          containers:
          - name: cuda-simple
            image: nvidia/cuda:11.0-base
            command:
            - bash
            - -c
            - |
              /usr/local/nvidia/bin/nvidia-smi -L; sleep 300
            resources:
              limits:
                nvidia.com/gpu: 1
    EOF
    
  2. Vérifiez que les sept pods sont en cours d'exécution :

    kubectl get pods
    

    Voici la sortie de la commande :

    NAME                           READY   STATUS    RESTARTS   AGE
    cuda-simple-849c47f6f6-4twr2   1/1     Running   0          7s
    cuda-simple-849c47f6f6-8cjrb   1/1     Running   0          7s
    cuda-simple-849c47f6f6-cfp2s   1/1     Running   0          7s
    cuda-simple-849c47f6f6-dts6g   1/1     Running   0          7s
    cuda-simple-849c47f6f6-fk2bs   1/1     Running   0          7s
    cuda-simple-849c47f6f6-kcv52   1/1     Running   0          7s
    cuda-simple-849c47f6f6-pjljc   1/1     Running   0          7s
    
  3. Affichez les journaux pour voir l'UUID du GPU en utilisant le nom d'un pod de la commande précédente :

    kubectl logs cuda-simple-849c47f6f6-4twr2
    

    Voici la sortie de la commande :

    GPU 0: A100-SXM4-40GB (UUID: GPU-45eafa61-be49-c331-f8a2-282736687ab1)
      MIG 1g.5gb Device 0: (UUID: MIG-GPU-45eafa61-be49-c331-f8a2-282736687ab1/11/0)
    
  4. Répétez l'opération pour tous les autres journaux que vous souhaitez afficher :

    kubectl logs cuda-simple-849c47f6f6-8cjrb
    

    Voici la sortie de la commande :

    GPU 0: A100-SXM4-40GB (UUID: GPU-45eafa61-be49-c331-f8a2-282736687ab1)
      MIG 1g.5gb Device 0: (UUID: MIG-GPU-45eafa61-be49-c331-f8a2-282736687ab1/7/0)
    

Étape suivante