Ce tutoriel vous explique comment déployer et diffuser DeepSeek-R1 (deepseek-ai/DeepSeek-R1), un modèle Mixture-of-Experts de 671 milliards de paramètres avec 37 milliards de paramètres actifs, sur Google Kubernetes Engine (GKE) surGoogle Cloud. Le déploiement utilise Cluster Toolkit, deux instances de machines virtuelles (VM) A4 (a4-highgpu-8g) multi-hôtes avec un total de 16 GPU NVIDIA B200, et le framework de diffusion vLLM.
Dans la configuration de déploiement décrite dans ce tutoriel, vous allez utiliser Cluster Toolkit pour provisionner un cluster GKE en mode Standard. Le cluster comporte deux nœuds a4-highgpu-8g connectés via un réseau GPUDirect RDMA (Remote Direct Memory Access). Vous préparez ensuite les pondérations du modèle dans Cloud Storage et utilisez l'API Kubernetes JobSet et Ray pour diffuser le modèle sur les 16 GPU NVIDIA B200 avec le parallélisme de tenseur, le parallélisme d'expert et un cache KV FP8.
Objectifs
- Installez Cluster Toolkit et provisionnez un cluster GKE A4 multi-hôte en mode Standard.
- Préparez les pondérations du modèle DeepSeek-R1 dans un bucket Cloud Storage.
- Déployez un serveur d'inférence vLLM multi-hôte avec JobSet et Ray sur deux nœuds A4, avec un total de 16 GPU NVIDIA B200.
- Envoyez une requête de complétion de chat au serveur vLLM.
- Exécutez une charge de travail de benchmark de diffusion.
- Nettoyez les ressources déployées.
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.
Avant de commencer
Configurez votre environnement pour le tutoriel :
- Installez et initialisez la Google Cloud CLI, puis installez
kubectl. Si vous utilisez Cloud Shell, les deux outils sont préinstallés. - Si vous suivez ce tutoriel depuis un poste de travail Linux ou macOS plutôt que depuis Cloud Shell, installez les dépendances Cluster Toolkit requises (telles que Terraform et Git).
Activez l'API Kubernetes Engine, l'API Compute Engine, l'API Cloud Storage, l'API Artifact Registry et l'API Service Usage dans votre projet Google Cloud :
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) - Administrateur de projet IAM (
roles/resourcemanager.projectIamAdmin) - Administrateur de compte de service (
roles/iam.serviceAccountAdmin) -
Utilisateur du compte de service (
roles/iam.serviceAccountUser) - Consommateur Service Usage (
roles/serviceusage.serviceUsageConsumer)
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
Configurez l'authentification et les variables d'environnement pour le tutoriel :
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 de calcul où se trouve votre capacité A4 et où vous souhaitez déployer votre cluster, par exempleus-central1.YOUR_ZONE: zone de calcul où se trouve votre capacité A4, par exempleus-central1-b.YOUR_CLUSTER_NAME: nom de votre cluster GKE et de votre déploiement Cluster Toolkit. Utilisez un nom de 20 caractères ou moins pour que l'ID de compte de service du pool de nœuds généré (YOUR_CLUSTER_NAME-gke-np-sa) ne dépasse pas la limite de 30 caractères d'Identity and Access Management (IAM).YOUR_RESERVATION_NAME: nom de votre réservation A4 ou chemin d'accès au bloc de réservation étendu au formatRESERVATION_NAME/reservationBlocks/RESERVATION_BLOCK_NAME.YOUR_HF_TOKEN: votre jeton d'accès Hugging Face.YOUR_GCS_BUCKET: nom unique du bucket Cloud Storage dans lequel vous préparez les pondérations du modèle. Le script définit égalementTERRAFORM_BUCKETsurYOUR_GCS_BUCKET-tf-statepour stocker l'état Terraform pour Cluster Toolkit.
Le script définit également
CLUSTER_TOOLKIT_VERSIONsurv1.104.0, ce qui spécifie la version de Cluster Toolkit à installer. Cluster Toolkit versionv1.104.0et ultérieures incluent des options de consommation de capacité intégrées pourexamples/gke-a4/gke-a4-deployment.yaml. Dans les versions antérieures àv1.104.0, vous devez ajouter ces options de capacité manuellement.
Créer le cluster GKE
Téléchargez Cluster Toolkit et provisionnez un cluster GKE en mode Standard avec deux nœuds a4-highgpu-8g, la mise en réseau GPUDirect RDMA et le contrôleur JobSet :
Téléchargez et extrayez le bundle Cluster Toolkit prédéfini pour la version spécifiée dans
CLUSTER_TOOLKIT_VERSION(v1.104.0), remplacez votre répertoire de travail par le répertoirecluster-toolkit, puis vérifiez la version binaire :Vous pouvez éventuellement afficher les commandes et les options disponibles dans Cluster Toolkit :
Créez le bucket Cloud Storage qui stocke l'état Terraform pour votre déploiement Cluster Toolkit :
Créez le fichier de configuration de déploiement
examples/gke-a4/gke-a4-deployment.yamlpour deux nœudsa4-highgpu-8g:Par défaut, le plan
examples/gke-a4/gke-a4.yamlest configuré pour utiliser une réservation spécifique. Si vous n'avez pas de réservation spécifique, vous pouvez modifierexamples/gke-a4/gke-a4.yamlavant de déployer le cluster pour utiliser l'une des options de consommation suivantes :- Capacité Spot : assurez-vous que votre projet dispose d'un quota préemptif suffisant pour vos GPU, disques et processeurs. En bas de
examples/gke-a4/gke-a4.yaml, mettez en commentaire la section--- Option 1: Specific Reservation ---et annulez la mise en commentaire de la section--- Option 4: Spot ---. - VM à démarrage flexible : assurez-vous que votre projet dispose d'un quota préemptif suffisant pour vos GPU, disques et processeurs. En bas de
examples/gke-a4/gke-a4.yaml, mettez en commentaire la section--- Option 1: Specific Reservation ---et annulez la mise en commentaire de la section--- Option 2: DWS Flex Start ---.
- Capacité Spot : assurez-vous que votre projet dispose d'un quota préemptif suffisant pour vos GPU, disques et processeurs. En bas de
Déployez le cluster GKE à l'aide de la commande
gcluster deploy:La création du cluster prend environ 30 à 45 minutes. Si vous exécutez
./gcluster deploysans l'option--auto-approve, saisissezalorsque vous y êtes invité pour appliquer les modifications proposées. Une fois le déploiement terminé, le résultat se termine par un message semblable à celui-ci :Apply complete! Resources: 80 added, 0 changed, 0 destroyed.Configurez les identifiants
kubectlpour communiquer avec votre cluster :
Stocker les pondérations du modèle dans Cloud Storage
Téléchargez les pondérations DeepSeek-R1 sur le disque SSD local de l'un de vos nœuds A4 et transférez-les vers un bucket Cloud Storage pour un streaming rapide entre les nœuds :
Téléchargez les fichiers manifestes Kubernetes pour le job de téléchargement du modèle, le serveur d'inférence vLLM et les pods de benchmark :
Créez le bucket Cloud Storage avec un accès uniforme au niveau du bucket pour stocker les pondérations du modèle :
Accordez des autorisations IAM sur le bucket au compte de service Kubernetes par défaut, au compte de service Compute Engine par défaut et au compte de service du pool de nœuds du cluster (
${CLUSTER_NAME}-gke-np-sa) :Les autorisations IAM accordées par le script précédent incluent le rôle "Lecteur des anciens buckets Storage" (
roles/storage.legacyBucketReader), qui est requis pour--load-format runai_streamer.Créez un secret Kubernetes nommé
hf-secretpour stocker votre jeton d'accès Hugging Face :Examinez le fichier manifeste
download_model.yamlou créez-le localement si vous ne l'avez pas téléchargé précédemment :Remplacez le nom de votre bucket Cloud Storage dans le fichier manifeste
download_model.yamlet lancez le job de téléchargement du modèle :Attendez que le pod de téléchargement démarre, puis diffusez les journaux du job :
Le téléchargement du modèle sur le disque SSD NVMe local du nœud et l'importation des pondérations dans votre bucket Cloud Storage prennent environ 30 à 40 minutes.
Une fois le job terminé, vérifiez que les 163 segments
.safetensorssont présents dans votre bucket Cloud Storage :Supprimez le job de préproduction terminé :
Déployer le serveur vLLM multi-hôte
Le fichier manifeste de la charge de travail (deepseek_r1_server.yaml) définit un service ClusterIP (vllm-r1-leader) et un JobSet Kubernetes (vllm-r1) qui coordonnent la diffusion multi-hôte sur les deux nœuds a4-highgpu-8g :
- Leader (
leader) : exécute une instance répliquée sur un nœud A4 avec huit GPU NVIDIA B200, source l'environnement NCCL/gIB (/usr/local/gib/scripts/set_nccl_env.sh), démarre le nœud principal Ray sur le port6379pour un cluster à deux nœuds et lancevllm servesur le port HTTP8080. Le serveur diffuse les pondérations directement depuisgs://$MODEL_BUCKET/DeepSeek-R1à l'aide de--load-format runai_streameret charge le tokeniseur à partir du volume Cloud Storage FUSE installé sur/models/DeepSeek-R1. Il s'exécute avec--tensor-parallel-size 16,--pipeline-parallel-size 1,--distributed-executor-backend ray,--enable-expert-parallel,--kv-cache-dtype fp8_e4m3,--async-schedulinget les graphiques CUDA (FULL_AND_PIECEWISE). - Nœud de calcul (
worker) : exécute une instance répliquée sans interface graphique sur le deuxième nœud A4 avec huit GPU NVIDIA B200, configure NCCL/gIB et rejoint le cluster Ray du leader à l'adressevllm-r1-leader:6379.
Déployez et surveillez le serveur vLLM multihôte :
Examinez le fichier manifeste
deepseek_r1_server.yamlou créez-le localement si vous ne l'avez pas téléchargé précédemment :Pour effectuer un scaling de ce déploiement sur davantage d'hôtes, mettez à jour les paramètres dans
deepseek_r1_server.yaml. Par exemple, pour effectuer un scaling jusqu'à quatre nœuds A4, avec un total de 32 GPU NVIDIA B200, définissezreplicas: 3sous le job répliquéworkeret mettez à jour les arguments du leader comme suit :--ray_cluster_size=4--tensor-parallel-size=16--pipeline-parallel-size=2
Remplacez
deepseek_r1_server.yamlpar le nom de votre bucket Cloud Storage et appliquez le fichier manifeste à votre cluster :Surveillez les journaux des pods leader et worker jusqu'à ce que le démarrage du serveur soit terminé :
Étant donné que
kubectl logs -fdiffuse les journaux au premier plan, exécutez la commande de journaux du nœud de calcul dans une session de terminal distincte si vous souhaitez surveiller les deux pods simultanément. Pour arrêter le streaming des journaux à tout moment, appuyez sur Ctrl+C.La diffusion initiale des pondérations, le chargement du modèle et la capture du graphe CUDA prennent environ 15 à 20 minutes. Avant d'envoyer des requêtes, attendez que les journaux du pod leader affichent les messages suivants :
(APIServer pid=1) INFO: Started server process [1] (APIServer pid=1) INFO: Waiting for application startup. (APIServer pid=1) INFO: Application startup complete.
Envoyer des requêtes d'inférence
Envoyez une requête de complétion de chat au serveur vLLM déployé :
Transférez le port local
8080vers le servicevllm-r1-leaderen arrière-plan :Envoyez une requête de complétion de chat au point de terminaison
/v1/chat/completions:
Exécuter des charges de travail de benchmark
Évaluez le serveur DeepSeek-R1 déployé à l'aide de vllm bench serve avec une configuration de 8 192 jetons d'entrée et 1 024 jetons de sortie (8k/1k) :
Examinez le fichier manifeste
deepseek_r1_8k_1k.yamlou créez-le localement si vous ne l'avez pas téléchargé précédemment :Le fichier manifeste spécifie 8 192 jetons d'entrée, 1 024 jetons de sortie, 1 280 requêtes et une simultanéité maximale de 112.
Appliquez le fichier manifeste
deepseek_r1_8k_1k.yaml:Attendez que le pod
vllm-bench-8k-1kdémarre, puis diffusez les journaux de benchmark :L'exécution du benchmark prend environ 15 minutes. Une fois l'analyse comparative terminée, recherchez un résultat contenant des métriques telles que les suivantes :
Output token throughputTotal token throughputTTFTTPOT
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 charges de travail Kubernetes, le cluster GKE et vos buckets Cloud Storage :
Supprimez les pods de benchmark, le JobSet et le service du serveur vLLM, le job de téléchargement du modèle et le secret Hugging Face :
Supprimez le bucket Cloud Storage qui stocke les pondérations du modèle préproduit :
À partir du répertoire
cluster-toolkit, détruisez le cluster GKE et l'infrastructure associée à l'aide de la commandegcluster destroy:Supprimez le bucket Cloud Storage qui stocke l'état Terraform :
Étapes suivantes
- En savoir plus sur vLLM.
- En savoir plus sur les VM A4 avec GPU NVIDIA B200
- En savoir plus sur Cluster Toolkit
- Découvrez comment gérer les clusters GKE optimisés pour l'IA.