Exécuter l'inférence à l'aide d'un modèle Gemma sur Cloud Run avec un GPU RTX 6000 Pro

1. Introduction

Présentation

Points abordés

  • Déployer un modèle Gemma sur un GPU Cloud Run RTX 6000 Pro
  • Télécharger un modèle simultanément depuis Cloud Storage lors du démarrage du conteneur

2. Préparation

Définissez les variables d'environnement qui seront utilisées tout au long de cet atelier de programmation :

export PROJECT_ID=<YOUR_PROJECT_ID>

export REGION=europe-west4
export SERVICE_NAME=gemma-rtx-codelab

# set the project
gcloud config set project $PROJECT_ID

Activer les API nécessaires pour cet atelier de programmation

gcloud services enable artifactregistry.googleapis.com \
        cloudbuild.googleapis.com \
        run.googleapis.com \
        compute.googleapis.com

Créer un dossier pour l'atelier de programmation

mkdir codelab-rtx
cd codelab-rtx

Activez l'accès privé à Google pour votre sous-réseau afin d'optimiser le chargement des modèles de ML depuis Cloud Storage. Pour en savoir plus, consultez la section sur le chargement de modèles depuis Cloud Storage dans le document sur les bonnes pratiques concernant les GPU.

gcloud compute networks subnets update default \
  --region=europe-west4 \
  --enable-private-ip-google-access

3. Configurer Cloud Storage

Commencez par créer un bucket Cloud Storage pour stocker les pondérations du modèle.

Créer un bucket unique

# Generate a unique bucket name
export MODEL_BUCKET="${PROJECT_ID}-rtx-codelab-$(python3 -c 'import uuid; print(str(uuid.uuid4())[:8])')"
echo "Bucket name: $MODEL_BUCKET"

# Create the regional bucket
gcloud storage buckets create gs://$MODEL_BUCKET \
    --location=$REGION \
    --uniform-bucket-level-access

4. Récupérer les pondérations du modèle

Ensuite, téléchargez le modèle Gemma 3 dans un répertoire local, puis importez-le dans votre bucket Cloud Storage.

Installer Ollama

Vous pouvez exécuter cette commande pour installer Ollama :

curl -fsSL https://ollama.com/install.sh | sh

Télécharger le modèle

Créez un répertoire pour le modèle téléchargé.

mkdir model-weights

Vous utiliserez deux onglets de terminal pour ce processus : l'un pour exécuter le serveur Ollama et l'autre pour récupérer le modèle.

Terminal 1 (serveur) :

Démarrez le serveur en transmettant l'emplacement du modèle téléchargé. Cette commande continuera de s'exécuter.

OLLAMA_MODELS=$(pwd)/model-weights ollama serve

Terminal 2 (client) : ouvrez un nouvel onglet de terminal et téléchargez le modèle. Le client communique automatiquement avec le serveur en cours d'exécution.

# note if you wish to use a larger model, you can change this to gemma3:27b
ollama pull gemma3:1b

Retournez au terminal 1 : une fois le téléchargement terminé dans le terminal 2, revenez au terminal 1 et appuyez sur Ctrl+C pour arrêter le serveur.

Importer des fichiers dans Cloud Storage

Importez maintenant les poids dans votre bucket. gcloud storage gère automatiquement les mises en ligne parallèles pour plus de rapidité.

