Esegui l'inferenza utilizzando un modello Gemma su Cloud Run con la GPU RTX 6000 Pro

1. Introduzione

Panoramica

Obiettivi didattici

  • Come eseguire il deployment di un modello Gemma su una GPU Cloud Run RTX 6000 Pro
  • Come scaricare un modello contemporaneamente da Cloud Storage durante l'avvio del container

2. Configurazione e requisiti

Imposta le variabili di ambiente che verranno utilizzate in questo codelab:

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

Abilita le API necessarie per questo codelab

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

Crea una cartella per il codelab

mkdir codelab-rtx
cd codelab-rtx

Abilita l'accesso privato Google alla tua subnet per ottimizzare il caricamento dei modelli di ML da Cloud Storage. Puoi scoprire di più nella sezione del documento sulle best practice per le GPU relativa al caricamento di modelli da Cloud Storage.

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

3. Configurare Cloud Storage

Innanzitutto, crea un bucket Cloud Storage per archiviare i pesi del modello.

Crea un bucket univoco

# 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. Recuperare i pesi del modello

Successivamente, scarica il modello Gemma 3 in una directory locale e poi caricalo nel bucket Cloud Storage.

Installare Ollama

Puoi eseguire questo comando per installare Ollama:

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

Scarica modello

Crea una directory per il modello scaricato.

mkdir model-weights

Per questo processo utilizzerai due schede del terminale: una per eseguire il server Ollama e l'altra per recuperare il modello.

Terminale 1 (server):

Avvia il server passando la posizione del modello scaricato. Questo comando continuerà a essere eseguito.

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

Terminale 2 (client): apri una nuova scheda del terminale e scarica il modello. Il client comunica automaticamente con il server in esecuzione.

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

Torna al terminale 1:una volta completato il download nel terminale 2, torna al terminale 1 e premi Ctrl+C per arrestare il server.

Carica su Cloud Storage

Ora carica i pesi nel bucket. gcloud storage gestisce automaticamente i caricamenti paralleli per velocizzare la procedura.

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

(Facoltativo) Pulisci i pesi locali

Poiché il modello si trova ora in Cloud Storage, rimuovi la copia locale.

rm -rf model-weights

5. Crea il servizio

Per prima cosa, crea una cartella per il servizio.

mkdir rtx-service
cd rtx-service

Crea un file Dockerfile con il seguente contenuto

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"]

Crea un file denominato entrypoint.sh con i seguenti contenuti:

#!/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. Esegui il deployment in Cloud Run

In questa sezione, eseguirai il deployment del servizio utilizzando gcloud run deploy. Questo comando creerà il container dal codice sorgente e lo eseguirà il deployment su Cloud Run con le configurazioni di rete e GPU necessarie.

Crea service account

Crea un service account dedicato per questa applicazione e concedigli solo le autorizzazioni necessarie.

# 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"

Configurazione di rete

Per prestazioni ottimali durante il download di modelli di grandi dimensioni, utilizza l'uscita VPC diretto. In questo modo, il container può accedere a Cloud Storage tramite la rete privata Google, bypassando internet pubblico e i gateway NAT. Nel comando gcloud run deploy vengono utilizzati i seguenti flag:

  • --network: si connette al VPC default (assicurati che questa rete esista e abbia una subnet nella tua regione con l'accesso privato Google abilitato).
  • --subnet: la subnet specifica nella tua regione (di solito default se utilizzi la rete predefinita).
  • --vpc-egress: impostalo su all-traffic per forzare tutto il traffico in uscita tramite il VPC.

Comando di deployment

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. Testare il servizio

Una volta eseguito il deployment, puoi interagire con il modello Gemma 3 utilizzando l'API Ollama.

Recuperare l'URL del servizio

Recupera l'URL del servizio Cloud Run di cui è stato eseguito il deployment.

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

Esegui inferenza

Invia un prompt al modello utilizzando curl. Puoi impostare "stream": false per ottenere la risposta completa in un unico oggetto JSON e utilizzare jq per estrarre solo il testo.

Nota: se utilizzi un modello più grande, ad esempio gemma3:27b, dovrai modificare il nome del modello nel file JSON riportato di seguito.

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. Complimenti!

Congratulazioni per aver completato il codelab.

Ti consigliamo di consultare la documentazione di Cloud Run.

Argomenti trattati

  • Come eseguire il deployment di un modello Gemma su una GPU Cloud Run RTX 6000 Pro
  • Come scaricare un modello contemporaneamente da Cloud Storage durante l'avvio del container

9. Esegui la pulizia

Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial, puoi eliminare il progetto o le singole risorse.

Opzione 1: elimina le risorse

Elimina il servizio Cloud Run

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

Elimina il service account

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

Elimina il bucket Cloud Storage

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

Elimina l'immagine container

Questa build ha creato un'immagine container in Artifact Registry. Puoi trovare il nome dell'immagine ed eliminarla.

Elenca le immagini per trovare il nome esatto (di solito gcr.io/PROJECT_ID/SERVICE_NAME)

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

Elimina l'immagine (sostituisci IMAGE_NAME con il risultato ottenuto sopra)

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

Opzione 2: elimina il progetto

Per eliminare l'intero progetto, vai a Gestisci risorse, seleziona il progetto che hai creato nel passaggio 2 e scegli Elimina. Se elimini il progetto, dovrai cambiare progetto in Cloud SDK. Puoi visualizzare l'elenco di tutti i progetti disponibili eseguendo gcloud projects list.