Ce tutoriel vous explique comment déployer et diffuser Qwen3-Coder-480B (Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8), un modèle de codage Mixture-of-Experts, sur Google Kubernetes Engine (GKE). Le déploiement utilise des accélérateurs TPU7x (Ironwood) multi-hôtes et le framework de diffusion SGLang avec TorchTPU (torchtpu) et la désagrégation préremplissage-décodage (PD).
Dans la configuration de déploiement décrite dans ce tutoriel, vous provisionnez deux pools de nœuds tpu7x-standard-4t multi-hôtes, chacun organisé selon une topologie 2x2x2 (huit puces TPU7x sur deux nœuds par pool de nœuds, pour un total de 16 puces TPU7x). Vous utilisez l'API Kubernetes LeaderWorkerSet pour effectuer les opérations suivantes :
- Exécutez des serveurs de préremplissage et de décodage multi-hôtes désagrégés sur des tranches TPU7x distinctes avec le parallélisme de tenseur et le parallélisme d'expert activés.
- Acheminez les requêtes compatibles avec OpenAI via un routeur de désagrégation SGLang.
Objectifs
- Configurez votre cluster GKE et vos pools de nœuds TPU7x multi-hôtes.
- Configurez les identifiants et installez le contrôleur LeaderWorkerSet.
- Déployez les charges de travail de préremplissage, de décodage et de routeur SGLang multihôtes.
- Envoyez une requête d'inférence au service de routeur SGLang.
- Exécutez une charge de travail de benchmark de diffusion.
- Effectuer un nettoyage.
Coûts
Dans ce document, vous utilisez les composants facturables suivants deGoogle Cloud :
Obtenez une estimation des coûts en fonction de votre utilisation prévue à l'aide du [simulateur de coût]((https://cloud.google.com/products/calculator).
Une fois que vous avez terminé les tâches décrites dans ce document, vous pouvez éviter de continuer à payer des frais en supprimant les ressources que vous avez créées. Pour en savoir plus, consultez la section Effectuer un nettoyage.
Avant de commencer
- Installez et initialisez la Google Cloud CLI, puis installez
kubectl. Si vous utilisez Cloud Shell, les deux outils sont préinstallés.
Vous avez besoin d'un jeton d'accès Hugging Face pour suivre ce tutoriel. Vous pouvez créer un compte sans frais sur Hugging Face. Une fois que vous disposez d'un compte, générez un jeton d'accès :
- Sur la page Welcome to Hugging Face (Bienvenue sur Hugging Face), cliquez sur l'avatar de votre compte, puis sélectionnez Access tokens (Jetons d'accès).
- Sur la page Access tokens (Jetons d'accès), cliquez sur Create new token (Créer un jeton).
- Sélectionnez le type de jeton Read (Lecture) et saisissez un nom pour votre jeton.
- Votre jeton d'accès s'affiche. Enregistrez le jeton dans un endroit sûr.
Activez l'API Kubernetes Engine, l'API Compute Engine, l'API Cloud TPU et l'API Artifact Registry dans votre projet Google Cloud :
Assurez-vous que votre projet dispose d'un quota de disque et d'un quota d'adresses IP externes suffisants dans la région où se trouve votre capacité TPU :
Dans la console Google Cloud , accédez à la page Quotas et limites du système.
Vérifiez que vous disposez d'au moins 2 800 Gio de quota Google Cloud Hyperdisk Balanced disponible sur les quatre volumes éphémères de 700 Gio utilisés pour la mise en cache du modèle par les pods de préremplissage et de décodage.
Filtrez par Adresses IPv4 externes régionales en cours d'utilisation et vérifiez que vous disposez d'un quota d'adresses IP suffisant dans votre région cible.
Pour obtenir les autorisations nécessaires pour suivre ce tutoriel, demandez à votre administrateur de vous accorder les rôles IAM suivants sur votre projet :
- Administrateur Kubernetes Engine (
roles/container.admin) - Administrateur de Compute (
roles/compute.admin) -
Utilisateur du compte de service (
roles/iam.serviceAccountUser)
Pour en savoir plus sur l'attribution de rôles, consultez la page Gérer l'accès aux projets, aux dossiers et aux organisations.
Vous pouvez également obtenir les autorisations requises avec des rôles personnalisés ou d'autres rôles prédéfinis.
Assurez-vous que votre compte de service Compute Engine par défaut dispose des rôles IAM (Identity and Access Management) suivants sur votre projet :
- Compte de service de nœud par défaut Kubernetes Engine (
roles/container.defaultNodeServiceAccount) - Lecteur Artifact Registry (
roles/artifactregistry.reader)
Configurer vos variables d'environnement
Exportez les variables d'environnement que vous utiliserez tout au long de ce tutoriel :
Remplacez les éléments suivants :
YOUR_CLUSTER_NAME: nom de votre cluster GKE.YOUR_PROJECT_ID: ID de votre projet Google Cloud.YOUR_REGION: région dans laquelle vous souhaitez déployer votre cluster, par exempleus-central1.YOUR_ZONE: zone dans laquelle vous souhaitez déployer vos pools de nœuds TPU7x, par exempleus-central1-c.YOUR_RESERVATION_NAME: si vous utilisez une réservation, nom de votre réservation TPU7x.YOUR_HF_TOKEN: votre jeton d'accès Hugging Face.YOUR_SGLANG_TPU_IMAGE: si vous utilisez une image de conteneur SGLang TorchTPU personnalisée, l'URI de votre image ; sinon, l'image SGLang TorchTPU par défaut.
Créer le cluster GKE
Pour créer un cluster GKE en mode Standard et associer deux pools de nœuds TPU7x multi-hôtes pour la désagrégation du préremplissage et du décodage, procédez comme suit :
Créez un cluster GKE régional qui utilise des nœuds
e2-standard-4pour le pool de nœuds par défaut, qui fournit suffisamment de ressources de processeur et de mémoire pour le contrôleur LeaderWorkerSet et le routeur de désagrégation SGLang :Créez une règle d'emplacement de charge de travail à haut débit avec une topologie d'accélérateur
2x2x2, qui est requise pour les pools de nœuds TPU7x multi-hôtes :Créez deux pools de nœuds TPU7x multi-hôtes (
tpu7x-pool-0ettpu7x-pool-1), chacun contenant deux nœudstpu7x-standard-4t(huit puces TPU7x dans une topologie2x2x2par pool de nœuds, pour un total de 16 puces TPU7x) :Au lieu d'utiliser une réservation spécifique, vous pouvez également créer les pools de nœuds à l'aide de la capacité Spot ou de VM Flex-start en transmettant les options suivantes :
- VM Spot : remplacez
--reservation-affinity=specificet--reservation=${RESERVATION}par--spotpour utiliser la capacité Spot. La création d'instances utilisant la capacité Spot peut prendre du temps après la création du pool de nœuds, et elles peuvent être préemptées pendant l'exécution de la charge de travail. - VM à démarrage flexible : remplacez
--num-nodes=2,--reservation-affinity=specificet--reservation=${RESERVATION}par--flex-start,--enable-autoscaling,--num-nodes=0,--min-nodes=0et--max-nodes=2pour provisionner le pool de nœuds à l'aide de l'option de consommation Démarrage flexible. Pour en savoir plus, consultez Exécuter une petite charge de travail par lot avec des TPU et des VM à démarrage flexible.
- VM Spot : remplacez
Configurez les identifiants
kubectlpour communiquer avec votre cluster :
Configurer les identifiants et installer LeaderWorkerSet
Pour préparer votre cluster au déploiement SGLang multi-hôte, procédez comme suit :
Créez un secret Kubernetes nommé
hf-secretpour stocker votre jeton d'accès Hugging Face :Installez la CustomResourceDefinition et le contrôleur LeaderWorkerSet sur votre cluster :
Déployer le serveur SGLang multi-hôte
Le fichier manifeste de la charge de travail (qwen3-coder-480b-multihost-disagg-v7x.yaml) définit les ressources suivantes pour coordonner la diffusion désagrégée de préremplissage et de décodage sur les deux pools de nœuds TPU7x 2x2x2 :
- StorageClass (
hyperdisk-balanced-tpu) : provisionne des volumes ReadWriteOnce éphémères de 700 Gio, sauvegardés par un stockage Google Cloud Hyperdisk Balanced. Chacun des quatre pods de préremplissage et de décodage installe son propre volume sur/datapour stocker localement le point de contrôleQwen/Qwen3-Coder-480B-A35B-Instruct-FP8téléchargé. - Pool de préremplissage (
sglang-prefill-serviceetsglang-tpu-prefill) : exécute un LeaderWorkerSet desize: 2(un pod leader et un pod de nœud de calcul) épinglé exclusivement à un pool de nœuds TPU7x2x2x2(huit puces TPU, qui fournissent 16 TensorCores). LeaderWorkerSet utilise l'annotationleaderworkerset.sigs.k8s.io/exclusive-topologydéfinie sur"cloud.google.com/gke-nodepool". Les pods lancentsglang.launch_serveravec les options--disaggregation-mode=prefill,--tensor-parallel-size=16et--ep-size=16, exposant le port HTTP8000et le port d'amorçage8998. - Pool de décodage (
sglang-decode-serviceetsglang-tpu-decode) : exécute un LeaderWorkerSet desize: 2épinglé au deuxième pool de nœuds TPU7x2x2x2(huit puces TPU, qui fournissent 16 TensorCores). LeaderWorkerSet lancesglang.launch_serveravec les options--disaggregation-mode=decode,--tensor-parallel-size=16et--ep-size=16. - Routeur de désagrégation (
sglang-routeretsglang-service) : exécute un déploiement de processeur qui exécute le modulesglang_router.launch_routeravec l'option--pd-disaggregationet expose un service ClusterIP sur le port8000. Le routeur dirige les requêtes et coordonne le transfert du cache KV entre les servicessglang-prefill-serviceetsglang-decode-service.
Pour déployer et surveiller les serveurs SGLang multi-hôtes, procédez comme suit :
Téléchargez le fichier manifeste de la charge de travail :
Vous pouvez également créer un fichier nommé
qwen3-coder-480b-multihost-disagg-v7x.yamlavec le contenu suivant :Appliquez le fichier manifeste de la charge de travail à votre cluster :
Vérifiez que les pods de routeur, de préremplissage et de décodage sont créés :
Lorsque tous les pods sont prêts, la sortie ressemble à ce qui suit :
NAME READY STATUS RESTARTS AGE sglang-router-6d87cb8c7d-gv4wr 1/1 Running 0 39m sglang-tpu-decode-0 1/1 Running 0 40m sglang-tpu-decode-0-1 1/1 Running 0 40m sglang-tpu-prefill-0 1/1 Running 0 40m sglang-tpu-prefill-0-1 1/1 Running 0 40mSurveillez les journaux du pod leader de préremplissage et de décodage jusqu'à la fin du démarrage :
Le téléchargement initial du modèle, le chargement des pondérations et la compilation prennent environ 15 à 30 minutes lors de la première exécution.
Si vous utilisez une capacité préemptive telle que la capacité Spot ou des VM Flex-start, la création de vos nœuds de tranche TPU peut prendre plus de temps après la création du pool de nœuds, et ils peuvent être préemptés pendant l'exécution des charges de travail. Pour en savoir plus, consultez Instances de VM préemptives. Pour vérifier si vos nœuds de tranche TPU ont été créés, consultez Vérifier l'état et les conditions du nœud.
Attendez que les journaux des pods leaders de préremplissage et de décodage affichent le message suivant et que
kubectl get podsaffiche1/1dans la colonneREADYpour tous les pods :The server is fired up and ready to roll!Ouvrez une deuxième session de terminal et transférez le port local
8000verssglang-service:Laissez le transfert de port s'exécuter dans cette session de terminal.
Envoyer des requêtes d'inférence
Revenez à votre première session de terminal et envoyez une requête de complétion de chat au point de terminaison /v1/chat/completions exposé par le routeur SGLang :
Exécuter une charge de travail de benchmark
Pour évaluer le modèle Qwen3-Coder déployé à l'aide d'une charge de travail d'entrée de 1 024 jetons et de sortie de 1 024 jetons (1k/1k) à partir du pod sglang-router, exécutez la commande suivante :
Effectuer un nettoyage
Pour éviter que des frais supplémentaires ne soient facturés sur votre compte Google Cloud pour les ressources utilisées dans ce tutoriel, supprimez les ressources suivantes :
Supprimez les charges de travail de préremplissage, de décodage et de routeur SGLang :
Supprimez les pools de nœuds TPU7x, la règle d'emplacement des charges de travail et le cluster GKE :
Étapes suivantes
- En savoir plus sur SGLang.
- En savoir plus sur les TPU7x (Ironwood).
- En savoir plus sur Cloud TPU