Gérer les charges de travail des conteneurs GPU

Vous pouvez activer et gérer les ressources d'unité de traitement graphique (GPU) sur vos conteneurs. Par exemple, vous pouvez préférer exécuter des notebooks d'intelligence artificielle (IA) et de machine learning (ML) dans un environnement GPU. Pour exécuter des charges de travail de conteneur GPU, vous devez disposer d'un cluster Kubernetes compatible avec les appareils GPU. La compatibilité avec les GPU est activée par défaut pour les clusters Kubernetes pour lesquels des machines GPU sont provisionnées.

Ce document s'adresse aux développeurs d'applications du groupe d'opérateurs d'applications, qui sont chargés de créer des charges de travail d'application pour leur organisation. Pour en savoir plus, consultez la documentation sur les audiences pour GDC sous air gap.

Avant de commencer

Pour effectuer les tâches décrites dans ce document, vous devez demander les autorisations nécessaires et préparer votre environnement.

Demander des rôles IAM

Vous devez disposer de rôles spécifiques pour obtenir les autorisations nécessaires au déploiement de GPU dans vos conteneurs. Les rôles dont vous avez besoin dépendent du fait que vous travaillez dans un cluster partagé à l'échelle de l'organisation ou dans un cluster standard à l'échelle du projet. Pour en savoir plus, consultez Configurations de cluster Kubernetes.

Rôles de cluster partagé

Pour vérifier les pools de nœuds compatibles avec les GPU et déployer des charges de travail GPU dans un cluster partagé, demandez les rôles suivants en fonction de la tâche à effectuer :

  • Administrateur de cluster utilisateur (user-cluster-admin) : créez, supprimez, modifiez ou affichez les ressources d'un cluster partagé hébergé sur le serveur d'API de gestion. Ce rôle vous permet de vérifier les GPU dans le cluster partagé et n'est pas lié à l'espace de noms de votre projet.
  • Administrateur d'espace de noms (namespace-admin) : créez, supprimez, modifiez ou affichez les ressources d'un cluster partagé hébergé dans le projet. Ce rôle vous permet de déployer des charges de travail GPU dans un cluster standard et est lié à l'espace de noms de votre projet.

Rôles de cluster standard

Pour vérifier les pools de nœuds compatibles avec les GPU et déployer des charges de travail GPU dans un cluster standard, demandez à votre administrateur IAM de projet de vous accorder les rôles suivants :

  • Administrateur de cluster standard (standard-cluster-admin) : créez, supprimez, modifiez ou affichez les ressources d'un cluster standard hébergé sur le serveur d'API de gestion. Ce rôle vous permet de vérifier les GPU dans le cluster partagé et est lié à l'espace de noms de votre projet.
  • Développeur de cluster (cluster-developer) : créez, supprimez, modifiez ou affichez un cluster standard. Ce rôle vous permet de déployer des charges de travail GPU dans un cluster standard en fournissant un accès aux API de plan de données hébergées dans le cluster standard. Ce rôle est lié à l'espace de noms de votre projet.

Préparer votre environnement

Pour configurer un conteneur afin qu'il utilise des ressources GPU, assurez-vous de disposer des ressources suivantes :

  • Un cluster Kubernetes avec une classe de machine GPU. Pour en savoir plus, consultez la section Cartes GPU compatibles.

  • Recherchez le nom du cluster Kubernetes ou demandez-le à un membre du groupe d'administrateurs de plate-forme.

  • Connectez-vous et générez le fichier kubeconfig pour le cluster Kubernetes.

  • Utilisez le chemin d'accès kubeconfig du cluster Kubernetes pour remplacer KUBERNETES_CLUSTER_KUBECONFIG dans ces instructions.

  • Connectez-vous et générez le fichier kubeconfig pour le serveur d'API de gestion zonale qui héberge votre cluster Kubernetes. Utilisez ce chemin d'accès pour remplacer MANAGEMENT_API_SERVER dans ces instructions.

  • Connectez-vous et générez le fichier kubeconfig pour le cluster d'infrastructure de l'organisation dans la zone destinée à héberger vos GPU.

Configurer un conteneur pour qu'il utilise des ressources GPU

