Configurer gcloud
Pour configurer 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 utiliser la région
europe-west1
pour les commandes Cloud Run.gcloud config set run/region europe-west1
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-le comme répertoire de travail :
mkdir ollama-backend cd ollama-backend
Créez un fichier
Dockerfile
avec le contenu suivant :FROM ollama/ollama:latest # Listen on all interfaces, port 8080 ENV OLLAMA_HOST 0.0.0.0:8080 # Store model weight files in /models ENV OLLAMA_MODELS /models # Reduce logging verbosity ENV OLLAMA_DEBUG false # Never unload model weights from the GPU ENV OLLAMA_KEEP_ALIVE -1 # Store the model weights in the container image ENV MODEL gemma3:4b RUN ollama serve & sleep 5 && ollama pull $MODEL # Start Ollama ENTRYPOINT ["ollama", "serve"]
Stocker les pondérations du modèle dans l'image de conteneur pour un démarrage plus rapide des instances
Google recommande de stocker les poids du modèle pour Gemma 3 (4B) 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 pondérations dans la mémoire GPU (VRAM) lors du démarrage de l'instance de conteneur, avant de pouvoir commencer à traiter les requêtes d'inférence.
Sur Cloud Run, il est important de démarrer rapidement les instances de conteneur pour minimiser la latence des requêtes. Si le temps de démarrage de votre instance de conteneur est lent, le service met plus de temps à passer de zéro à une instance et a besoin de plus de temps pour effectuer un scaling horizontal lors d'un pic de trafic.
Pour garantir un démarrage rapide, stockez les fichiers de modèle dans l'image de conteneur elle-même. C'est plus rapide et plus fiable que de télécharger les fichiers depuis 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 lorsqu'une instance démarre.
Notez que les pondérations du modèle Gemma 3 (4B) occupent 8 Go d'espace de stockage. Les modèles plus volumineux ont des fichiers de pondération plus volumineux, qui peuvent être difficiles à stocker dans l'image de conteneur. Pour obtenir une vue d'ensemble des compromis, consultez Bonnes pratiques : inférence de l'IA sur Cloud Run avec des GPU.
Créer et déployer le service Cloud Run
Créez et déployez le service sur Cloud Run :
gcloud run deploy ollama-gemma \
--source . \
--concurrency 4 \
--cpu 8 \
--set-env-vars OLLAMA_NUM_PARALLEL=4 \
--gpu 1 \
--gpu-type nvidia-l4 \
--max-instances 1 \
--memory 32Gi \
--no-allow-unauthenticated \
--no-cpu-throttling \
--no-gpu-zonal-redundancy \
--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.--max-instances 1
spécifie le nombre maximal d'instances à mettre à l'échelle. Elle doit être égale ou inférieure au quota de GPU NVIDIA L4 (Total Nvidia L4 GPU allocation, per project per region
) de votre projet.--no-allow-unauthenticated
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 à Cloud Run pour la communication de service à service. Consultez Gérer les accès à l'aide d'IAM.--no-cpu-throttling
est nécessaire pour activer le GPU.--no-gpu-zonal-redundancy
Définissez les options de redondance zonale en fonction de vos exigences de basculement zonal et du quota disponible. Pour en savoir plus, consultez Options de redondance zonale des GPU.
Définir la simultanéité pour des performances optimales
Cette section fournit des informations sur les paramètres de simultanéité recommandés. Pour une latence des requêtes 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 traiter les requêtes d'inférence simultanément.--concurrency
détermine le nombre de requêtes que Cloud Run envoie simultanément à une instance Ollama.
Si --concurrency
dépasse OLLAMA_NUM_PARALLEL
, Cloud Run peut envoyer plus de requêtes à un modèle dans Ollama que le nombre d'emplacements 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 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 le effectuer un scaling horizontal de Cloud Run ni 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
allonge également la durée des requêtes parallèles.
Optimiser l'utilisation
Pour une utilisation optimale du GPU, augmentez --concurrency
, en veillant à ce qu'il reste dans la limite de deux fois la valeur de OLLAMA_NUM_PARALLEL
. Bien que cela entraîne une 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
.
C'est intentionnel, car une API d'inférence LLM est destinée à être appelée par d'autres services, tels qu'une application frontend. Pour en savoir plus sur l'authentification de service à service sur Cloud Run, consultez Authentification 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 de développement Cloud Run :
Démarrez le proxy et, lorsque vous êtes invité à installer le composant
cloud-run-proxy
, sélectionnezY
: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": "gemma3:4b", "prompt": "Why is the sky blue?" }'
Cette commande devrait fournir un flux de sortie semblable à celui-ci :
{"model":"gemma3:4b","created_at":"2025-03-10T03:02:18.641492408Z","response":"That","done":false} {"model":"gemma3:4b","created_at":"2025-03-10T03:02:18.687529153Z","response":"'","done":false} {"model":"gemma3:4b","created_at":"2025-03-10T03:02:18.753284927Z","response":"s","done":false} {"model":"gemma3:4b","created_at":"2025-03-10T03:02:18.812957381Z","response":" a","done":false} {"model":"gemma3:4b","created_at":"2025-03-10T03:02:18.889102649Z","response":" fantastic","done":false} {"model":"gemma3:4b","created_at":"2025-03-10T03:02:18.925748116Z","response":",","done":false} {"model":"gemma3:4b","created_at":"2025-03-10T03:02:18.958391572Z","response":" decept","done":false} {"model":"gemma3:4b","created_at":"2025-03-10T03:02:18.971035028Z","response":"ively","done":false} {"model":"gemma3:4b","created_at":"2025-03-10T03:02:18.989678484Z","response":" tricky","done":false} {"model":"gemma3:4b","created_at":"2025-03-10T03:02:18.999321940Z","response":" question","done":false} ...