Ce tutoriel explique comment déployer et diffuser un grand modèle de langage (LLM) à l'aide d'un pool de nœuds de tranche TPU multi-hôte sur Google Kubernetes Engine (GKE) avec Saxml pour une architecture évolutive efficace.
Expérience
Saxml est un système expérimental qui diffuse les frameworks Paxml, JAX et PyTorch. Vous pouvez utiliser les TPU pour accélérer le traitement des données avec ces frameworks. Pour illustrer le déploiement de TPU dans GKE, ce tutoriel diffuse le modèle de test LmCloudSpmd175B32Test 175B. GKE déploie ce modèle de test sur deux pools de nœuds de tranche de TPU v5e avec la topologie 4x8, respectivement.
Pour déployer correctement le modèle de test, la topologie TPU a été définie en fonction de la taille du modèle. Étant donné que le modèle de N milliard 16 bits nécessite environ deux fois (2xN) Go de mémoire, le modèle LmCloudSpmd175B32Test 175B nécessite environ 350 Go de mémoire. La puce TPU v5e dispose de 16 Go de mémoire. Pour prendre en charge 350 Go, GKE a besoin de 21 puces TPU v5e (350/16 = 21). En fonction du mappage de la configuration TPU, la configuration TPU appropriée pour ce tutoriel est la suivante:
- Type de machine :
ct5lp-hightpu-4t - Topologie:
4x8(32 nombre de puces TPU)
Il est important de sélectionner la topologie TPU appropriée pour diffuser un modèle lors du déploiement de TPU dans GKE. Pour en savoir plus, consultez la section Planifier la configuration de TPU.
Objectifs
Ce tutoriel est destiné aux ingénieurs MLOps ou DevOps ou aux administrateurs de plate-forme qui souhaitent utiliser les fonctionnalités d'orchestration GKE pour diffuser des modèles de données.
Ce tutoriel couvre les étapes suivantes :
- Préparez votre environnement avec un cluster Standard. Le cluster comporte deux pools de nœuds de tranche de TPU v5e avec la topologie
4x8. - Déployer Saxml. Saxml nécessite un serveur d'administration, un groupe de pods qui fonctionnent en tant que serveur de modèles, un serveur HTTP prédéfini et un équilibreur de charge.
- Utilisez le fichier Saxml pour diffuser le LLM.
Le schéma suivant illustre l'architecture mise en œuvre dans le tutoriel suivant:
Avant de commencer
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud 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 Google Cloud 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. -
In the Google Cloud console, on the project selector page, select or create a Google Cloud 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 Google Cloud 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. -
Make sure that you have the following role or roles on the project: roles/container.admin, roles/iam.serviceAccountAdmin, roles/iam.policyAdmin
Check for the roles
-
In the Google Cloud console, go to the IAM page.
Go to IAM - Select the project.
-
In the Principal column, find all rows that identify you or a group that you're included in. To learn which groups you're included in, contact your administrator.
- For all rows that specify or include you, check the Role column to see whether the list of roles includes the required roles.
Grant the roles
-
In the Google Cloud console, go to the IAM page.
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'adresse e-mail d'un compte Google.
- Dans la liste Sélectionner un rôle, sélectionnez un 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 Cloud TPU dans GKE.
Dans la console Google Cloud , démarrez une instance Cloud Shell :
Ouvrir Cloud ShellDéfinissez les variables d'environnement par défaut :
gcloud config set project PROJECT_ID export PROJECT_ID=$(gcloud config get project) export CONTROL_PLANE_LOCATION=CONTROL_PLANE_LOCATION export BUCKET_NAME=PROJECT_ID-gke-bucketRemplacez les valeurs suivantes :
- PROJECT_ID : ID de votre projet Google Cloud .
- CONTROL_PLANE_LOCATION : zone Compute Engine du plan de contrôle de votre cluster. Sélectionnez la zone dans laquelle le
ct5lp-hightpu-4test disponible.
Dans cette commande,
BUCKET_NAMEspécifie le nom du bucket de stockage Google Cloudpour stocker les configurations du serveur d'administration Saxml.Créez un cluster Standard qui utilise la fédération d'identité de charge de travail pour GKE :
gcloud container clusters create saxml \ --location=${CONTROL_PLANE_LOCATION} \ --workload-pool=${PROJECT_ID}.svc.id.goog \ --cluster-version=VERSION \ --num-nodes=4Remplacez
VERSIONpar le numéro de version de GKE. GKE est compatible avec les TPU v5e version 1.27.2-gke.2100 et ultérieures. Pour en savoir plus, consultez la section Disponibilité des TPU dans GKE.La création du cluster peut prendre plusieurs minutes.
Créez le premier pool de nœuds nommé
tpu1:gcloud container node-pools create tpu1 \ --location=${CONTROL_PLANE_LOCATION} \ --machine-type=ct5lp-hightpu-4t \ --tpu-topology=4x8 \ --num-nodes=8 \ --cluster=saxmlLa valeur du flag
--num-nodesest calculée en divisant la topologie TPU par le nombre de puces TPU par tranche TPU. Dans ce cas : (4 * 8) / 4.Créez le deuxième pool de nœuds nommé
tpu2:gcloud container node-pools create tpu2 \ --location=${CONTROL_PLANE_LOCATION} \ --machine-type=ct5lp-hightpu-4t \ --tpu-topology=4x8 \ --num-nodes=8 \ --cluster=saxmlLa valeur de l'indicateur
--num-nodesest calculée en divisant la topologie TPU par le nombre de puces TPU par tranche TPU. Dans ce cas : (4 * 8) / 4.- Cluster standard avec quatre nœuds de processeur.
- Deux pools de nœuds de tranche de TPU v5e avec la topologie
4x8. Chaque pool de nœuds représente huit nœuds de tranche de TPU avec quatre puces TPU chacun. Configurez
kubectlde manière à communiquer avec votre cluster :gcloud container clusters get-credentials saxml --location=${CONTROL_PLANE_LOCATION}Créez un compte de service Kubernetes que votre application pourra utiliser :
kubectl create serviceaccount sax-sa --namespace defaultCréez un compte de service IAM pour votre application :
gcloud iam service-accounts create sax-iam-saAjoutez une liaison de stratégie IAM pour votre compte de service IAM, pour pouvoir lire et écrire dans Cloud Storage :
gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member "serviceAccount:sax-iam-sa@${PROJECT_ID}.iam.gserviceaccount.com" \ --role roles/storage.adminAutorisez le compte de service Kubernetes à emprunter l'identité du compte de service IAM en ajoutant une liaison de stratégie IAM entre les deux comptes de service. Cette liaison permet au compte de service Kubernetes d'agir en tant que compte de service IAM, afin que le compte de service Kubernetes puisse lire et écrire dans Cloud Storage.
gcloud iam service-accounts add-iam-policy-binding sax-iam-sa@${PROJECT_ID}.iam.gserviceaccount.com \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:${PROJECT_ID}.svc.id.goog[default/sax-sa]"Annotez le compte de service Kubernetes avec l'adresse e-mail du compte de service IAM. Cela permet à votre exemple d'application d'identifier le compte de service à utiliser pour accéder aux services Google Cloud . Ainsi, lorsque l'application utilise des bibliothèques clientes d'API Google standards pour accéder aux services Google Cloud , elle utilise ce compte de service IAM.
kubectl annotate serviceaccount sax-sa \ iam.gke.io/gcp-service-account=sax-iam-sa@${PROJECT_ID}.iam.gserviceaccount.comCréez le fichier manifeste
sax-admin-server.yamlsuivant :Remplacez
BUCKET_NAMEpar le bucket Cloud Storage que vous avez créé précédemment :perl -pi -e 's|BUCKET_NAME|BUCKET_NAME|g' sax-admin-server.yamlAppliquez le fichier manifeste :
kubectl apply -f sax-admin-server.yamlVérifiez que le pod du serveur d'administration est opérationnel:
kubectl get deploymentLe résultat ressemble à ce qui suit :
NAME READY UP-TO-DATE AVAILABLE AGE sax-admin-server 1/1 1 1 52sInstallez JobSet v0.2.3 ou version ultérieure.
kubectl apply --server-side -f https://github.com/kubernetes-sigs/jobset/releases/download/JOBSET_VERSION/manifests.yamlRemplacez
JOBSET_VERSIONpar la version de JobSet. Par exemple,v0.2.3.Vérifiez que le contrôleur JobSet s'exécute dans l'espace de noms
jobset-system:kubectl get pod -n jobset-systemLe résultat ressemble à ce qui suit :
NAME READY STATUS RESTARTS AGE jobset-controller-manager-69449d86bc-hp5r6 2/2 Running 0 2m15sDéployez deux serveurs de modèles dans deux pools de nœuds de tranche de TPU. Enregistrez le fichier manifeste
sax-model-server-setsuivant :Remplacez
BUCKET_NAMEpar le nom du bucket Cloud Storage que vous avez créé précédemment :perl -pi -e 's|BUCKET_NAME|BUCKET_NAME|g' sax-model-server-set.yamlDans le fichier manifeste :
replicas: 2est le nombre d'instances dupliquées de tâches. Chaque tâche représente un serveur de modèles. Par conséquent, un groupe de 8 pods.parallelism: 8etcompletions: 8sont égaux au nombre de nœuds de chaque pool de nœuds.backoffLimit: 0doit être égal à zéro pour marquer la tâche comme ayant échoué en cas de défaillance d'un pod.ports.containerPort: 8471est le port par défaut pour la communication des VM.name: MEGASCALE_NUM_SLICESannule la définition de la variable d'environnement, car GKE n'exécute pas d'entraînement Multislice.
Appliquez le fichier manifeste :
kubectl apply -f sax-model-server-set.yamlVérifiez l'état des pods du serveur d'administration Saxml et du serveur de modèles:
kubectl get podsLe résultat ressemble à ce qui suit :
NAME READY STATUS RESTARTS AGE sax-admin-server-557c85f488-lnd5d 1/1 Running 0 35h sax-model-server-set-sax-model-server-0-0-nj4sm 1/1 Running 0 24m sax-model-server-set-sax-model-server-0-1-sl8w4 1/1 Running 0 24m sax-model-server-set-sax-model-server-0-2-hb4rk 1/1 Running 0 24m sax-model-server-set-sax-model-server-0-3-qv67g 1/1 Running 0 24m sax-model-server-set-sax-model-server-0-4-pzqz6 1/1 Running 0 24m sax-model-server-set-sax-model-server-0-5-nm7mz 1/1 Running 0 24m sax-model-server-set-sax-model-server-0-6-7br2x 1/1 Running 0 24m sax-model-server-set-sax-model-server-0-7-4pw6z 1/1 Running 0 24m sax-model-server-set-sax-model-server-1-0-8mlf5 1/1 Running 0 24m sax-model-server-set-sax-model-server-1-1-h6z6w 1/1 Running 0 24m sax-model-server-set-sax-model-server-1-2-jggtv 1/1 Running 0 24m sax-model-server-set-sax-model-server-1-3-9v8kj 1/1 Running 0 24m sax-model-server-set-sax-model-server-1-4-6vlb2 1/1 Running 0 24m sax-model-server-set-sax-model-server-1-5-h689p 1/1 Running 0 24m sax-model-server-set-sax-model-server-1-6-bgv5k 1/1 Running 0 24m sax-model-server-set-sax-model-server-1-7-cd6gv 1/1 Running 0 24mUtilisez l'image du serveur HTTP d'images prédéfinies suivante. Enregistrez le fichier manifeste
sax-http.yamlsuivant :Remplacez
BUCKET_NAMEpar le bucket Cloud Storage que vous avez créé précédemment :perl -pi -e 's|BUCKET_NAME|BUCKET_NAME|g' sax-http.yamlAppliquez le fichier manifeste
sax-http.yaml:kubectl apply -f sax-http.yamlAttendez la fin de la création du conteneur de serveur HTTP:
kubectl get podsLe résultat ressemble à ce qui suit :
NAME READY STATUS RESTARTS AGE sax-admin-server-557c85f488-lnd5d 1/1 Running 0 35h sax-http-65d478d987-6q7zd 1/1 Running 0 24m sax-model-server-set-sax-model-server-0-0-nj4sm 1/1 Running 0 24m ...Attendez qu'une adresse IP externe soit attribuée au service:
kubectl get svcLe résultat ressemble à ce qui suit :
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE sax-http-lb LoadBalancer 10.48.11.80 10.182.0.87 8888:32674/TCP 7m36sRécupérez l'adresse IP de l'équilibreur de charge pour Saxml.
LB_IP=$(kubectl get svc sax-http-lb -o jsonpath='{.status.loadBalancer.ingress[*].ip}') PORT="8888"Chargez le modèle de test
LmCloudSpmd175Bdans deux pools de nœuds de tranche de TPU v5e :curl --request POST \ --header "Content-type: application/json" \ -s ${LB_IP}:${PORT}/publish --data \ '{ "model": "/sax/test/spmd", "model_path": "saxml.server.pax.lm.params.lm_cloud.LmCloudSpmd175B32Test", "checkpoint": "None", "replicas": 2 }'Le modèle de test n'a pas de point de contrôle affiné. Les pondérations sont générées de manière aléatoire. Le chargement du modèle peut prendre jusqu'à 10 minutes.
Le résultat ressemble à ce qui suit :
{ "model": "/sax/test/spmd", "path": "saxml.server.pax.lm.params.lm_cloud.LmCloudSpmd175B32Test", "checkpoint": "None", "replicas": 2 }Vérifiez que le modèle est prêt:
kubectl logs sax-model-server-set-sax-model-server-0-0-nj4smLe résultat ressemble à ce qui suit :
... loading completed. Successfully loaded model for key: /sax/test/spmdLe modèle est entièrement chargé.
Obtenez des informations sur le modèle:
curl --request GET \ --header "Content-type: application/json" \ -s ${LB_IP}:${PORT}/listcell --data \ '{ "model": "/sax/test/spmd" }'Le résultat ressemble à ce qui suit :
{ "model": "/sax/test/spmd", "model_path": "saxml.server.pax.lm.params.lm_cloud.LmCloudSpmd175B32Test", "checkpoint": "None", "max_replicas": 2, "active_replicas": 2 }Supprimez le cluster que vous avez créé pour ce tutoriel:
gcloud container clusters delete saxml --location ${CONTROL_PLANE_LOCATION}Supprimez le compte de service :
gcloud iam service-accounts delete sax-iam-sa@${PROJECT_ID}.iam.gserviceaccount.comSupprimez le bucket Cloud Storage :
gcloud storage rm -r gs://${BUCKET_NAME}- Découvrez les versions actuelles de TPU avec l'architecture système de Cloud TPU.
- Apprenez-en plus sur les TPU dans GKE.
Préparer l'environnement
Créer un cluster
Utilisez Cloud Shell pour effectuer les opérations suivantes :
Vous avez créé les ressources suivantes:
Le modèle 175B doit être diffusé sur une tranche de TPU v5e à plusieurs hôtes avec une tranche de topologie
4x8(32 puces TPU v5e) au minimum.Créer un bucket Cloud Storage
Créez un bucket Cloud Storage pour stocker les configurations du serveur d'administration Saxml. Un serveur d'administration en cours d'exécution enregistre régulièrement son état et les détails des modèles publiés.
Dans Cloud Shell, exécutez la commande ci-dessous.
gcloud storage buckets create gs://${BUCKET_NAME}Configurer l'accès à vos charges de travail à l'aide de la fédération d'identité de charge de travail pour GKE
Attribuez un compte de service Kubernetes à l'application et configurez ce compte de service Kubernetes pour qu'il agisse en tant que compte de service IAM.
Déployer Saxml
Dans cette section, vous allez déployer le serveur d'administration Saxml et le serveur de modèles Saxml.
Déployer le serveur d'administration Saxml
Déployer un serveur de modèles Saxml
Les charges de travail exécutées dans des tranches de TPU multi-hôte nécessitent un identifiant réseau stable pour que chaque pod puisse découvrir les pairs dans la même tranche de TPU. Pour définir ces identifiants, utilisez IndexedJob, StatefulSet avec un service sans adresse IP ou JobSet qui crée automatiquement un service sans adresse IP pour tous les jobs appartenant à JobSet. Un JobSet est une API de charge de travail qui vous permet de gérer un groupe de tâches Kubernetes en tant qu'unité. Le cas d'utilisation le plus courant pour un JobSet est l'entraînement distribué, mais vous pouvez également l'utiliser pour exécuter des charges de travail par lot.
La section suivante explique comment gérer plusieurs groupes de pods de serveur de modèles avec JobSet.
Dans cet exemple, il existe 16 conteneurs de serveurs de modèles :
sax-model-server-set-sax-model-server-0-0-nj4smetsax-model-server-set-sax-model-server-1-0-8mlf5sont les deux serveurs de modèles principaux dans chaque groupe.Votre cluster Saxml possède deux serveurs de modèles déployés sur deux pools de nœuds de tranche de TPU v5e avec la topologie
4x8, respectivement.Déployer Saxml HTTP Server et l'équilibreur de charge
Utiliser Saxml
Chargez, déployez et diffusez le modèle sur Saxml dans la tranche multi-hôte TPU v5e:
Charger le modèle
Diffuser le modèle
Diffuser une requête:
curl --request POST \ --header "Content-type: application/json" \ -s ${LB_IP}:${PORT}/generate --data \ '{ "model": "/sax/test/spmd", "query": "How many days are in a week?" }'Le résultat affiche un exemple de réponse du modèle. Cette réponse peut ne pas avoir de sens, car le modèle de test a des pondérations aléatoires.
Annuler la publication du modèle
Exécutez la commande suivante pour annuler la publication du modèle:
curl --request POST \ --header "Content-type: application/json" \ -s ${LB_IP}:${PORT}/unpublish --data \ '{ "model": "/sax/test/spmd" }'Le résultat ressemble à ce qui suit :
{ "model": "/sax/test/spmd" }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
Étapes suivantes
-