Ejecuta la inferencia de LLM en GPUs de Cloud Run con Gemma 3 y Ollama


Objetivos

En esta guía, se muestra cómo ejecutar la inferencia de LLM en GPUs de Cloud Run con Gemma 3 y Ollama, y tiene los siguientes objetivos:

  • Implementa Ollama con el modelo Gemma 3 en un servicio de Cloud Run habilitado para GPU.
  • Envía instrucciones al servicio de Ollama en su extremo privado.

Para conocer una forma alternativa de implementar modelos abiertos de Gemma 3 en Cloud Run con un contenedor compilado previamente, consulta Ejecuta modelos de Gemma 3 en Cloud Run.

Costos

En este documento, usarás los siguientes componentes facturables de Google Cloud:

Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios.

Es posible que los usuarios Google Cloud nuevos cumplan con los requisitos para obtener una prueba gratuita.

Antes de comenzar

  1. 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.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  5. Make sure that billing is enabled for your Google Cloud project.

  6. Enable the Artifact Registry, Cloud Build, Cloud Run, and Cloud Storage APIs.

    Enable the APIs

  7. Instala e inicializa gcloud CLI
  8. Solicita una cuota de Total Nvidia L4 GPU allocation, per project per region en la API de Cloud Run Admin en la página Cuotas y límites del sistema para completar este instructivo.
  9. Roles obligatorios

    Si quieres obtener los permisos que necesitas para completar el instructivo, pídele a tu administrador que te otorgue los siguientes roles de IAM en tu proyecto:

    Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.

    También puedes obtener los permisos necesarios mediante roles personalizados o cualquier otro rol predefinido.

    Otorga los roles

    Console

    1. En la consola de Google Cloud , ve a la página IAM.

      Ir a IAM
    2. Selecciona el proyecto.
    3. Haz clic en Grant access.
    4. En el campo Principales nuevas, ingresa tu identificador de usuario. Por lo general, esta es la dirección de correo electrónico de la Cuenta de Google que se usa para implementar el servicio de Cloud Run.

    5. En la lista Seleccionar un rol, elige un rol.
    6. Para otorgar roles adicionales, haz clic en Agregar otro rol y agrega cada rol adicional.
    7. Haz clic en Guardar.

    gcloud

    Para otorgar los roles de IAM necesarios a tu cuenta en tu proyecto, sigue estos pasos:

         gcloud projects add-iam-policy-binding PROJECT_ID \
             --member=PRINCIPAL \
             --role=ROLE
         

    Reemplaza lo siguiente:

    • PROJECT_NUMBER por el número de tu proyecto Google Cloud .
    • PROJECT_ID por el ID de tu proyecto Google Cloud .
    • PRINCIPAL por la cuenta a la que agregarás la vinculación. Por lo general, esta es la dirección de correo electrónico de la Cuenta de Google que se usa para implementar el servicio de Cloud Run.
    • ROLE con el rol que agregarás a la cuenta del implementador.

Configura gcloud

Para configurar Google Cloud CLI para tu servicio de Cloud Run, sigue estos pasos:

  1. Configura el proyecto predeterminado:

    gcloud config set project PROJECT_ID

    Haz clic en el ícono para reemplazar la variable PROJECT_ID por el nombre del proyecto que creaste para este instructivo. Esto garantiza que todas las fichas de esta página que hacen referencia a PROJECT_ID tengan el valor correcto ya completado.

  2. Configura Google Cloud CLI a fin de usar la región europe-west1 para los comandos de Cloud Run.

    gcloud config set run/region europe-west1

Usa Docker para crear una imagen de contenedor con Ollama y Gemma

  1. Crea un directorio para el servicio de Ollama y cambia tu directorio de trabajo a este nuevo directorio:

    mkdir ollama-backend
    cd ollama-backend
  2. Crea un archivo Dockerfile con el siguiente contenido:

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

Almacena los pesos del modelo en la imagen del contenedor para que las instancias se inicien más rápido

Google recomienda almacenar los pesos del modelo para Gemma 3 (4B) y modelos de tamaño similar directamente en la imagen del contenedor.

Las ponderaciones del modelo son los parámetros numéricos que definen el comportamiento de un LLM. Ollama debe leer estos archivos por completo y cargar los pesos en la memoria de la GPU (VRAM) durante el inicio de la instancia del contenedor, antes de que pueda comenzar a entregar solicitudes de inferencia.

En Cloud Run, es importante que la instancia de contenedor se inicie rápidamente para minimizar la latencia de la solicitud. Si la instancia de contenedor tiene un tiempo de inicio lento, el servicio toma más tiempo para escalar de cero a una instancia y necesita más tiempo para escalar horizontalmente durante un aumento repentino del tráfico.

Para garantizar un inicio rápido, almacena los archivos del modelo en la imagen del contenedor. Esto es más rápido y confiable que descargar los archivos desde una ubicación remota durante el inicio. El almacenamiento de imágenes de contenedor interno de Cloud Run está optimizado para controlar los aumentos de tráfico, lo que le permite configurar con rapidez el sistema de archivos del contenedor cuando se inicia una instancia.

