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
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.
Antes de comenzar
- 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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry, Cloud Build, Cloud Run, and Cloud Storage APIs.
- Instala e inicializa gcloud CLI
- 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:
-
Administrador de Artifact Registry (
roles/artifactregistry.admin
) -
Editor de Cloud Build (
roles/cloudbuild.builds.editor
) -
Administrador de Cloud Run (
roles/run.admin
) -
Crea cuentas de servicio (
roles/iam.serviceAccountCreator
) -
Administrador de IAM de proyecto (
roles/resourcemanager.projectIamAdmin
) -
Usuario de cuenta de servicio (
roles/iam.serviceAccountUser
) -
Consumidor de Service Usage (
roles/serviceusage.serviceUsageConsumer
) -
Administrador de almacenamiento (
roles/storage.admin
)
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:
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.
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
Crea un directorio para el servicio de Ollama y cambia tu directorio de trabajo a este nuevo directorio:
mkdir ollama-backend cd ollama-backend
Crea un archivo
Dockerfile
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 entornoOLLAMA_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:
Inicia el proxy y, cuando se te solicite instalar el componente
cloud-run-proxy
, eligeY
:gcloud run services proxy ollama-gemma --port=9090
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
- Borra otros recursos de Google Cloud que creaste en este instructivo: