Diffuser des LLM sur GKE avec une stratégie de provisionnement de GPU économique et à haute disponibilité

Ce guide explique comment optimiser les coûts des charges de travail de diffusion de LLM sur GKE. Ce tutoriel utilise une combinaison de VM à démarrage flexible, de VM Spot et de ComputeClasses pour une inférence économique.

Ce guide utilise Mixtral 8x7b comme exemple de LLM que vous pouvez déployer.

Ce guide est destiné aux ingénieurs en machine learning (ML), aux administrateurs et opérateurs de plate-forme, ainsi qu'aux spécialistes des données et de l'IA qui souhaitent utiliser les fonctionnalités d'orchestration de conteneurs Kubernetes pour diffuser des LLM. Pour en savoir plus sur les rôles courants et les exemples de tâches que nous citons dans Google Cloud le contenu, consultez Rôles utilisateur et tâches courantes de GKE.

Tarification du démarrage flexible

Le démarrage flexible est recommandé si votre charge de travail nécessite des ressources provisionnées de manière dynamique selon les besoins, pendant sept jours maximum, avec des réservations à court terme, sans gestion complexe des quotas et avec un accès économique. Le démarrage flexible est alimenté par le programmemeur de charge de travail dynamique et est facturé selon la tarification du programmeur de charge de travail dynamique :

  • Remise (jusqu'à 53 %) sur les vCPU, les GPU et les TPU.
  • Paiement à l'usage.

Arrière-plan

Cette section décrit les techniques disponibles que vous pouvez utiliser pour obtenir des ressources de calcul, y compris des accélérateurs GPU, en fonction des exigences de vos charges de travail d'IA/de ML. Ces techniques sont appelées stratégies d'obtention d'accélérateurs dans GKE.

GPU

Les processeurs graphiques (GPU) vous permettent d'accélérer des charges de travail spécifiques, telles que le machine learning et le traitement des données. GKE propose des nœuds équipés de ces GPU puissants pour optimiser les performances des tâches de machine learning et de traitement des données. GKE fournit toute une gamme d'options de types de machines pour la configuration des nœuds, y compris les types de machines avec des GPU NVIDIA H100, A100 et L4.

Pour en savoir plus, consultez la page À propos des GPU dans GKE.

Démarrage flexible

Le démarrage flexible, alimenté par le programmeur de charge de travail dynamique, est une option de consommation de GPU dans laquelle GKE conserve votre requête de GPU et provisionne automatiquement des VM à démarrage flexible lorsque la capacité devient disponible. Envisagez d'utiliser le démarrage flexible pour les charges de travail qui nécessitent une capacité GPU pendant une durée limitée (jusqu'à sept jours) et qui n'ont pas de date de début fixe. Pour en savoir plus, consultez la section Démarrage flexible.

VM Spot

Vous pouvez utiliser des GPU avec des VM Spot si vos charges de travail peuvent tolérer les perturbations fréquentes des nœuds. L'utilisation de VM Spot ou du démarrage flexible réduit le coût d'exécution des GPU. L'utilisation de VM Spot combinée au démarrage flexible offre une option de secours lorsque la capacité des VM Spot n'est pas disponible.

Pour en savoir plus, consultez la page Utiliser des VM Spot avec des pools de nœuds GPU.

ComputeClasses

Vous pouvez demander des GPU à l'aide de ComputeClasses. Les ComputeClasses vous permettent de définir une hiérarchie de configurations de nœuds que GKE doit prioriser lors des décisions d'autoscaling des nœuds, afin que les charges de travail s'exécutent sur le matériel que vous avez sélectionné. Pour en savoir plus, consultez la section À propos des ComputeClasses personnalisées.

Avant de commencer

  • Connectez-vous à votre Google Cloud compte. Si vous débutez sur Google Cloud, créez un compte pour évaluer les performances de nos produits en conditions réelles. Les nouveaux clients bénéficient également de 300 $de crédits sans frais pour exécuter, tester et déployer des charges de travail.
  • In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  • Verify that billing is enabled for your Google Cloud project.

  • In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  • Verify that billing is enabled for your Google Cloud project.

Accéder au modèle