Pour utiliser ces GPU dans un conteneur, procédez comme suit :

  1. Vérifiez que votre cluster Kubernetes comporte des pools de nœuds compatibles avec les GPU :

    kubectl describe clusters.cluster.gdc.goog/KUBERNETES_CLUSTER_NAME \
        -n KUBERNETES_CLUSTER_NAMESPACE \
        --kubeconfig MANAGEMENT_API_SERVER
    

    Remplacez les éléments suivants :

    • KUBERNETES_CLUSTER_NAME: nom du cluster.
    • KUBERNETES_CLUSTER_NAMESPACE: espace de noms du cluster. Pour les clusters partagés, utilisez l'espace de noms platform. Pour les clusters standards, utilisez l'espace de noms du projet du cluster.
    • MANAGEMENT_API_SERVER: chemin d'accès kubeconfig du serveur d'API zonale où le cluster Kubernetes est hébergé. Si vous n'avez pas encore généré de fichier kubeconfig pour le serveur d'API dans votre zone cible, consultez Se connecter.

    La sortie pertinente ressemble à l'extrait suivant :

    # Several lines of code are omitted here.
    spec:
      nodePools:
      - machineTypeName: a2-ultragpu-1g-gdc
        nodeCount: 2
    # Several lines of code are omitted here.
    

    Pour obtenir la liste complète des types de machines GPU compatibles et des profils MIG (Multi-Instance GPU) , consultez Types de machines de nœud de cluster.

  2. Ajoutez les champs .containers.resources.requests et .containers.resources.limits à la spécification de votre conteneur. Chaque nom de ressource est différent selon la classe de votre machine. Vérifiez l'allocation de vos ressources GPU pour trouver les noms de vos ressources GPU.

    Par exemple, la spécification de conteneur suivante demande trois partitions d'un GPU à partir d'un nœud a2-ultragpu-1g-gdc :

     # Several lines of code are omitted here.
     containers:
     - name: my-container
       image: "my-image"
       resources:
         requests:
           nvidia.com/mig-1g.10gb-NVIDIA_A100_80GB_PCIE: 3
         limits:
           nvidia.com/mig-1g.10gb-NVIDIA_A100_80GB_PCIE: 3
     # Several lines of code are omitted here.
    
  3. Les conteneurs nécessitent également des autorisations supplémentaires pour accéder aux GPU. Pour chaque conteneur qui demande des GPU, ajoutez les autorisations suivantes à la spécification de votre conteneur :

    # Several lines of code are omitted here.
    securityContext:
     seLinuxOptions:
       type: unconfined_t
    # Several lines of code are omitted here.
    
  4. Appliquez le fichier manifeste de votre conteneur :

    kubectl apply -f CONTAINER_MANIFEST_FILE \
        -n KUBERNETES_CLUSTER_NAMESPACE \
        --kubeconfig KUBERNETES_CLUSTER_KUBECONFIG
    

    Remplacez les éléments suivants :

    • CONTAINER_MANIFEST_FILE: fichier manifeste YAML pour votre charge de travail de conteneur.
    • KUBERNETES_CLUSTER_NAMESPACE: espace de noms du cluster. Pour les clusters partagés, utilisez l'espace de noms platform. Pour les clusters standards, utilisez l'espace de noms du projet du cluster.
    • KUBERNETES_CLUSTER_KUBECONFIG: chemin d'accès kubeconfig du cluster.

Vérifier l'allocation de ressources GPU

  • Pour vérifier l'allocation de vos ressources GPU, exécutez la commande suivante :

    kubectl describe nodes NODE_NAME --kubeconfig KUBERNETES_CLUSTER_KUBECONFIG
    

    Remplacez les éléments suivants :

    • NODE_NAME: nœud gérant les GPU que vous souhaitez inspecter.
    • KUBERNETES_CLUSTER_KUBECONFIG: chemin d'accès kubeconfig du cluster.

    La sortie pertinente ressemble à l'extrait suivant :

    # Several lines of code are omitted here.
    Capacity:
      nvidia.com/mig-1g.10gb-NVIDIA_A100_80GB_PCIE: 7
    Allocatable:
      nvidia.com/mig-1g.10gb-NVIDIA_A100_80GB_PCIE: 7
    # Several lines of code are omitted here.
    

Notez les noms de ressources de vos GPU. Vous devez les spécifier lorsque vous configurez un conteneur pour qu'il utilise des ressources GPU.

Étape suivante