Ten en cuenta que las ponderaciones del modelo para Gemma 3 (4B) ocupan 8 GB de almacenamiento. Los modelos más grandes tienen archivos de ponderación del modelo más grandes, y puede que no sea práctico almacenarlos en la imagen del contenedor. Consulta Prácticas recomendadas: Inferencia de IA en Cloud Run con GPUs para obtener una descripción general de las compensaciones.

Compila e implementa el servicio de Cloud Run

Compila el servicio e impleméntalo en 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

Ten en cuenta las siguientes marcas importantes en este comando:

  • --concurrency 4 se configura para que coincida con el valor de la variable de entorno OLLAMA_NUM_PARALLEL.
  • --gpu 1 con --gpu-type nvidia-l4 asigna 1 GPU NVIDIA L4 a cada instancia de Cloud Run en el servicio.
  • --max-instances 1 especifica la cantidad máxima de instancias a las que se puede escalar. Debe ser igual o inferior a la cuota de GPU NVIDIA L4 (Total Nvidia L4 GPU allocation, per project per region) de tu proyecto.
  • --no-allow-unauthenticated restringe el acceso no autenticado al servicio. Si mantienes el servicio privado, puedes confiar en la autenticación integrada de Identity and Access Management (IAM) de Cloud Run para la comunicación entre servicios. Consulta Administra el acceso mediante IAM.
  • Se requiere --no-cpu-throttling para habilitar la GPU.
  • --no-gpu-zonal-redundancy Establece las opciones de redundancia zonal según tus requisitos de conmutación por error zonal y la cuota disponible. Consulta las opciones de redundancia zonal de GPU para obtener más detalles.

Configura la simultaneidad para obtener un rendimiento óptimo

En esta sección, se proporciona contexto sobre la configuración de simultaneidad recomendada. Para obtener una latencia de solicitud óptima, asegúrate de que la configuración --concurrency sea igual a la variable de entorno OLLAMA_NUM_PARALLEL de Ollama.

  • OLLAMA_NUM_PARALLEL determina cuántos espacios de solicitud están disponibles por cada modelo para controlar las solicitudes de inferencia de forma simultánea.
  • --concurrency determina cuántas solicitudes envía Cloud Run a una instancia de Ollama al mismo tiempo.

Si --concurrency excede OLLAMA_NUM_PARALLEL, Cloud Run puede enviar más solicitudes a un modelo en Ollama que para las ranuras de solicitud disponibles. Esto lleva a que se pongan en cola las solicitudes dentro de Ollama, lo que aumenta la latencia de las solicitudes en cola. También genera un ajuste de escala automático menos responsivo, ya que las solicitudes en fila no activan Cloud Run para escalar horizontalmente y comenzar instancias nuevas.

Ollama también admite la entrega de varios modelos desde una GPU. A fin de evitar por completo que las solicitudes se pongan en cola en la instancia de Ollama, debes configurar --concurrency para que coincida con OLLAMA_NUM_PARALLEL.

Es importante tener en cuenta que aumentar OLLAMA_NUM_PARALLEL también hace que las solicitudes paralelas tarden más tiempo.

Optimiza el uso

Para obtener un uso de GPU óptimo, aumenta --concurrency y mantenlo dentro del doble del valor de OLLAMA_NUM_PARALLEL. Si bien esto genera colas de solicitudes en Ollama, puede ayudar a mejorar la utilización: las instancias de Ollama pueden procesar inmediatamente las solicitudes de su cola, y las colas ayudan a absorber los aumentos repentinos del tráfico.

Prueba el servicio de Ollama implementado con curl

Ahora que implementaste el servicio de Ollama, puedes enviarle solicitudes. Sin embargo, si envías una solicitud directamente, Cloud Run responde con HTTP 401 Unauthorized. Esto es intencional, ya que una API de inferencia de LLM está diseñada para que otros servicios la llamen, como una aplicación de frontend. Para obtener más información sobre la autenticación de servicio a servicio en Cloud Run, consulta Autenticación de servicio a servicio.

Para enviar solicitudes al servicio de Ollama, agrega un encabezado con un token de OIDC válido a las solicitudes, por ejemplo, mediante el proxy de desarrollador de Cloud Run:

  1. Inicia el proxy y, cuando se te solicite instalar el componente cloud-run-proxy, elige Y:

    gcloud run services proxy ollama-gemma --port=9090
  2. Envía una solicitud a él en una pestaña separada de la terminal para dejar el proxy en ejecución. Ten en cuenta que el proxy se ejecuta en localhost:9090:

    curl http://localhost:9090/api/generate -d '{
      "model": "gemma3:4b",
      "prompt": "Why is the sky blue?"
    }'

    Este comando debe proporcionar un resultado de transmisión similar al siguiente:

    {"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}
    ...
    

Limpia

Borra los siguientes recursos Google Cloud que se crearon en este instructivo:

¿Qué sigue?