Si vous n'en possédez pas déjà un, générez un nouveau jeton Hugging Face :

  1. Cliquez sur Your Profile > Settings > Access Tokens (Votre profil > Paramètres > Jetons d'accès).
  2. Sélectionnez New Token (Nouveau jeton).
  3. Donnez-lui le nom de votre choix et un rôle disposant au moins de l'autorisation Read (Lecture).
  4. Sélectionnez Generate a token (Générer un jeton).

Créer une ComputeClass

Dans cette section, vous allez créer une ComputeClass personnalisée. Les ComputeClasses définissent les types et les relations entre plusieurs ressources de calcul utilisées par votre charge de travail.

  1. Dans la Google Cloud console, lancez une session Cloud Shell en cliquant sur Icône d'activation Cloud Shell Activer Cloud Shell dans la Google Cloud console. Une session s'ouvre dans le volet inférieur de la Google Cloud console.
  2. Créez un fichier manifeste dws-flex-start.yaml :

    apiVersion: cloud.google.com/v1
    kind: ComputeClass
    metadata:
      name: dws-model-inference-class
    spec:
      priorities:
        - machineType: g2-standard-24
          spot: true
        - machineType: g2-standard-24
          flexStart:
            enabled: true
            nodeRecycling:
              leadTimeSeconds: 3600
      nodePoolAutoCreation:
        enabled: true
    
  3. Appliquez le fichier manifeste dws-flex-start.yaml :

    kubectl apply -f dws-flex-start.yaml
    

GKE déploie des machines g2-standard-24 avec des accélérateurs L4. GKE utilise ComputeClasses pour donner la priorité aux VM Spot, puis aux VM à démarrage flexible.

Déployer la charge de travail LLM

  1. Créez un secret Kubernetes contenant le jeton Hugging Face à l'aide de la commande suivante :

    kubectl create secret generic model-inference-secret \
        --from-literal=HUGGING_FACE_TOKEN=HUGGING_FACE_TOKEN \
        --dry-run=client -o yaml | kubectl apply -f -
    

    Remplacez HUGGING_FACE_TOKEN par votre jeton d'accès Hugging Face.

  2. Créez un fichier nommé mixtral-deployment.yaml :

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: inference-mixtral-ccc
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: llm
      template:
        metadata:
          labels:
            app: llm
        spec:
          nodeSelector:
            cloud.google.com/compute-class: dws-model-inference-class
          containers:
          - name: llm
            image: us-docker.pkg.dev/deeplearning-platform-release/gcr.io/huggingface-text-generation-inference-cu124.2-3.ubuntu2204.py311
            resources:
              requests:
                cpu: "5"
                memory: "40Gi"
                nvidia.com/gpu: "2"
              limits:
                cpu: "5"
                memory: "40Gi"
                nvidia.com/gpu: "2"
            env:
            - name: MODEL_ID
              value: mistralai/Mixtral-8x7B-Instruct-v0.1
            - name: NUM_SHARD
              value: "2"
            - name: PORT
              value: "8080"
            - name: QUANTIZE
              value: bitsandbytes-nf4
            - name: HUGGING_FACE_HUB_TOKEN
              valueFrom:
                secretKeyRef:
                  name: model-inference-secret
                  key: HUGGING_FACE_TOKEN
            volumeMounts:
              - mountPath: /dev/shm
                name: dshm
              - mountPath: /tmp
                name: ephemeral-volume
          volumes:
            - name: dshm
              emptyDir:
                  medium: Memory
            - name: ephemeral-volume
              ephemeral:
                volumeClaimTemplate:
                  metadata:
                    labels:
                      type: ephemeral
                  spec:
                    accessModes: ["ReadWriteOnce"]
                    storageClassName: "premium-rwo"
                    resources:
                      requests:
                        storage: 100Gi
    

    Dans ce fichier manifeste, le champ mountPath est défini sur /tmp, car il s'agit du chemin d'accès où la variable d'environnement HF_HOME est définie dans le conteneur de deep learning (DLC) pour l'inférence de génération de texte (TGI), au lieu du chemin d'accès /data par défaut défini dans l'image par défaut de TGI. Le modèle téléchargé sera stocké dans ce répertoire.

  3. Déployez le modèle :

    kubectl apply -f  mixtral-deployment.yaml
    

    GKE planifie le déploiement d'un nouveau pod, ce qui déclenche l'autoscaler du pool de nœuds pour ajouter un deuxième nœud avant de déployer le deuxième réplica du modèle.

  4. Vérifiez l'état du modèle :

    watch kubectl get deploy inference-mixtral-ccc
    

    Si le modèle a été déployé correctement, le résultat est semblable à celui-ci :

    NAME                   READY   UP-TO-DATE   AVAILABLE   AGE
    inference-mixtral-ccc  1/1     1            1           10m
    

    Pour quitter la lecture, appuyez sur CTRL + C.

  5. Attendez que le conteneur soit téléchargé et commence à diffuser le modèle :

    watch "kubectl logs $(kubectl get pods -l app=llm -o custom-columns=:metadata.name --no-headers) | tail"
    

    Pour quitter la lecture, appuyez sur CTRL + C.

  6. Affichez les pools de nœuds provisionnés par GKE :

    kubectl get nodes -L cloud.google.com/gke-nodepool
    

    Le résultat ressemble à ce qui suit :

      NAME                                                  STATUS   ROLES    AGE   VERSION               GKE-NODEPOOL
      gke-flex-na-nap-g2-standard--0723b782-fg7v   Ready    <none>   10m   v1.32.3-gke.1152000   nap-g2-standard-24-spot-gpu2-1gbdlbxz
      gke-flex-nap-zo-default-pool-09f6fe53-fzm8   Ready    <none>   32m   v1.32.3-gke.1152000   default-pool
      gke-flex-nap-zo-default-pool-09f6fe53-lv2v   Ready    <none>   32m   v1.32.3-gke.1152000   default-pool
      gke-flex-nap-zo-default-pool-09f6fe53-pq6m   Ready    <none>   32m   v1.32.3-gke.1152000   default-pool
    

    Le nom du pool de nœuds créé indique le type de machine. Dans ce cas, GKE a provisionné des VM Spot.

  7. Exposez le modèle :

    kubectl expose deployment/inference-mixtral-ccc --port 8080 --name=llm-service
    

Interagir avec le modèle à l'aide de curl

Cette section explique comment effectuer un test d'inférence de base pour vérifier le modèle déployé.

  1. Configurez le transfert de port vers le modèle :

    kubectl port-forward service/llm-service 8080:8080
    

    Le résultat ressemble à ce qui suit :

    Forwarding from 127.0.0.1:8080 -> 8080
    
  2. Dans une nouvelle session de terminal, discutez avec votre modèle à l'aide de curl :

    curl http://localhost:8080/v1/completions \
    -X POST \
    -H "Content-Type: application/json" \
    -d '{
        "model": "mixtral-8x7b-instruct-gptq",
        "prompt": "<s>[INST]Who was the first president of the United States?[/INST]",
        "max_tokens": 40}'
    

    La sortie ressemble à ceci :

    George Washington was a Founding Father and the first president of the United States, serving from 1789 to 1797.
    

Effectuer un nettoyage

Pour éviter que les ressources utilisées sur cette page ne soient facturées sur votre compte Google Cloud , supprimez le projet contenant les ressources, ou conservez le projet et supprimez les ressources individuelles.

Supprimer le projet

  1. Dans la Google Cloud console, accédez à la page Gérer les ressources.

    Accéder à la page "Gérer les ressources"

  2. Dans la liste des projets, sélectionnez le projet que vous souhaitez supprimer, puis cliquez sur Supprimer.
  3. Dans la boîte de dialogue, saisissez l'ID du projet, puis cliquez Arrêter pour supprimer le projet.

Supprimer la ressource individuelle

  1. Supprimez les ressources Kubernetes que vous avez créées à partir de ce guide :

    kubectl delete deployment inference-mixtral-ccc
    kubectl delete service llm-service
    kubectl delete computeclass dws-model-inference-class
    kubectl delete secret model-inference-secret
    
  2. Supprimez le cluster à l'aide de la commande suivante :

    gcloud container clusters delete CLUSTER_NAME
    

Étape suivante