Ejecuta la inferencia de LLM en GPUs de Cloud Run con Ollama


En este instructivo, aprenderás a implementar Gemma 2 de Google, un modelo de lenguaje grande (LLM) abierto, en un servicio de Cloud Run habilitado para GPU (para una inferencia rápida).

Usarás Ollama, un servidor de inferencia de LLM para modelos abiertos. Una vez que hayas completado el instructivo, puedes explorar otros modelos abiertos que son compatibles con Ollama, como Llama 3.1 (8B), Mistral (7B) y Qwen2 (7B).

Objetivos

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

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 nuevos de Google Cloud califiquen 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.

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.

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 us-central1 para los comandos de Cloud Run.

    gcloud config set run/region us-central1

Crea un repositorio de Artifact Registry Docker

Crea un repositorio de Docker para almacenar las imágenes de contenedor de este instructivo:

gcloud artifacts repositories create REPOSITORY \
  --repository-format=docker \
  --location=us-central1

Reemplaza REPOSITORY por el nombre del repositorio. Por ejemplo, repo

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

    FROM ollama/ollama:0.3.6
    
    # 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 gemma2:9b
    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 2 (9B) 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 2 (9B) ocupan 5.4 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.

Usa Cloud Build para compilar la imagen de contenedor

Para compilar la imagen de contenedor con Cloud Build y enviarla al repositorio de Artifact Registry, haz lo siguiente:

gcloud builds submit \
   --tag us-central1-docker.pkg.dev/PROJECT_ID/REPOSITORY/ollama-gemma \
   --machine-type e2-highcpu-32

Ten en cuenta las siguientes consideraciones:

  • Para obtener una compilación más rápida, este comando selecciona un tipo de máquina potente con más CPU y ancho de banda de red.
  • La compilación debería tardar alrededor de 7 minutos.
  • Una alternativa es compilar la imagen de forma local con Docker y enviarla a Artifact Registry. Esto puede ser más lento que ejecutar en Cloud Build, según el ancho de banda de tu red.

Implementa Ollama como un servicio de Cloud Run

Con la imagen del contenedor almacenada en un repositorio de Artifact Registry, ya puedes implementar Ollama como un servicio de Cloud Run.

Crea una cuenta de servicio dedicada

Crea una cuenta de servicio dedicada que el servicio de Ollama use como su identidad de servicio:

gcloud iam service-accounts create OLLAMA_IDENTITY \
  --display-name="Service Account for Ollama Cloud Run service"

Reemplaza OLLAMA_IDENTITY por el nombre de la cuenta de servicio que deseas crear, por ejemplo, ollama.

Se recomienda crear una cuenta de servicio dedicada para cada servicio de Cloud Run con el conjunto mínimo de permisos necesarios. El servicio de Ollama no necesita llamar a ninguna API de Google Cloud, lo que significa que no es necesario otorgar permisos a su cuenta de servicio.

Implemente el servicio

Implementa el servicio en Cloud Run:

gcloud beta run deploy ollama-gemma \
  --image us-central1-docker.pkg.dev/PROJECT_ID/REPOSITORY/ollama-gemma \
  --concurrency 4 \
  --cpu 8 \
  --set-env-vars OLLAMA_NUM_PARALLEL=4 \
  --gpu 1 \
  --gpu-type nvidia-l4 \
  --max-instances 7 \
  --memory 32Gi \
  --no-allow-unauthenticated \
  --no-cpu-throttling \
  --service-account OLLAMA_IDENTITY@PROJECT_ID.iam.gserviceaccount.com \
  --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.
  • --no-allow-authenticated 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.
  • --service-account establece la identidad del servicio.

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": "gemma2:9b",
      "prompt": "Why is the sky blue?"
    }'

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

    {"model":"gemma2:9b","created_at":"2024-07-15T23:21:39.288463414Z","response":"The","done":false}
    {"model":"gemma2:9b","created_at":"2024-07-15T23:21:39.320937525Z","response":" sky","done":false}
    {"model":"gemma2:9b","created_at":"2024-07-15T23:21:39.353173544Z","response":" appears","done":false}
    {"model":"gemma2:9b","created_at":"2024-07-15T23:21:39.385284976Z","response":" blue","done":false}
    ...
    

Limpia

  1. Borra otros recursos de Google Cloud que creaste en este instructivo:

¿Qué sigue?