Diffuser Mistral Small 4 à l'aide de GPU sur GKE avec vLLM

Pour diffuser des grands modèles de langage (LLM) Mistral sur Google Kubernetes Engine (GKE) avec le framework vLLM à l'aide de GPU, vous devez provisionner un cluster GKE avec des accélérateurs compatibles, tels que les GPU NVIDIA H100.

Pour diffuser le modèle Mistral Small 4, le conteneur vLLM prédéfini est configuré pour charger les pondérations du modèle. Les pondérations seront chargées à partir de buckets Cloud Storage (spécifiés par l'argument --model).

Une fois les poids chargés, le conteneur vLLM expose un point de terminaison d'API compatible avec OpenAI pour l'inférence à haut débit.

Ce tutoriel 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 charges de travail d'IA/ML sur du matériel GPU H100.

Avant de lire cette page, assurez-vous de connaître les éléments suivants :

Objectifs

Ce tutoriel fournit une base pour comprendre et explorer le déploiement pratique de LLM pour l'inférence dans un environnement Kubernetes géré.

  1. Préparez votre environnement avec un cluster GKE en mode Autopilot.
  2. Déployer un conteneur vLLM sur votre cluster.
  3. Utilisez vLLM pour diffuser le modèle Mistral via l'interface curl.

Avant de commencer

  • In the Cloud de Confiance console, on the project selector page, select or create a Cloud de Confiance 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 Cloud de Confiance project.

  • Enable the required API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

  • Assurez-vous de disposer des rôles suivants sur le projet : roles/container.admin, roles/iam.serviceAccountAdmin

    Vérifier les rôles

    1. Dans la console Cloud de Confiance , accédez à la page IAM.

      Accéder à IAM
    2. Sélectionnez le projet.
    3. Dans la colonne Compte principal, recherchez toutes les lignes qui vous identifient ou identifient un groupe dont vous faites partie. Pour savoir à quels groupes vous appartenez, contactez votre administrateur.

    4. Pour toutes les lignes qui vous spécifient ou vous incluent, consultez la colonne Rôle pour vous assurer que la liste inclut les rôles requis.

    Attribuer les rôles

    1. Dans la console Cloud de Confiance , accédez à la page IAM.

      Accéder à IAM
    2. Sélectionnez le projet.
    3. Cliquez sur  Accorder l'accès.
    4. Dans le champ Nouveaux comptes principaux, saisissez votre identifiant utilisateur. Il s'agit généralement de l'identifiant associé à un utilisateur dans un pool d'identités de personnel. Pour en savoir plus, consultez Représenter les utilisateurs de pools de personnel dans les stratégies IAM ou contactez votre administrateur.

    5. Cliquez sur Sélectionner un rôle, puis recherchez le rôle.
    6. Pour attribuer des rôles supplémentaires, cliquez sur  Ajouter un autre rôle et ajoutez tous les rôles supplémentaires.
    7. Cliquez sur Enregistrer.

Préparer votre environnement

Dans ce tutoriel, vous allez utiliser kubectl et gcloud CLI pour gérer les ressources hébergées surCloud de Confiance by S3NS. Vous pouvez autoriser l'accès à Cloud de Confiance by S3NSavec la gcloud CLI.

Pour configurer votre environnement avec gcloud CLI, définissez les variables d'environnement par défaut dans gcloud CLI :

gcloud config set project PROJECT_ID
gcloud config set billing/quota_project PROJECT_ID
export PROJECT_ID=$(gcloud config get project)
export REGION=u-france-east1
export CLUSTER_NAME=CLUSTER_NAME
export GSA_NAME=GSA_NAME
export KSA_NAME=KSA_NAME
export NAMESPACE=NAMESPACE
export PROJECT_NUMBER=$(gcloud projects describe PROJECT_ID --format="value(projectNumber)")
export MODEL_BUCKET_NAME=MODEL_BUCKET_NAME

Remplacez les valeurs suivantes :

  • PROJECT_ID : ID de votre projet Cloud de Confiance.
  • REGION : région u-france-east1 compatible avec les GPU H100. Vous pouvez consulter la liste des GPU disponibles par région.
  • CLUSTER_NAME : nom du cluster
  • GSA_NAME : nom du compte de service Google, par exemple, mistral-small-gsa.
  • KSA_NAME : nom du compte de service Kubernetes (par exemple, mistral-small-ksa).
  • NAMESPACE : espace de noms Kubernetes (par exemple, default).
  • MODEL_BUCKET_NAME : nom du bucket Cloud Storage dans lequel les pondérations du modèle seront stockées. Il peut s'agir du même nom que le modèle sélectionné, tel que mistral-small-4-119b-weights.

Créer et configurer des ressources Cloud de Confiance

Suivez les instructions ci-dessous pour créer les ressources requises.

Créer un cluster GKE et un pool de nœuds

Vous pouvez diffuser Mistral sur des GPU dans un cluster GKE Autopilot. Le cluster Autopilot offre une expérience Kubernetes entièrement gérée.

Dans gcloud CLI, exécutez la commande suivante :

gcloud container clusters create-auto CLUSTER_NAME \
    --project=PROJECT_ID \
    --location=REGION \
    --release-channel=rapid

Remplacez les valeurs suivantes :

  • PROJECT_ID : ID de votre projet Cloud de Confiance.
  • CLUSTER_NAME : nom du cluster
  • REGION : région dans laquelle se trouve votre cluster.

GKE crée un cluster Autopilot avec des nœuds de processeur et de GPU, à la demande des charges de travail déployées.

Créer un bucket Cloud Storage

  1. Dans gcloud CLI, exécutez la commande suivante :

    gcloud storage buckets create gs://${MODEL_BUCKET_NAME} \
      --project=${PROJECT_ID} \
      --location=${REGION} \
      --uniform-bucket-level-access
    

    Cette opération crée un bucket Cloud Storage pour stocker les fichiers de modèle que vous téléchargez depuis Hugging Face.

  2. Télécharger et importer les pondérations du modèle :

    Vous devez obtenir les pondérations du modèle Mistral Small 4 pour les versions que vous prévoyez de diffuser (par exemple, depuis Hugging Face ou d'autres sources officielles). Organisez les fichiers téléchargés localement dans des répertoires. Exemple :

    • ./mistral-small-4-119b-weights-local/ (contenant tous les fichiers du modèle Mistral Small 4)

    Importez ces répertoires dans votre bucket Cloud Storage avec les préfixes spécifiques attendus par les fichiers manifestes de déploiement :

    # Upload files for the mistral-small-4 model
    gcloud storage cp --recursive ./mistral-small-4-119b-weights-local/* gs://${MODEL_BUCKET_NAME}
    

    Cette structure de commande garantit que les fichiers de modèle se trouvent dans des chemins d'accès tels que gs://${MODEL_BUCKET_NAME}/config.json, etc.

Configurer Workload Identity Federation pour GKE pour l'accès à Cloud Storage

Pour permettre à vos pods Kubernetes d'accéder de manière sécurisée au bucket Cloud Storage contenant les pondérations du modèle, vous devez configurer Workload Identity Federation for GKE.

  1. Créez le compte de service Google :

    gcloud iam service-accounts create ${GSA_NAME} \
      --project=${PROJECT_ID}
    
  2. Déterminer et exporter l'adresse e-mail du compte de service Google :

    Le format de l'adresse e-mail dépend de la portée de votre ${PROJECT_ID} (s'il contient un signe deux-points).

    if [[ $PROJECT_ID == *:* ]]; then
      DOMAIN=$(echo $PROJECT_ID | cut -d: -f1)
      PROJ_NAME=$(echo $PROJECT_ID | cut -d: -f2)
      export GSA_EMAIL="${GSA_NAME}@${PROJ_NAME}.${DOMAIN}.s3ns.iam.gserviceaccount.com"
    else
      export GSA_EMAIL="${GSA_NAME}@${PROJECT_ID}.s3ns.iam.gserviceaccount.com"
    fi
      echo "Using GSA Email: ${GSA_EMAIL}"
    
  3. Créez le compte de service Kubernetes (KSA) :

    Cette clé KSA est utilisée dans votre fichier manifeste de déploiement.

    kubectl create serviceaccount ${KSA_NAME} --namespace ${NAMESPACE}
    

    Exécutez la commande suivante pour vérifier la création

    kubectl get serviceaccounts --namespace ${NAMESPACE}
    
  4. Annoter le KSA pour l'associer au GSA :

    Cette annotation indique à GKE le compte de service Google (GSA) que le compte de service Kubernetes (KSA) peut emprunter.

    kubectl annotate serviceaccount ${KSA_NAME} \
      --namespace ${NAMESPACE} \
      iam.gke.io/gcp-service-account=${GSA_EMAIL}
    
  5. Accordez au KSA l'autorisation d'emprunter l'identité du GSA :

    Cette liaison IAM sur le GSA permet au KSA d'agir en tant que GSA.

    if [[ $PROJECT_ID == *:* ]]; then
      DOMAIN=$(echo $PROJECT_ID | cut -d: -f1)
      PROJ_NAME=$(echo $PROJECT_ID | cut -d: -f2)
      export WI_MEMBER="serviceAccount:${PROJ_NAME}.${DOMAIN}.s3ns.svc.id.goog[${NAMESPACE}/${KSA_NAME}]"
    else
      export WI_MEMBER="serviceAccount:${PROJECT_ID}.s3ns.svc.id.goog[${NAMESPACE}/${KSA_NAME}]"
    fi
    
    gcloud iam service-accounts add-iam-policy-binding ${GSA_EMAIL} \
      --role roles/iam.workloadIdentityUser \
      --member="${WI_MEMBER}" \
      --project=${PROJECT_ID}
    
  6. Accordez au GSA l'autorisation de lire depuis le bucket :

    Attribuez le rôle storage.objectViewer au GSA sur le bucket.

    gcloud storage buckets add-iam-policy-binding gs://${MODEL_BUCKET_NAME} \
      --member="serviceAccount:${GSA_EMAIL}" \
      --role="roles/storage.objectViewer" \
      --project=${PROJECT_ID}
    

Déployer le modèle Mistral Small 4 sur vLLM

Pour déployer le modèle Mistral Small 4, créez des buckets Cloud Storage pour chaque modèle afin de stocker les pondérations du modèle, puis appliquez un fichier manifeste de déploiement Kubernetes pour la taille de modèle sélectionnée. Un déploiement est un objet de l'API Kubernetes qui vous permet d'exécuter plusieurs instances dupliquées de pods répartis entre les nœuds d'un cluster.

Procédure

L'application de ce fichier manifeste extrait l'image de conteneur vLLM, demande un GPU NVIDIA et se connecte automatiquement aux pondérations du modèle à partir des buckets Cloud Storage pour démarrer le moteur d'inférence vLLM.

Mistral Small 4

Suivez ces instructions pour déployer le modèle adapté aux instructions Mistral Small 4.

  1. Créez le fichier manifeste vllm-mistral-small.yaml suivant :

    apiVersion: cloud.google.com/v1
    kind: ComputeClass
    metadata:
      name: a3-edgegpu-8g-nolssd
    spec:
      priorities:
      - machineType: a3-edgegpu-8g-nolssd
        gpu:
          count: 8
          type: nvidia-h100-80gb
      nodePoolAutoCreation:
        enabled: true
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: vllm-mistral-deployment
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: mistral-server
      template:
        metadata:
          labels:
            app: mistral-server
            ai.gke.io/model: mistral-small-4-119b-weights
            ai.gke.io/inference-server: vllm
            examples.ai.gke.io/source: user-guide
        spec:
          containers:
          - name: inference-server
            image: us-docker.pkg.dev/vertex-ai/vertex-vision-model-garden-dockers/pytorch-vllm-serve:gemma4
            resources:
              requests:
                cpu: "48"
                memory: "200Gi"
                ephemeral-storage: "250Gi"
                nvidia.com/gpu: "2"
              limits:
                cpu: "48"
                memory: "200Gi"
                ephemeral-storage: "250Gi"
                nvidia.com/gpu: "2"
            command: ["./entrypoint.sh"] # Use the image's entrypoint
            args:
            - "python"
            - "-m"
            - "vllm.entrypoints.api_server"
            - "--host=0.0.0.0"
            - "--port=8080"
            - "--model=gs://mistral-small-4-119b-weights" # YOUR Cloud Storage PATH
            - "--tensor-parallel-size=2"
            - "--enable-log-requests"
            - "--enable-chunked-prefill"
            - "--enable-prefix-caching"
            - "--enable-auto-tool-choice"
            - "--generation-config=auto"
            - "--tool-call-parser=mistral"
            - "--dtype=bfloat16"
            - "--max-num-seqs=256"
            - "--max-model-len=8192"
            - "--gpu-memory-utilization=0.90"
            - "--reasoning-parser=mistral"
            - "--trust-remote-code"
            ports:
            - containerPort: 8080
            env:
            - name: GOOGLE_CLOUD_UNIVERSE_DOMAIN
              value: ""
            - name: CLOUDSDK_CORE_UNIVERSE_DOMAIN
              value: ""
            - name: GCS_URI_ARG_KEY
              value: "model"
            - name: GCS_URI_ENV_KEY
              value: "AIP_STORAGE_URI"
            - name: LORA_ADAPTER_ARG_KEY
              value: "lora-modules"
            - name: HF_HUB_ENABLE_HF_TRANSFER
              value: "1"
            volumeMounts:
            - mountPath: /dev/shm
              name: dshm
          volumes:
          - name: dshm
            emptyDir:
              medium: Memory
          nodeSelector:
            cloud.google.com/compute-class: a3-edgegpu-8g-nolssd
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: llm-service
    spec:
      selector:
        app: mistral-server
      type: ClusterIP
      ports:
        - protocol: TCP
          port: 8080
          targetPort: 8080
    
    
  2. Appliquez le fichier manifeste :

    kubectl apply -f vllm-mistral-small.yaml
    

    Si vous le souhaitez, vous pouvez limiter la taille de la fenêtre de contexte à 16 K à l'aide de l'option vLLM --max-model-len=16384. Si vous souhaitez une taille de fenêtre de contexte plus grande (jusqu'à 128 K), ajustez la configuration de votre fichier manifeste et de votre pool de nœuds avec une capacité de GPU plus importante.

Validation

  1. Attendez que le déploiement soit disponible :

    kubectl wait --for=condition=Available --timeout=1800s deployment/vllm-mistral-deployment
    
  2. Affichez les journaux du déploiement en cours d'exécution :

    kubectl logs -f -l app=mistral-server
    

    La ressource Déploiement télécharge les données du modèle Mistral Small 4. Ce processus peut prendre quelques minutes. Le résultat ressemble à ce qui suit :

      ...
      ...
      (APIServer pid=1) INFO:     Started server process [1]
      (APIServer pid=1) INFO:     Waiting for application startup.
      (APIServer pid=1) INFO:     Application startup complete.
    

Une fois le déploiement disponible, configurez le transfert de port pour interagir avec le modèle.

Diffuser le modèle

Dans cette section, vous allez interagir avec le modèle. Assurez-vous que le modèle est entièrement téléchargé avant de continuer.

Configurer le transfert de port

Exécutez la commande suivante pour configurer le transfert de port sur le modèle :

kubectl port-forward svc/llm-service 8080:8080 --namespace default &

Le résultat ressemble à ce qui suit :

Forwarding from 127.0.0.1:8080 -> 8080

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

Cette section explique comment effectuer un test de fumée de base pour vérifier les modèles Mistral adaptés aux instructions que vous avez déployés. Pour les autres modèles, remplacez mistral-small-4-119b-weights par le nom du modèle concerné.

Cet exemple montre comment tester le modèle Mistral affiné pour les instructions avec une entrée textuelle uniquement.

Dans une nouvelle session de terminal, utilisez curl pour discuter avec votre modèle :

curl http://127.0.0.1:8080/v1/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "mistralai/Mistral-Small-4-119B-2603-eagle",
    "prompt": "What is the capital of France?",
    "max_tokens": 50,
    "temperature": 0.7
  }'

La sortie ressemble à ceci :

{
  "id": "cmpl-b5d649b6a2d7a330",
  "object": "text_completion",
  "created": 1781137490,
  "model": "openapi",
  "choices": [
    {
      "index": 0,
      "text": " This question is likely to have been asked millions of times, 
      and the answer is always the same: Paris. But why is Paris the capital 
      of France? The answer to this question is not as simple as 
      it may seem, as it involves a complex",
      "logprobs": null,
      "finish_reason": "length",
      "stop_reason": null,
      "token_ids": null,
      "prompt_logprobs": null,
      "prompt_token_ids": null
    }
  ],
  "service_tier": null,
  "system_fingerprint": null,
  "usage": {
    "prompt_tokens": 8,
    "total_tokens": 58,
    "completion_tokens": 50,
    "prompt_tokens_details": null
  },
  "kv_transfer_params": null
}

Résoudre les problèmes

Observer les performances du modèle

Pour afficher les tableaux de bord des métriques d'observabilité d'un modèle, procédez comme suit :

  1. Dans la console Cloud de Confiance , accédez à la page Modèles déployés.

    Accéder à la page "Modèles déployés"

  2. Pour afficher des informations sur un déploiement spécifique, y compris ses métriques, ses journaux et ses tableaux de bord, cliquez sur le nom du modèle dans la liste.

  3. Sur la page d'informations sur le modèle, cliquez sur l'onglet Observabilité pour afficher les tableaux de bord suivants. Si vous y êtes invité, cliquez sur Activer pour activer la collecte de métriques pour le cluster.

    • Le tableau de bord Utilisation de l'infrastructure affiche les métriques d'utilisation.
    • Le tableau de bord DCGM affiche les métriques DCGM.
    • Si vous utilisez vLLM, le tableau de bord Performances du modèle est disponible et affiche les métriques de performances du modèle vLLM.

Vous pouvez également afficher les métriques dans l'intégration du tableau de bord vLLM dans Cloud Monitoring. Ces métriques sont agrégées pour tous les déploiements vLLM sans filtres prédéfinis.

vLLM expose les métriques au format Prometheus par défaut. Vous n'avez pas besoin d'installer d'exportateur supplémentaire. Pour savoir comment utiliser Google Cloud Managed Service pour Prometheus afin de collecter des métriques à partir de votre modèle, consultez les conseils d'observabilité vLLM dans la documentation Cloud Monitoring.

Effectuer un nettoyage

Pour éviter que les ressources utilisées lors de ce tutoriel soient facturées sur votre compte Google Cloud, supprimez le projet contenant les ressources, ou conservez le projet et supprimez les ressources individuelles.

Supprimer les ressources déployées

Pour éviter que les ressources que vous avez créées dans ce guide soient facturées sur votre compte Cloud de Confiance , exécutez la commande suivante :

gcloud container clusters delete CLUSTER_NAME \
    --location=REGION

Remplacez les valeurs suivantes :

  • REGION : région de votre cluster.
  • CLUSTER_NAME : nom du cluster

Étapes suivantes