gcloud storage cp -r ./model-weights/* gs://$MODEL_BUCKET/

(Facultatif) Nettoyer les pondérations locales

Étant donné que le modèle se trouve désormais dans Cloud Storage, supprimez la copie locale.

rm -rf model-weights

5. Créer le service

Commencez par créer un dossier pour le service.

mkdir rtx-service
cd rtx-service

Créez un fichier Dockerfile avec le contenu suivant :

FROM ollama/ollama:latest

# Install Google Cloud CLI
RUN apt-get update && apt-get install -y curl gnupg && \
    echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] http://packages.cloud.google.com/apt cloud-sdk main" | tee -a /etc/apt/sources.list.d/google-cloud-sdk.list && \
    curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key --keyring /usr/share/keyrings/cloud.google.gpg add - && \
    apt-get update && apt-get install -y google-cloud-cli && \
    apt-get clean && rm -rf /var/lib/apt/lists/*

# Listen on all interfaces, port 11434
ENV OLLAMA_HOST 0.0.0.0:11434

# 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

# Copy and set up the startup script
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh

# Start using the entrypoint script
ENTRYPOINT ["/entrypoint.sh"]

Créez un fichier nommé entrypoint.sh avec le contenu suivant :

#!/bin/bash
set -e

# Ensure OLLAMA_MODELS directory exists
mkdir -p $OLLAMA_MODELS

# Download model weights from GCS if MODEL_BUCKET is set
if [ -n "$MODEL_BUCKET" ]; then
  echo "Downloading model weights from gs://$MODEL_BUCKET..."
  # gcloud storage handles concurrent downloads automatically
  gcloud storage cp -r "gs://$MODEL_BUCKET/*" "$OLLAMA_MODELS/"
else
  echo "MODEL_BUCKET not set. Skipping download."
fi

# Start Ollama
exec ollama serve

6. Déployer dans Cloud Run

Dans cette section, vous allez déployer le service à l'aide de gcloud run deploy. Cette commande permet de créer votre conteneur à partir de la source et de le déployer sur Cloud Run avec les configurations GPU et réseau nécessaires.

Créer un compte de service

Créez un compte de service dédié pour cette application et accordez-lui uniquement les autorisations requises.

# Create a dedicated service account
gcloud iam service-accounts create rtx-codelab-identity \
    --display-name="RTX Codelab Identity"

# Grant permission to read from the model bucket
gcloud storage buckets add-iam-policy-binding gs://$MODEL_BUCKET \
    --member="serviceAccount:rtx-codelab-identity@$PROJECT_ID.iam.gserviceaccount.com" \
    --role="roles/storage.objectViewer"

# Grant access to the Compute Engine network for the Cloud Run service identity
gcloud projects add-iam-policy-binding $PROJECT_ID \
     --member="serviceAccount:rtx-codelab-identity@$PROJECT_ID.iam.gserviceaccount.com" \
     --role="roles/compute.networkUser"

# Grant access to the Compute Engine network for the default service account
gcloud projects add-iam-policy-binding $PROJECT_ID \
 --member="serviceAccount:service-$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')@serverless-robot-prod.iam.gserviceaccount.com" \
 --role="roles/compute.networkUser"

Configuration du réseau

Pour des performances optimales lors du téléchargement de modèles volumineux, utilisez la sortie VPC direct. Cela permet au conteneur d'accéder à Cloud Storage via le réseau privé Google, en contournant l'Internet public et les passerelles NAT. Les indicateurs suivants sont utilisés dans la commande gcloud run deploy :

  • --network : se connecte au VPC default (assurez-vous que ce réseau existe et qu'il dispose d'un sous-réseau dans votre région avec l'accès privé à Google activé).
  • --subnet : sous-réseau spécifique dans votre région (généralement default si vous utilisez le réseau par défaut).
  • --vpc-egress : définissez cette valeur sur all-traffic pour forcer tout le trafic sortant à transiter par le VPC.

Commande de déploiement

gcloud beta run deploy $SERVICE_NAME \
    --source . \
    --region $REGION \
    --project $PROJECT_ID \
    --no-allow-unauthenticated \
    --port 11434 \
    --service-account rtx-codelab-identity@$PROJECT_ID.iam.gserviceaccount.com \
    --cpu 20 --memory 80Gi \
    --gpu 1 \
    --gpu-type nvidia-rtx-pro-6000 \
    --set-env-vars MODEL_BUCKET=$MODEL_BUCKET \
    --network default \
    --subnet default \
    --vpc-egress all-traffic \
    --no-gpu-zonal-redundancy

7. Tester le service

Une fois déployé, vous pouvez interagir avec votre modèle Gemma 3 à l'aide de l'API Ollama.

Obtenir l'URL du service

Récupérez l'URL de votre service Cloud Run déployé.

SERVICE_URL=$(gcloud run services describe $SERVICE_NAME --region $REGION --format 'value(status.url)')
echo "Service URL: $SERVICE_URL"

Exécuter une inférence

Envoyez une requête au modèle à l'aide de curl. Vous pouvez définir "stream": false pour obtenir la réponse complète dans un seul objet JSON et utiliser jq pour extraire uniquement le texte.

Remarque : Si vous utilisez un modèle plus grand, par exemple gemma3:27b, vous devrez modifier le nom du modèle dans le fichier JSON ci-dessous.

curl -s "$SERVICE_URL/api/generate" \
  -H "Authorization: Bearer $(gcloud auth print-identity-token)" \
  -H "Content-Type: application/json" \
  -d '{
  "model": "gemma3:1b",
  "prompt": "Why is the sky blue?",
  "stream": false
}' | jq -r '.response'

8. Félicitations !

Bravo ! Vous avez terminé cet atelier de programmation.

Nous vous recommandons de consulter la documentation Cloud Run.

Points abordés

  • Déployer un modèle Gemma sur un GPU Cloud Run RTX 6000 Pro
  • Télécharger un modèle simultanément depuis Cloud Storage lors du démarrage du conteneur

9. 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 ou les ressources individuelles.

Option 1 : Supprimer des ressources

Supprimer le service Cloud Run

gcloud run services delete $SERVICE_NAME \
      --region $REGION \
      --quiet

Supprimer le compte de service

gcloud iam service-accounts delete \
      rtx-codelab-identity@$PROJECT_ID.iam.gserviceaccount.com \
      --quiet

Supprimer le bucket Cloud Storage

gcloud storage rm --recursive gs://$MODEL_BUCKET

Supprimer l'image de conteneur

Cette compilation a créé une image de conteneur dans Artifact Registry. Vous pouvez trouver le nom de l'image et la supprimer.

Listez les images pour trouver le nom exact (généralement gcr.io/PROJECT_ID/SERVICE_NAME).

gcloud container images list --filter="name:$SERVICE_NAME"

Supprimez l'image (remplacez IMAGE_NAME par le résultat ci-dessus).

gcloud container images delete <IMAGE_NAME> --force-delete-tags

Option 2 : Supprimer le projet

Pour supprimer l'intégralité du projet, accédez à Gérer les ressources, sélectionnez le projet que vous avez créé à l'étape 2, puis choisissez "Supprimer". Si vous supprimez le projet, vous devrez changer de projet dans votre SDK Cloud. Vous pouvez afficher la liste de tous les projets disponibles en exécutant gcloud projects list.