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é.
- Préparez votre environnement avec un cluster GKE en mode Autopilot.
- Déployer un conteneur vLLM sur votre cluster.
- 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 theresourcemanager.projects.createpermission. Learn how to grant roles.
-
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 theserviceusage.services.enablepermission. Learn how to grant roles.-
Assurez-vous de disposer des rôles suivants sur le projet : roles/container.admin, roles/iam.serviceAccountAdmin
Vérifier les rôles
-
Dans la console Cloud de Confiance , accédez à la page IAM.
Accéder à IAM - Sélectionnez le projet.
-
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.
- 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
-
Dans la console Cloud de Confiance , accédez à la page IAM.
Accéder à IAM - Sélectionnez le projet.
- Cliquez sur Accorder l'accès.
-
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.
- Cliquez sur Sélectionner un rôle, puis recherchez le rôle.
- Pour attribuer des rôles supplémentaires, cliquez sur Ajouter un autre rôle et ajoutez tous les rôles supplémentaires.
- Cliquez sur Enregistrer.
-
- Assurez-vous que votre projet dispose d'un quota suffisant pour les GPU H100. Pour en savoir plus, consultez les pages À propos des GPU et Quotas d'allocation.
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égionu-france-east1compatible avec les GPU H100. Vous pouvez consulter la liste des GPU disponibles par région.CLUSTER_NAME: nom du clusterGSA_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 quemistral-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 clusterREGION: 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
Dans gcloud CLI, exécutez la commande suivante :
gcloud storage buckets create gs://${MODEL_BUCKET_NAME} \ --project=${PROJECT_ID} \ --location=${REGION} \ --uniform-bucket-level-accessCette opération crée un bucket Cloud Storage pour stocker les fichiers de modèle que vous téléchargez depuis Hugging Face.
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.
Créez le compte de service Google :
gcloud iam service-accounts create ${GSA_NAME} \ --project=${PROJECT_ID}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}"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}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}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}Accordez au GSA l'autorisation de lire depuis le bucket :
Attribuez le rôle
storage.objectViewerau 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.
Créez le fichier manifeste
vllm-mistral-small.yamlsuivant :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: 8080Appliquez le fichier manifeste :
kubectl apply -f vllm-mistral-small.yamlSi 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
Attendez que le déploiement soit disponible :
kubectl wait --for=condition=Available --timeout=1800s deployment/vllm-mistral-deploymentAffichez les journaux du déploiement en cours d'exécution :
kubectl logs -f -l app=mistral-serverLa 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
- Si le message
Empty reply from servers'affiche, il est possible que le conteneur n'ait pas terminé le téléchargement des données du modèle. Vérifiez à nouveau dans les journaux du pod le messageConnectedindiquant que le modèle est prêt à être diffusé. - Si
Connection refuseds'affiche, vérifiez que le transfert de port est actif.
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 :
Dans la console Cloud de Confiance , accédez à la page Modèles déployés.
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.
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
- Apprenez-en plus sur les GPU dans GKE.
- Découvrez comment déployer des charges de travail GPU dans Autopilot.
- Explorez le dépôt GitHub et la documentation de vLLM.
- Explorez Vertex AI Model Garden.
- Découvrez comment exécuter des charges de travail d'IA/ML optimisées avec les fonctionnalités d'orchestration de plate-forme GKE.