Ejecuta la inferencia con un modelo de Gemma en Cloud Run con la GPU RTX 6000 Pro

1. Introducción

Descripción general

Qué aprenderás

  • Cómo implementar un modelo de Gemma en una GPU RTX 6000 Pro de Cloud Run
  • Cómo descargar un modelo de forma simultánea desde Cloud Storage durante el inicio del contenedor

2. Configuración y requisitos

Configura las variables de entorno que se usarán en este 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

Habilita las APIs necesarias para este codelab

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

Crea una carpeta para el codelab

mkdir codelab-rtx
cd codelab-rtx

Habilita el Acceso privado a Google en tu subred para optimizar la carga del modelo de AA desde Cloud Storage. Puedes obtener más información en la sección del documento de prácticas recomendadas para GPUs sobre cómo cargar modelos desde Cloud Storage.

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

3. Configura Cloud Storage

Primero, crea un bucket de Cloud Storage para almacenar los pesos del modelo.

Crea un bucket único

# 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. Cómo recuperar los pesos del modelo

A continuación, descarga el modelo Gemma 3 en un directorio local y, luego, súbelo a tu bucket de Cloud Storage.

Instala Ollama

Puedes ejecutar este comando para instalar Ollama:

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

Descargar el modelo

Crea un directorio para el modelo descargado.

mkdir model-weights

Usarás dos pestañas de terminal para este proceso: una para ejecutar el servidor de Ollama y otra para recuperar el modelo.

Terminal 1 (servidor):

Inicia el servidor pasando la ubicación del modelo descargado. Este comando seguirá ejecutándose.

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

Terminal 2 (cliente): Abre una nueva pestaña de terminal y descarga el modelo. El cliente se comunica automáticamente con el servidor en ejecución.

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

Vuelve a la terminal 1: Una vez que se complete la descarga en la terminal 2, vuelve a la terminal 1 y presiona Ctrl + C para detener el servidor.

Sube archivos a Cloud Storage

Ahora sube los pesos a tu bucket. gcloud storage controla automáticamente las cargas paralelas para aumentar la velocidad.

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

(Opcional) Limpia los pesos locales

Como el modelo ahora está en Cloud Storage, quita la copia local.

rm -rf model-weights

5. Cómo crear el servicio

Primero, crea una carpeta para el servicio.

mkdir rtx-service
cd rtx-service

Crea un Dockerfile con el siguiente contenido:

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 archivo entrypoint.sh con el siguiente contenido:

#!/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. Implementa en Cloud Run

En esta sección, implementarás el servicio con gcloud run deploy. Este comando compilará tu contenedor desde la fuente y lo implementará en Cloud Run con las configuraciones de GPU y de red necesarias.

Crear una cuenta de servicio.

Crea una cuenta de servicio dedicada para esta aplicación y otórgale solo los permisos necesarios.

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

Configuración de red

Para obtener un rendimiento óptimo cuando descargues modelos grandes, usa la salida de VPC directa. Esto permite que el contenedor acceda a Cloud Storage a través de la red privada de Google, lo que evita Internet pública y las puertas de enlace NAT. En el comando gcloud run deploy, se usan las siguientes marcas:

  • --network: Se conecta a la VPC default (asegúrate de que esta red exista y tenga una subred en tu región con el Acceso privado a Google habilitado).
  • --subnet: Es la subred específica de tu región (por lo general, default si usas la red predeterminada).
  • --vpc-egress: Se establece en all-traffic para forzar todo el tráfico de salida a través de la VPC.

Comando de implementación

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. Prueba el servicio

Una vez que se implemente, podrás interactuar con tu modelo de Gemma 3 a través de la API de Ollama.

Obtén la URL de servicio

Recupera la URL de tu servicio de Cloud Run implementado.

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

Ejecuta la inferencia

Envía una instrucción al modelo con curl. Puedes configurar "stream": false para obtener la respuesta completa en un solo objeto JSON y usar jq para extraer solo el texto.

Nota: Si usas un modelo más grande, p.ej., gemma3:27b, deberás cambiar el nombre del modelo en el siguiente JSON.

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. ¡Felicitaciones!

¡Felicitaciones por completar el codelab!

Te recomendamos que revises la documentación de Cloud Run.

Temas abordados

  • Cómo implementar un modelo de Gemma en una GPU RTX 6000 Pro de Cloud Run
  • Cómo descargar un modelo de forma simultánea desde Cloud Storage durante el inicio del contenedor

9. Limpia

Para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos usados en este instructivo, puedes borrar el proyecto o los recursos individuales.

Opción 1: Borra los recursos

Borra el servicio de Cloud Run

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

Borra la cuenta de servicio

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

Borra el bucket de Cloud Storage

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

Borra la imagen del contenedor

Esta compilación creó una imagen de contenedor en Artifact Registry. Puedes encontrar el nombre de la imagen y borrarla.

Enumera las imágenes para encontrar el nombre exacto (por lo general, gcr.io/PROJECT_ID/SERVICE_NAME).

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

Borra la imagen (reemplaza IMAGE_NAME por el resultado anterior).

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

Opción 2: Borra el proyecto

Para borrar todo el proyecto, ve a Administrar recursos, selecciona el proyecto que creaste en el paso 2 y elige Borrar. Si borras el proyecto, deberás cambiar de proyecto en el SDK de Cloud. Para ver la lista de todos los proyectos disponibles, ejecuta gcloud projects list.