Cómo usar Ollama como archivo adicional con GPU de Cloud Run y Open WebUI como contenedor de Ingress de frontend

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.