1. Introducción
Descripción general
Cloud Run agregó recientemente la compatibilidad con GPU. Está disponible como versión preliminar pública en lista de espera. Si te interesa probar la función, completa este formulario para unirte a la lista de espera. Cloud Run es una plataforma de contenedores en Google Cloud que facilita la ejecución de tu código en un contenedor sin necesidad de administrar un clúster.
Actualmente, las GPUs que ponemos a disposición son las GPUs Nvidia L4 con 24 GB de VRAM. Hay una GPU por instancia de Cloud Run, y el ajuste de escala automático de Cloud Run sigue aplicándose. Esto incluye el escalamiento horizontal de hasta 5 instancias (con aumento de cuota disponible), así como el escalamiento vertical a cero instancias cuando no hay solicitudes.
Un caso de uso de las GPUs es ejecutar tus propios modelos de lenguaje grandes (LLM) abiertos. En este instructivo, se explica cómo implementar un servicio que ejecuta un LLM.
En este codelab, implementarás un servicio de varios contenedores que usa Open WebUI como un contenedor de entrada de frontend y usa Ollama en un sidecar para entregar un modelo de Gemma 2 2B almacenado en un bucket de Google Cloud Storage.
Qué aprenderás
- Cómo crear un servicio de varios contenedores en Cloud Run
- Cómo implementar Ollama como un proceso secundario que entrega un modelo de Gemma 2 2B
- Cómo implementar Open WebUI como un contenedor de entrada de frontend
2. Configura variables de entorno y habilita APIs
Actualiza la CLI de gcloud
Primero, deberás tener instalada una versión reciente de la CLI de gcloud. Puedes actualizar la CLI ejecutando el siguiente comando:
gcloud components update
Configura variables de entorno
Puedes establecer variables de entorno que se usarán a lo largo de este codelab.
PROJECT_ID=<YOUR_PROJECT_ID> REGION=us-central1 gcloud config set project $PROJECT_ID
Habilita las APIs
Antes de comenzar a usar este codelab, deberás habilitar varias APIs. En este codelab, se deben usar las siguientes APIs. Para habilitar esas APIs, ejecuta el siguiente comando:
gcloud services enable run.googleapis.com \
cloudbuild.googleapis.com \
storage.googleapis.com \
artifactregistry.googleapis.com
Crea un directorio para este codelab.
mkdir ollama-sidecar-codelab cd ollama-sidecar-codelab
3. Crea un bucket de GCS para almacenar el modelo Gemma 2 2B
Primero, instalarás Ollama para descargar el modelo. Se descargará el modelo en /home/$USER/.ollama/models
curl -fsSL https://ollama.com/install.sh | sh
Ahora, ejecuta Ollama con el siguiente comando:
ollama serve
Ollama comienza a escuchar en el puerto 11434.
Abre una segunda ventana de la terminal para extraer el modelo Gemma 2 2B en
ollama pull gemma2:2b
(Opcional) Puedes interactuar con Gemma desde la línea de comandos ejecutando
ollama run gemma2:2b
Cuando termines de chatear con Gemma, puedes salir escribiendo
/bye
4. Cree un bucket de almacenamiento
Ahora que se descargó el modelo, puedes moverlo a tu bucket de GCS.
Primero, crea el bucket.
gcloud storage buckets create gs://$PROJECT_ID-gemma2-2b-codelab
Ahora, mueve la carpeta de modelos a GCS.
gsutil cp -r /home/$USER/.ollama/models gs://$PROJECT_ID-gemma2-2b-codelab
5. Crea la imagen de Ollama
Crea un archivo Dockerfile con el siguiente contenido
FROM --platform=linux/amd64 ollama/ollama # 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
Crea un repositorio de Artifact Registry para almacenar las imágenes de tu servicio.
gcloud artifacts repositories create ollama-sidecar-codelab-repo --repository-format=docker \
--location=us-central1 --description="Ollama + OpenWebUI website demo" \
--project=$PROJECT_ID
Compila la imagen del archivo adicional de Ollama
gcloud builds submit \
--tag us-central1-docker.pkg.dev/$PROJECT_ID/ollama-sidecar-codelab-repo/ollama-gemma-2b \
--machine-type e2-highcpu-32
6. Crea la imagen del frontend de Open WebUI
En esta sección, crearás el contenedor de entrada de frontend con Open WebUI.
Usa Docker para extraer la imagen de Open WebUI.
docker pull ghcr.io/open-webui/open-webui:main
Luego, configura Docker para que use tus credenciales de Google Cloud y se autentique en Artifact Registry. Esto te permitirá usar Docker para enviar una imagen a un repo de Artifact Registry.
gcloud auth configure-docker us-central1-docker.pkg.dev
Etiqueta tu imagen y, luego, envíala a Artifact Registry.
docker tag ghcr.io/open-webui/open-webui:main us-central1-docker.pkg.dev/$PROJECT_ID/ollama-sidecar-codelab-repo/openwebui docker push us-central1-docker.pkg.dev/$PROJECT_ID/ollama-sidecar-codelab-repo/openwebui
7. Implementa el servicio de varios contenedores en Cloud Run
Usa un archivo YAML para implementar el servicio de varios contenedores
Crea un service.yaml con el siguiente contenido.
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: ollama-sidecar-codelab
labels:
cloud.googleapis.com/location: us-central1
spec:
template:
metadata:
annotations:
autoscaling.knative.dev/maxScale: '5'
run.googleapis.com/cpu-throttling: 'false'
run.googleapis.com/startup-cpu-boost: 'true'
run.googleapis.com/container-dependencies: '{"openwebui":["ollama-sidecar"]}'
spec:
containerConcurrency: 80
timeoutSeconds: 300
containers:
- name: openwebui
image: us-central1-docker.pkg.dev/YOUR_PROJECT_ID/ollama-sidecar-codelab/openwebui
ports:
- name: http1
containerPort: 8080
env:
- name: OLLAMA_BASE_URL
value: http://localhost:11434
- name: WEBUI_AUTH
value: 'false'
resources:
limits:
memory: 1Gi
cpu: 2000m
volumeMounts:
- name: in-memory-1
mountPath: /app/backend/data
startupProbe:
timeoutSeconds: 240
periodSeconds: 240
failureThreshold: 1
tcpSocket:
port: 8080
- name: ollama-sidecar
image: us-central1-docker.pkg.dev/YOUR_PROJECT_ID/ollama-sidecar-codelab/ollama-gemma-2b
env:
- name: OLLAMA_MODELS
value: /root/.ollama/models
resources:
limits:
cpu: '6'
nvidia.com/gpu: '1'
memory: 16Gi
volumeMounts:
- name: gcs-1
mountPath: /root/.ollama
startupProbe:
timeoutSeconds: 1
periodSeconds: 10
failureThreshold: 3
tcpSocket:
port: 11434
volumes:
- name: gcs-1
csi:
driver: gcsfuse.run.googleapis.com
volumeAttributes:
bucketName: YOUR_PROJECT_ID-gemma2-2b-codelab
- name: in-memory-1
emptyDir:
medium: Memory
sizeLimit: 10Gi
nodeSelector:
run.googleapis.com/accelerator: nvidia-l4
Actualiza service.yaml para reemplazar PROJECT_ID por el ID de tu proyecto:
sed -i "s/YOUR_PROJECT_ID/${PROJECT_ID}/g" service.yaml
Realiza la implementación en Cloud Run con el siguiente comando.
gcloud beta run services replace service.yaml
Prueba el servicio de Cloud Run
Ahora abre la URL de servicio en tu navegador web.
Una vez que se haya cargado la IU, en Select a model, elige Gemma 2 2B.
Ahora, hazle una pregunta a Gemma, p. ej., "¿Por qué el cielo es azul?".
8. ¡Felicitaciones!
¡Felicitaciones por completar el codelab!
Te recomendamos que revises la documentación sobre Cloud Run Functions.
Temas abordados
- Cómo crear un servicio de varios contenedores en Cloud Run
- Cómo implementar Ollama como un proceso secundario que entrega un modelo de Gemma 2 2B
- Cómo implementar Open WebUI como un contenedor de entrada de frontend
9. Limpia
Para evitar cargos involuntarios (por ejemplo, si los servicios de Cloud Run se invocan de forma involuntaria más veces que tu asignación mensual de invocaciones de Cloud Run en el nivel gratuito), puedes borrar Cloud Run o el proyecto que creaste en el paso 2.
Para borrar la función de Cloud Run, ve a la consola de Cloud Run en https://console.cloud.google.com/run y borra el servicio ollama-sidecar-codelab.
Si decides borrar todo el proyecto, puedes ir a https://console.cloud.google.com/cloud-resource-manager, seleccionar el proyecto que creaste en el paso 2 y elegir 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.