Ce tutoriel vous explique comment diffuser un grand modèle de langage (LLM) Gemma, notre famille de modèles ouverts, utilisant des processeurs graphiques (GPU) sur Google Kubernetes Engine (GKE) avec le framework de diffusion d'interface de génération de texte (TGI) de Hugging Face. Dans ce tutoriel, vous allez télécharger la famille de modèles Gemma 2B et 7B de Hugging Face, pré-entraînés et adaptés aux instructions de paramètres, puis vous allez les déployer sur un cluster GKE Autopilot ou GKE Standard à l'aide d'un conteneur qui exécute TGI.
Ce guide est un bon point de départ si vous avez besoin du contrôle précis, de l'évolutivité, de la résilience, de la portabilité et de la rentabilité des services Kubernetes gérés lors du déploiement et de la diffusion de vos charges de travail d'IA/de ML. Si vous avez besoin d'une plate-forme d'IA gérée unifiée pour créer et diffuser rapidement des modèles de ML à moindre coût, nous vous recommandons d'essayer notre solution de déploiement Vertex AI.
Expérience
En diffusant Gemma à l'aide de GPU sur GKE avec TGI, vous pouvez mettre en œuvre une solution de diffusion d'inférences robuste et prête pour la production avec tous les avantages de Kubernetes géré, y compris une évolutivité efficace et une meilleure disponibilité. Cette section décrit les principales technologies utilisées dans ce guide.
Gemma
Gemma est un ensemble de modèles d'intelligence artificielle (IA) générative, légers et disponibles publiquement, publiés sous licence ouverte. Ces modèles d'IA sont disponibles pour s'exécuter dans vos applications, votre matériel, vos appareils mobiles ou vos services hébergés.
Dans ce guide, nous présentons les modèles suivants :
- Gemma pour la génération de texte, vous pouvez également régler ces modèles pour vous spécialiser dans l'exécution de tâches spécifiques.
- CodeGemma est un ensemble de modèles puissants et légers capables d'effectuer diverses tâches de codage, telles que la complétion de code "fill-in-the-middle", la génération de code, la compréhension du langage naturel, le raisonnement mathématique et le suivi d'instructions.
Pour en savoir plus, consultez la documentation Gemma.
GPU
Les GPU vous permettent d'accélérer des charges de travail spécifiques exécutées sur vos nœuds, telles que le machine learning et le traitement de données. GKE fournit toute une gamme d'options de types de machines pour la configuration des nœuds, y compris les types de machines avec des GPU NVIDIA H100, L4 et A100.
Avant d'utiliser des GPU dans GKE, nous vous recommandons de suivre le parcours de formation suivant :
- Découvrez la disponibilité actuelle des versions des GPU.
- Apprenez-en plus sur les GPU dans GKE.
Inférence de génération de texte (TGI)
TGI est le kit d'outils de Hugging Face pour le déploiement et la diffusion de LLM. TGI permet de générer du texte hautes performances pour les LLM Open Source courants, y compris Gemma. Les TGI incluent des fonctionnalités telles que:
- Implémentation optimisée du transformateur avec Flash Attention et PagedAttention
- Traitement par lots continu pour améliorer le débit global de diffusion
- Parallélisme Tensor pour une inférence plus rapide sur plusieurs GPU
Pour en savoir plus, consultez la documentation TGI.
Objectifs
Ce guide est destiné aux clients d'IA générative qui utilisent PyTorch, aux utilisateurs nouveaux ou existants de GKE, aux ingénieurs en ML, aux ingénieurs MLOps (DevOps) ou aux administrateurs de plate-forme qui s'intéressent à l'utilisation des fonctionnalités d'orchestration de conteneurs Kubernetes pour diffuser des LLM sur du matériel GPU H100, A100 et L4.
À la fin de ce guide, vous devriez être capable d'effectuer les étapes suivantes:
- Préparez votre environnement avec un cluster GKE en mode Autopilot.
- Déployez TGI sur votre cluster.
- Utilisez TGI pour diffuser le modèle Gemma 2B ou 7B via curl et une interface de chat Web.
Avant de commencer
- Connectez-vous à votre compte Google Cloud. Si vous débutez sur Google Cloud, créez un compte pour évaluer les performances de nos produits en conditions réelles. Les nouveaux clients bénéficient également de 300 $ de crédits gratuits pour exécuter, tester et déployer des charges de travail.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the required API.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the required API.
-
Make sure that you have the following role or roles on the project: roles/container.admin, roles/iam.serviceAccountAdmin
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 colunn 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 chaque rôle supplémentaire.
- Cliquez sur Enregistrer.
-
- Créez un compte Hugging Face si vous n'en possédez pas.
- Assurez-vous que votre projet dispose d'un quota suffisant pour les GPU. Pour en savoir plus, consultez les pages À propos des GPU et Quotas d'allocation.
Accéder au modèle
Pour accéder aux modèles Gemma en vue du déploiement sur GKE, vous devez d'abord signer le contrat d'autorisation de licence, puis générer un jeton d'accès Hugging Face.
Signer le contrat de consentement de la licence
Vous devez signer le contrat de consentement pour utiliser Gemma. Procédez comme suit :
- Accédez à la page de consentement du modèle sur Kaggle.com.
- Vérifiez l'autorisation à l'aide de votre compte Hugging Face.
- Acceptez les conditions du modèle.
Générer un jeton d'accès
Pour accéder au modèle via Hugging Face, vous avez besoin d'un jeton Hugging Face.
Pour générer un nouveau jeton si vous n'en possédez pas, procédez comme suit:
- Cliquez sur Your Profile > Settings > Access Tokens (Votre profil > Paramètres > Jetons d'accès).
- Sélectionnez New Token (Nouveau jeton).
- Spécifiez le nom de votre choix et un rôle d'au moins
Read
. - Sélectionnez Générer un jeton.
- Copiez le jeton dans votre presse-papiers.
Préparer votre environnement
Dans ce tutoriel, vous utilisez Cloud Shell pour gérer les ressources hébergées sur Google Cloud. Cloud Shell est préinstallé avec les logiciels dont vous avez besoin pour ce tutoriel, y compris kubectl
et gcloud CLI.
Pour configurer votre environnement avec Cloud Shell, procédez comme suit :
Dans la console Google Cloud, lancez une session Cloud Shell en cliquant sur Activer Cloud Shell dans la console Google Cloud. Une session s'ouvre dans le volet inférieur de la console Google Cloud.
Définissez les variables d'environnement par défaut :
gcloud config set project PROJECT_ID export PROJECT_ID=$(gcloud config get project) export REGION=REGION export CLUSTER_NAME=tgi export HF_TOKEN=HF_TOKEN
Remplacez les valeurs suivantes :
- PROJECT_ID : L'ID de votre projet Google Cloud.
- REGION: région compatible avec le type d'accélérateur que vous souhaitez utiliser, par exemple
us-central1
pour les GPU L4. - HF_TOKEN: jeton Hugging Face que vous avez généré précédemment.
Créer et configurer des ressources Google Cloud
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 les modèles Gemma sur des GPU dans un cluster GKE Autopilot ou GKE Standard. Nous vous recommandons d'utiliser un cluster GKE Autopilot pour une expérience Kubernetes entièrement gérée. Pour choisir le mode de fonctionnement GKE le mieux adapté à vos charges de travail, consultez la section Choisir un mode de fonctionnement GKE.
Autopilot
Dans Cloud Shell, exécutez la commande suivante :
gcloud container clusters create-auto ${CLUSTER_NAME} \
--project=${PROJECT_ID} \
--region=${REGION} \
--release-channel=rapid \
--cluster-version=1.28
GKE crée un cluster Autopilot avec des nœuds de processeur et de GPU, à la demande des charges de travail déployées.
Standard
Dans Cloud Shell, exécutez la commande suivante pour créer un cluster GKE Standard :
gcloud container clusters create ${CLUSTER_NAME} \ --project=${PROJECT_ID} \ --region=${REGION} \ --workload-pool=${PROJECT_ID}.svc.id.goog \ --release-channel=rapid \ --num-nodes=1
La création du cluster peut prendre plusieurs minutes.
Exécutez la commande suivante pour créer un pool de nœuds pour votre cluster :
gcloud container node-pools create gpupool \ --accelerator type=nvidia-l4,count=2,gpu-driver-version=latest \ --project=${PROJECT_ID} \ --location=${REGION} \ --node-locations=${REGION}-a \ --cluster=${CLUSTER_NAME} \ --machine-type=g2-standard-24 \ --num-nodes=1
GKE crée un pool de nœuds unique contenant deux GPU L4 pour chaque nœud.
Créer un secret Kubernetes pour les identifiants Hugging Face
Dans Cloud Shell, procédez comme suit :
Configurez
kubectl
de manière à communiquer avec votre cluster :gcloud container clusters get-credentials ${CLUSTER_NAME} --location=${REGION}
Créez un secret Kubernetes contenant le jeton Hugging Face:
kubectl create secret generic hf-secret \ --from-literal=hf_api_token=${HF_TOKEN} \ --dry-run=client -o yaml | kubectl apply -f -
Déployer TGI
Dans cette section, vous allez déployer le conteneur TGI pour diffuser le modèle Gemma que vous souhaitez utiliser. Pour en savoir plus sur les modèles pré-entraînés et adaptés aux instructions et sur celui à sélectionner pour votre cas d'utilisation, consultez la page Modèles réglés.
Déployer un modèle Gemma adapté aux instructions
Suivez ces instructions si vous souhaitez déployer un modèle ou une variante Gemma adapté aux instructions.
Gemma 2B-it
Suivez ces instructions pour déployer le modèle adapté aux instructions Gemma 2B.
Créez le fichier manifeste
tgi-2b-it.yaml
suivant :Appliquez le fichier manifeste :
kubectl apply -f tgi-2b-it.yaml
Gemma 7B-it
Suivez ces instructions pour déployer le modèle adapté aux instructions Gemma 7B.
Créez le fichier manifeste
tgi-7b-it.yaml
suivant :Appliquez le fichier manifeste :
kubectl apply -f tgi-7b-it.yaml
CodeGemma 7B-it
Suivez ces instructions pour déployer le modèle adapté aux instructions CodeGemma 7B.
Créez le fichier manifeste
tgi-codegemma-1.1-7b-it.yaml
suivant :Appliquez le fichier manifeste :
kubectl apply -f tgi-codegemma-1.1-7b-it.yaml
Déployer un modèle Gemma pré-entraîné
Suivez ces instructions si vous souhaitez déployer un modèle ou une variante Gemma pré-entraîné.
Gemma 2B
Suivez ces instructions pour déployer le modèle pré-entraîné Gemma 2B.
Créez le fichier manifeste
tgi-2b.yaml
suivant :Appliquez le fichier manifeste :
kubectl apply -f tgi-2b.yaml
Gemma 7B
Suivez ces instructions pour déployer le modèle pré-entraîné Gemma 2B.
Créez le fichier manifeste
tgi-7b.yaml
suivant :Appliquez le fichier manifeste :
kubectl apply -f tgi-7b.yaml
CodeGemma 2B
Suivez ces instructions pour déployer le modèle pré-entraîné CodeGemma 2B.
Créez le fichier manifeste
tgi-codegemma-1.1-2b.yaml
suivant :Appliquez le fichier manifeste :
kubectl apply -f tgi-codegemma-1.1-2b.yaml
Un pod du cluster télécharge les pondérations du modèle à partir de Hugging Face et lance le moteur de diffusion.
Attendez que le déploiement soit disponible :
kubectl wait --for=condition=Available --timeout=700s deployment/tgi-gemma-deployment
Affichez les journaux du déploiement en cours d'exécution :
kubectl logs -f -l app=gemma-server
La ressource Déploiement télécharge les données du modèle. Ce processus peut prendre quelques minutes. Le résultat ressemble à ce qui suit :
2024-05-08T20:27:37.557836Z INFO text_generation_router: router/src/main.rs:317: Warming up model
2024-05-08T20:27:39.206371Z INFO text_generation_launcher: Cuda Graphs are enabled for sizes [1, 2, 4, 8, 16, 32]
2024-05-08T20:27:40.461998Z INFO text_generation_router: router/src/main.rs:354: Setting max batch total tokens to 632992
2024-05-08T20:27:40.462018Z INFO text_generation_router: router/src/main.rs:355: Connected
2024-05-08T20:27:40.462025Z WARN text_generation_router: router/src/main.rs:369: Invalid hostname, defaulting to 0.0.0.0
Assurez-vous que le modèle est entièrement téléchargé avant de passer à la section suivante.
Diffuser le modèle
Dans cette section, vous allez interagir avec le modèle.
Configurer le transfert de port
Exécutez la commande suivante pour configurer le transfert de port sur le modèle:
kubectl port-forward service/llm-service 8000:8000
Le résultat ressemble à ce qui suit :
Forwarding from 127.0.0.1:8000 -> 8000
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 pré-entraînés ou adaptés aux instructions déployés. Pour des raisons de simplicité, cette section décrit l'approche de test à l'aide des modèles pré-entraînés Gemma 2B, adaptés aux instructions Gemma 2B et adaptés aux instructions CodeGemma 7B.
Gemma 2B
Dans une nouvelle session de terminal, utilisez curl
pour discuter avec votre modèle :
USER_PROMPT="Java is a"
curl -X POST http://localhost:8000/generate \
-H "Content-Type: application/json" \
-d @- <<EOF
{
"inputs": "${USER_PROMPT}",
"parameters": {
"temperature": 0.90,
"top_p": 0.95,
"max_new_tokens": 128
}
}
EOF
Le résultat suivant affiche un exemple de réponse du modèle :
{"generated_text":" general-purpose, high-level, class-based, object-oriented programming language. <strong>Is Java a statically typed language?</strong> Yes, Java is a statically typed language. Java also supports dynamic typing. Static typing means that the type of every variable is explicitly specified at the time of declaration. The type can be either implicit or explicit. Static typing means that if no types are assigned then it will be assumed as a primitive type.\n\n<h3>What is Java?</h3>\n\nJava is a general-purpose, class-based, object-oriented programming language. Java is one of the oldest programming languages that has gained a"}
Gemma 2B-it
Dans une nouvelle session de terminal, utilisez curl
pour discuter avec votre modèle :
USER_PROMPT="I'm new to coding. If you could only recommend one programming language to start with, what would it be and why?"
curl -X POST http://localhost:8000/generate \
-H "Content-Type: application/json" \
-d @- <<EOF
{
"inputs": "<start_of_turn>user\n${USER_PROMPT}<end_of_turn>\n",
"parameters": {
"temperature": 0.90,
"top_p": 0.95,
"max_new_tokens": 128
}
}
EOF
Le résultat suivant affiche un exemple de réponse du modèle :
{"generated_text":"**Python**\n\n**Reasons why Python is a great choice for beginners:**\n\n* **Simple syntax:** Python uses clear and concise syntax, making it easy for beginners to pick up.\n* **Easy to learn:** Python's syntax is based on English, making it easier to learn than other languages.\n* **Large and supportive community:** Python has a massive and active community of developers who are constantly willing to help.\n* **Numerous libraries and tools:** Python comes with a vast collection of libraries and tools that make it easy to perform various tasks, such as data manipulation, web development, and machine learning.\n* **"}
CodeGemma
Dans une nouvelle session de terminal, utilisez curl
pour discuter avec votre modèle :
USER_PROMPT="Generate a python code example of a adding two numbers from a function called addNumbers"
curl -s -X POST http://localhost:8000/generate \
-H "Content-Type: application/json" \
-d @- <<EOF | jq -r .generated_text
{
"inputs": "<start_of_turn>user\n${USER_PROMPT}<end_of_turn>\n",
"parameters": {
"temperature": 0.90,
"top_p": 0.95,
"max_new_tokens": 2000
}
}
EOF
Le résultat suivant affiche un exemple de réponse du modèle :
def addNumbers(num1, num2):
sum = num1 + num2
return sum
# Get the input from the user
num1 = float(input("Enter the first number: "))
num2 = float(input("Enter the second number: "))
# Call the addNumbers function
sum = addNumbers(num1, num2)
# Print the result
print("The sum of", num1, "and", num2, "is", sum)
(Facultatif) Interagir avec le modèle via une interface de chat Gradio
Dans cette section, vous allez créer une application de chat Web qui vous permet d'interagir avec votre modèle adapté aux instructions. Par souci de simplicité, cette section ne décrit que l'approche de test utilisant le modèle 2B-it.
Gradio est une bibliothèque Python dotée d'un wrapper ChatInterface
qui crée des interfaces utilisateur pour les chatbots.
Déployer l'interface de chat
Dans Cloud Shell, enregistrez le fichier manifeste suivant sous le nom
gradio.yaml
:Appliquez le fichier manifeste :
kubectl apply -f gradio.yaml
Attendez que le déploiement soit disponible :
kubectl wait --for=condition=Available --timeout=300s deployment/gradio
Utiliser l'interface de chat
Dans Cloud Shell, exécutez la commande suivante :
kubectl port-forward service/gradio 8080:8080
Cela crée un transfert de port de Cloud Shell vers le service Gradio.
Cliquez sur le bouton Aperçu sur le Web qui se trouve en haut à droite de la barre des tâches Cloud Shell. Cliquez sur Preview on Port 8080 (Aperçu sur le port 8080). Un nouvel onglet s'ouvre dans le navigateur.
Interagissez avec Gemma via l'interface de chat Gradio. Ajoutez une requête et cliquez sur Envoyer.
Résoudre les problèmes
- Si le message
Empty reply from server
s'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 messageConnected
indiquant que le modèle est prêt à être diffusé. - Si
Connection refused
s'affiche, vérifiez que le transfert de port est actif.
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 Google Cloud, exécutez la commande suivante:
gcloud container clusters delete ${CLUSTER_NAME} \
--region=${REGION}
Étapes suivantes
- Apprenez-en plus sur les GPU dans GKE.
- Découvrez comment utiliser Gemma avec TGI sur d'autres accélérateurs, y compris les GPU A100 et H100, en affichant l'exemple de code dans GitHub.
- Découvrez comment déployer des charges de travail GPU dans Autopilot.
- Découvrez comment déployer des charges de travail GPU dans GKE Standard.
- Consultez la documentation TGI.
- 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.