Ce tutoriel vous explique comment déployer et diffuser Qwen3-30B-A3B (Qwen/Qwen3-30B-A3B-FP8), un modèle Mixture of Experts, sur Google Kubernetes Engine (GKE). Le déploiement utilise des accélérateurs TPU v6e (Trillium) multi-hôtes et le framework de diffusion TPU vLLM avec TorchTPU (torchtpu) et la désagrégation de préremplissage-décodage (PD).
Dans la configuration de déploiement décrite dans ce tutoriel, vous provisionnez deux pools de nœuds ct6e-standard-4t multi-hôtes, chacun organisé selon une topologie 2x4 (huit puces TPU v6e sur deux nœuds par pool de nœuds, pour un total de 16 puces TPU v6e). Vous utilisez l'API Kubernetes JobSet et Ray 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 TPU v6e distinctes avec le parallélisme des données et le parallélisme des experts activés.
- Acheminez les requêtes via un proxy de désagrégation.
Pour exécuter un workflow de diffusion TorchTPU vLLM multi-hôte similaire sur des accélérateurs TPU7x (Ironwood) avec le modèle Qwen3.5-397B plus volumineux, consultez Diffuser Qwen3.5-397B sur GKE avec TorchTPU vLLM multi-hôte sur des accélérateurs TPU7x.
Objectifs
- Configurez votre cluster GKE et vos pools de nœuds TPU v6e multi-hôtes.
- Préparer les pondérations du modèle dans un bucket Cloud Storage.
- Déployez les serveurs de préremplissage, de décodage et de serveur proxy vLLM TorchTPU multi-hôtes avec JobSet.
- Exécuter une charge de travail de benchmark de diffusion et analyser les résultats
- 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.
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
Configurez votre environnement pour le tutoriel :
Activez l'API Kubernetes Engine dans votre projet Google Cloud :
Installez et initialisez la Google Cloud CLI, puis installez
kubectl. Si vous utilisez Cloud Shell, les deux outils sont préinstallés.Assurez-vous que votre projet dispose d'un quota de SSD 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.
Filtrez par Disque persistant SSD (Go) et vérifiez que vous disposez d'un quota de SSD suffisant dans votre région cible.
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.
Obtenir un jeton d'accès Hugging Face
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.
Rôles requis
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) - Administrateur de l'espace de stockage (
roles/storage.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.
Configurer vos variables d'environnement
Pour configurer vos variables d'environnement, procédez comme suit :
Configurez votre authentification :
Exportez les variables d'environnement que vous utiliserez tout au long de ce tutoriel :
Remplacez les éléments suivants :
YOUR_PROJECT_ID: ID de votre projetGoogle 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 TPU v6e, par exempleus-central1-c.YOUR_CLUSTER_NAME: nom de votre cluster GKE.YOUR_RESERVATION_NAME: si vous utilisez une réservation, nom de votre réservation de TPU v6e.YOUR_GCS_BUCKET: nom du bucket Cloud Storage que vous utilisez pour stocker les pondérations du modèle.YOUR_HF_TOKEN: votre jeton d'accès Hugging Face.
Si vous utilisez une image de conteneur vLLM TorchTPU personnalisée, remplacez l'URI d'image
vllm/vllm-torchtpupar défaut dans la variableVLLM_IMAGEpar l'URI de votre image. Pour les images publiques, consultez le dépôt vLLM TorchTPU.
Créer le cluster GKE
Pour créer un cluster GKE en mode Standard et associer deux pools de nœuds TPU v6e 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 avec la fédération d'Workload Identity pour GKE activée :
Le résultat ressemble à ce qui suit :
NAME LOCATION MASTER_VERSION MASTER_IP MACHINE_TYPE NODE_VERSION NUM_NODES STATUS STACK_TYPE asq-v6e us-central1 1.35.7-gke.1027000 35.226.172.84 e2-standard-4 1.35.7-gke.1027000 3 RUNNING IPV4Créez deux pools de nœuds TPU v6e multi-hôtes, chacun contenant deux nœuds
ct6e-standard-4t(huit puces TPU v6e dans une topologie2x4par pool de nœuds, pour un total de 16 puces TPU v6e) :Ce tutoriel utilise la capacité Spot (
--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. Vous pouvez également créer les pools de nœuds à l'aide d'une réservation ou de VM à démarrage flexible en transmettant les options suivantes :Réservation spécifique : créez le pool de nœuds à l'aide d'une réservation spécifique :
Pour en savoir plus sur les réservations TPU, consultez À propos des réservations Cloud TPU.
VM à démarrage flexible : provisionnez 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.
Le résultat de chaque pool de nœuds ressemble à ce qui suit :
NAME MACHINE_TYPE DISK_SIZE_GB NODE_VERSION np-0 ct6e-standard-4t 100 1.35.7-gke.1027000Configurez les identifiants
kubectlpour communiquer avec votre cluster :
Stocker les pondérations du modèle dans Cloud Storage
Préparez les pondérations du modèle dans un bucket Cloud Storage pour les exécutions de votre charge de travail :
Créez un bucket Cloud Storage avec un accès uniforme au niveau du bucket :
Accordez des autorisations IAM (Identity and Access Management) sur le bucket à votre compte de service Compute Engine par défaut et au compte de service Kubernetes par défaut :
Créez un secret Kubernetes nommé
hf-secretpour stocker votre jeton d'accès Hugging Face :Récupérez le fichier manifeste
download_qwen3_30b.yaml:Vous pouvez également créer un fichier nommé
download_qwen3_30b.yamlavec le contenu suivant :Téléchargez les pondérations du modèle
Qwen/Qwen3-30B-A3B-FP8sur le volume de préproduction et transférez-les vers votre bucket Cloud Storage :Cette étape prend environ 5 à 10 minutes.
Attendez que le pod démarre et surveillez les journaux du job de téléchargement :
Une fois le job terminé, vérifiez que les 16 segments
.safetensorsse trouvent dans votre bucket Cloud Storage :Supprimez le job de préproduction terminé :
Déployer le serveur vLLM TorchTPU multi-hôte
Le fichier manifeste de la charge de travail (v6e_qwen3_server_multihost_slice.yaml) définit une ressource JobSet Kubernetes (vllm-qwen3-30b-pd-disagg-v6e) avec trois jobs répliqués qui coordonnent la mise en service désagrégée du préremplissage et du décodage sur les deux pools de nœuds TPU v6e 2x4 :
Serveur de préremplissage (
prefill) : exécute deux instances répliquées sur un pool de nœuds TPU v6e2x4(deux nœudsct6e-standard-4tavec quatre puces par hôte, pour un total de huit cœurs TPU). Les pods forment un cluster Ray à deux nœuds et lancent vLLM TorchTPU sur le port8000pourQwen/Qwen3-30B-A3B-FP8. Le serveur utiliseTPURaidenConnectorconfiguré en tant quekv_produceravec les options suivantes :--data-parallel-size=8--tensor-parallel-size=1--enable-expert-parallel--load-format=runai_streamer
Serveur de décodage (
decode) : exécute deux instances répliquées sur le deuxième pool de nœuds TPU v6e2x4(huit cœurs TPU au total). Le JobSet utilise des règles d'affinité et d'anti-affinité de pod sur l'étiquettecloud.google.com/gke-nodepoolpour isoler le préremplissage et le décodage sur des pools de nœuds distincts. Les pods forment un cluster Ray à deux nœuds et lancent vLLM TorchTPU sur le port7200avecTPURaidenConnectorconfiguré surkv_consumer.Proxy de désagrégation (
proxy) : exécute le scripttoy_proxy_server.pysur le port10000pour coordonner le routage des requêtes et le transfert du cache KV entre le serveur de préremplissage (port8000) et le serveur de décodage (port7200).
Pour déployer et surveiller les serveurs vLLM désagrégés, procédez comme suit :
Installez la ressource CustomResourceDefinition et le contrôleur JobSet Kubernetes sur votre cluster :
Récupérez le fichier manifeste du serveur :
Vous pouvez également créer un fichier nommé
v6e_qwen3_server_multihost_slice.yamlavec le contenu suivant :Remplacez le nom de votre bucket Cloud Storage et l'image de conteneur dans le fichier
v6e_qwen3_server_multihost_slice.yaml, puis appliquez le fichier manifeste :Cette configuration utilise une tranche TPU v6e
2x4(deux nœuds) pour le préremplissage et une tranche TPU v6e2x4(deux nœuds) pour le décodage. Pour faire évoluer le nombre de nœuds dans l'un ou l'autre des pools, mettez à jour le champreplicas(replicas: NUM_NODES). RemplacezNUM_NODESpar le nombre de nœuds que vous souhaitez utiliser.Surveillez les journaux des pods de préremplissage et de décodage jusqu'à ce que l'application ait démarré :
Le chargement et la compilation initiaux du modèle prennent environ 15 à 25 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 serveurs de préremplissage et de décodage indiquent
Application startup completeavant d'exécuter la charge de travail de benchmark :(APIServer pid=1) INFO: Started server process [1] (APIServer pid=1) INFO: Waiting for application startup. (APIServer pid=1) INFO: Application startup complete.
Exécuter une charge de travail de benchmark
Pour comparer le modèle Qwen3-30B-A3B déployé à l'aide d'une charge de travail d'entrée de 8 192 jetons et de sortie de 1 024 jetons (8k/1k) par rapport au proxy de désagrégation, procédez comme suit :
Récupérez le fichier manifeste du benchmark :
Vous pouvez également créer un fichier nommé
v6e_qwen3_benchmark_multihost_slice.yamlavec le contenu suivant :Appliquez le fichier manifeste du job de benchmark :
Attendez que le pod de benchmark soit prêt, puis surveillez les journaux du job de benchmark :
Une fois le benchmark terminé, recherchez un résultat contenant des métriques telles que les suivantes :
Output token throughputTotal token throughputTTFTTPOT
Effectuer un nettoyage
Pour éviter que les ressources utilisées dans ce tutoriel ne soient facturées sur votre compte Google Cloud , supprimez les charges de travail Kubernetes, les pools de nœuds TPU v6e, le cluster GKE et votre bucket Cloud Storage :
Supprimez les charges de travail Kubernetes :
Supprimez les pools de nœuds TPU v6e et le cluster GKE :
Supprimez le bucket Cloud Storage qui stocke les pondérations du modèle préproduit. Si vous souhaitez conserver les pondérations du modèle, ignorez cette étape ou copiez-les à l'emplacement de votre choix :
Étapes suivantes
- En savoir plus sur vLLM sur Cloud TPU.
- En savoir plus sur les TPU v6e (Trillium)
- En savoir plus sur Cloud TPU