Dans ce tutoriel, vous allez apprendre à déployer Gemma 2 de Google, un grand modèle de langage (LLM) ouvert, sur un service Cloud Run compatible avec les GPU (pour une inférence rapide).
Vous utiliserez Ollama, un serveur d'inférence LLM pour les modèles ouverts. Une fois le tutoriel terminé, n'hésitez pas à explorer d'autres modèles ouverts compatibles avec Ollama, y compris Llama 3.1 (8B), Mistral (7B) et Qwen2 (7B).
Objectifs
Coûts
Dans ce document, vous utilisez les composants facturables suivants de Google Cloud :
Obtenez une estimation des coûts en fonction de votre utilisation prévue à l'aide du simulateur de coût.
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.
-
Make sure that billing is enabled for your Google Cloud project.
-
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 Artifact Registry, Cloud Build, Cloud Run, and Cloud Storage APIs.
- Installez et initialisez gcloud CLI.
- Demandez un quota
Total Nvidia L4 GPU allocation, per project per region
sous l'API Cloud Run Admin sur la page Quotas et limites système pour suivre ce tutoriel.
Rôles requis
Pour obtenir les autorisations nécessaires pour suivre le tutoriel, demandez à votre administrateur de vous accorder les rôles IAM suivants sur votre projet :
-
Administrateur Artifact Registry (
roles/artifactregistry.admin
) -
Éditeur Cloud Build (
roles/cloudbuild.builds.editor
) -
Administrateur Cloud Run (
roles/run.admin
) -
Créateur de comptes de service (
roles/iam.serviceAccountCreator
) -
Administrateur de projet IAM (
roles/resourcemanager.projectIamAdmin
) -
Utilisateur du compte de service (
roles/iam.serviceAccountUser
) -
Consommateur Service Usage (
roles/serviceusage.serviceUsageConsumer
) -
Administrateur de l'espace de stockage (
roles/storage.admin
)
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 via des rôles personnalisés ou d'autres rôles prédéfinis.
Configurer gcloud
Pour configurer la Google Cloud CLI pour votre service Cloud Run:
Définissez le projet par défaut :
gcloud config set project PROJECT_ID
Cliquez sur l'icône pour remplacer la variable PROJECT_ID par le nom du projet que vous avez créé pour ce tutoriel. Cela garantit que toutes les fiches de cette page qui font référence à PROJECT_ID ont déjà la valeur correcte renseignée.
Configurez Google Cloud CLI pour qu'il utilise la région
us-central1
pour les commandes Cloud Run.gcloud config set run/region us-central1
Créer un dépôt Docker Artifact Registry
Créez un dépôt Docker pour stocker les images de conteneur de ce tutoriel:
gcloud artifacts repositories create REPOSITORY \
--repository-format=docker \
--location=us-central1
Remplacez REPOSITORY par le nom du dépôt. Exemple :repo
Utiliser Docker pour créer une image de conteneur avec Ollama et Gemma
Créez un répertoire pour le service Ollama et définissez votre répertoire de travail sur ce nouveau répertoire:
mkdir ollama-backend cd ollama-backend
Créez un fichier
Dockerfile
.
Stocker les poids du modèle dans l'image du conteneur pour accélérer le démarrage des instances
Google recommande de stocker les poids du modèle pour Gemma 2 (9B) et les modèles de taille similaire directement dans l'image du conteneur.
Les pondérations du modèle sont les paramètres numériques qui définissent le comportement d'un LLM. Ollama doit lire entièrement ces fichiers et charger les poids dans la mémoire du GPU (VRAM) au démarrage de l'instance de conteneur avant de pouvoir commencer à traiter les requêtes d'inférence.
Sur Cloud Run, un démarrage rapide des instances de conteneur est important pour réduire la latence des requêtes. Si le délai de démarrage de votre instance de conteneur est lent, le service met plus de temps à passer de zéro à une instance et à évoluer horizontalement lors d'un pic de trafic.
Pour assurer un démarrage rapide, stockez les fichiers de modèle dans l'image du conteneur elle-même. Cette méthode est plus rapide et plus fiable que de télécharger les fichiers à partir d'un emplacement distant au démarrage. Le stockage interne des images de conteneur de Cloud Run est optimisé pour gérer les pics de trafic, ce qui lui permet de configurer rapidement le système de fichiers du conteneur au démarrage d'une instance.
Notez que les poids du modèle pour Gemma 2 (9 b) occupent 5,4 Go d'espace de stockage. Les modèles plus volumineux ont des fichiers de poids de modèle plus volumineux, qui peuvent être difficiles à stocker dans l'image du conteneur. Consultez les bonnes pratiques: inférence de l'IA sur Cloud Run avec des GPU pour obtenir un aperçu des compromis.
Générez l'image de conteneur à l'aide de Cloud Build :
Pour créer l'image de conteneur avec Cloud Build et la transférer vers le dépôt Artifact Registry:
gcloud builds submit \
--tag us-central1-docker.pkg.dev/PROJECT_ID/REPOSITORY/ollama-gemma \
--machine-type e2-highcpu-32
Veuillez noter les points suivants :
- Pour une compilation plus rapide, cette commande sélectionne un type de machine puissant avec plus de CPU et de bande passante réseau.
- La compilation devrait prendre environ sept minutes.
- Vous pouvez également créer l'image en local avec Docker et la transmettre à Artifact Registry. Cela peut être plus lent que l'exécution sur Cloud Build, en fonction de votre bande passante réseau.
Déployer Ollama en tant que service Cloud Run
Maintenant que l'image du conteneur est stockée dans un dépôt Artifact Registry, vous pouvez déployer Ollama en tant que service Cloud Run.
Créer un compte de service dédié
Créez un compte de service dédié que le service Ollama utilise comme identité de service:
gcloud iam service-accounts create OLLAMA_IDENTITY \
--display-name="Service Account for Ollama Cloud Run service"
Remplacez OLLAMA_IDENTITY par le nom du compte de service que vous souhaitez créer, par exemple ollama
.
Il est recommandé de créer un compte de service dédié pour chaque service Cloud Run avec l'ensemble minimal d'autorisations requises. Le service Ollama n'a pas besoin d'appeler d'API Google Cloud , ce qui signifie qu'il n'est pas nécessaire d'accorder des autorisations à son compte de service.
Déployer le service
Déployez le service dans Cloud Run:
gcloud beta run deploy ollama-gemma \
--image us-central1-docker.pkg.dev/PROJECT_ID/REPOSITORY/ollama-gemma \
--concurrency 4 \
--cpu 8 \
--set-env-vars OLLAMA_NUM_PARALLEL=4 \
--gpu 1 \
--gpu-type nvidia-l4 \
--max-instances 7 \
--memory 32Gi \
--no-allow-unauthenticated \
--no-cpu-throttling \
--service-account OLLAMA_IDENTITY@PROJECT_ID.iam.gserviceaccount.com \
--timeout=600
Notez les indicateurs importants suivants dans cette commande:
--concurrency 4
est défini pour correspondre à la valeur de la variable d'environnementOLLAMA_NUM_PARALLEL
.--gpu 1
avec--gpu-type nvidia-l4
attribue un GPU NVIDIA L4 à chaque instance Cloud Run du service.--no-allow-authenticated
limite l'accès non authentifié au service. En gardant le service privé, vous pouvez vous appuyer sur l'authentification Identity and Access Management (IAM) intégrée de Cloud Run pour la communication de service à service. Consultez Gérer les accès à l'aide d'IAM.--no-cpu-throttling
est requis pour activer le GPU.--service-account
définit l'identité du service.
Définir la simultanéité pour des performances optimales
Cette section fournit un contexte sur les paramètres de simultanéité recommandés. Pour une latence de requête optimale, assurez-vous que le paramètre --concurrency
est égal à la variable d'environnement OLLAMA_NUM_PARALLEL
d'Ollama.
OLLAMA_NUM_PARALLEL
détermine le nombre d'emplacements de requête disponibles pour chaque modèle afin de gérer les requêtes d'inférence simultanément.--concurrency
détermine le nombre de requêtes que Cloud Run envoie à une instance Ollama en même temps.
Si --concurrency
dépasse OLLAMA_NUM_PARALLEL
, Cloud Run peut envoyer plus de requêtes à un modèle dans Ollama qu'il n'a de créneaux de requêtes disponibles.
Cela entraîne la mise en file d'attente des requêtes dans Ollama, ce qui augmente la latence des requêtes pour les requêtes mises en file d'attente. Cela entraîne également un autoscaling moins réactif, car les requêtes mises en file d'attente ne déclenchent pas l'extension de Cloud Run et le démarrage de nouvelles instances.
Ollama permet également de diffuser plusieurs modèles à partir d'un seul GPU. Pour éviter complètement la mise en file d'attente des requêtes sur l'instance Ollama, vous devez toujours définir --concurrency
pour qu'il corresponde à OLLAMA_NUM_PARALLEL
.
Il est important de noter que l'augmentation de OLLAMA_NUM_PARALLEL
ralentit également les requêtes parallèles.
Optimiser l'utilisation
Pour une utilisation optimale du GPU, augmentez --concurrency
, en le maintenant dans un double de la valeur de OLLAMA_NUM_PARALLEL
. Bien que cela entraîne la mise en file d'attente des requêtes dans Ollama, cela peut contribuer à améliorer l'utilisation: les instances Ollama peuvent traiter immédiatement les requêtes de leur file d'attente, et les files d'attente aident à absorber les pics de trafic.
Tester le service Ollama déployé avec curl
Maintenant que vous avez déployé le service Ollama, vous pouvez lui envoyer des requêtes. Toutefois, si vous envoyez une requête directement, Cloud Run répond avec HTTP 401 Unauthorized
.
Cela est intentionnel, car une API d'inférence LLM est destinée à être appelée par d'autres services, tels qu'une application frontale. Pour en savoir plus sur l'authentification de service à service sur Cloud Run, consultez Authentifier de service à service.
Pour envoyer des requêtes au service Ollama, ajoutez un en-tête avec un jeton OIDC valide aux requêtes, par exemple à l'aide du proxy du développeur Cloud Run:
Démarrez le proxy et, lorsque vous êtes invité à installer le composant
cloud-run-proxy
, choisissezY
:gcloud run services proxy ollama-gemma --port=9090
Envoyez-lui une requête dans un onglet de terminal distinct, en laissant le proxy en cours d'exécution. Notez que le proxy s'exécute sur
localhost:9090
:curl http://localhost:9090/api/generate -d '{ "model": "gemma2:9b", "prompt": "Why is the sky blue?" }'
Cette commande doit fournir un résultat de streaming semblable à celui-ci:
{"model":"gemma2:9b","created_at":"2024-07-15T23:21:39.288463414Z","response":"The","done":false} {"model":"gemma2:9b","created_at":"2024-07-15T23:21:39.320937525Z","response":" sky","done":false} {"model":"gemma2:9b","created_at":"2024-07-15T23:21:39.353173544Z","response":" appears","done":false} {"model":"gemma2:9b","created_at":"2024-07-15T23:21:39.385284976Z","response":" blue","done":false} ...
Effectuer un nettoyage
- Supprimez les autres ressources Google Cloud créées dans ce tutoriel :