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 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 te permite ejecutar tu código en un contenedor de forma sencilla, sin necesidad de administrar un clúster.

Actualmente, las GPU que ponemos a disposición son las GPU Nvidia L4 con 24 GB de vRAM. Hay una GPU por instancia de Cloud Run y aún se aplica el ajuste de escala automático de Cloud Run. Esto incluye el escalamiento horizontal hasta 5 instancias (con aumento de cuota disponible), así como la reducción a cero instancias cuando no hay solicitudes.

Un caso de uso para las GPU es ejecutar tus propios modelos abiertos de lenguaje grande (LLM). En este instructivo, aprenderás a implementar un servicio que ejecuta un LLM.

En este codelab, implementarás un servicio de varios contenedores que usa Open WebUI como contenedor de Ingress de frontend y usa Ollama en un archivo adicional para entregar un modelo 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 archivo adicional que entrega un modelo Gemma 2 2B
  • Cómo implementar Open WebUI como un contenedor de Ingress de frontend

2. Configura variables de entorno y habilita las APIs

Actualiza la CLI de gcloud

Primero, deberás tener instalada una versión reciente de la CLI de gcloud. Para actualizar la CLI, ejecuta el siguiente comando:

gcloud components update

Configura variables de entorno

Puedes establecer variables de entorno que se usarán en 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, debes habilitar varias APIs. Para este codelab, debes 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 de 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

ollama serve

Ollama comienza a escuchar en el puerto 11434.

Abre una segunda ventana de terminal para descargar el modelo Gemma 2 2B.

ollama pull gemma2:2b

(Opcional) Para interactuar con Gemma desde la línea de comandos, ejecuta

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 Dockerfile con el siguiente contenido

FROM 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 

# Store the model weights in the container image
ENV MODEL gemma2:2b
RUN ollama serve & sleep 5 && ollama pull $MODEL 

# Start Ollama
ENTRYPOINT ["ollama", "serve"]

Crea un repositorio de Artifact Registry para almacenar tus imágenes de 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 contenedor 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 del frontend con Open WebUI.

Usa Docker para desplegar 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 te autentique con Artifact Registry. Esto te permitirá usar Docker para enviar una imagen a un repositorio 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
        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

Implementa en Cloud Run con el siguiente comando.

gcloud beta run services replace service.yaml

Prueba el servicio de Cloud Run

Ahora abre la URL del servicio en tu navegador web.

Una vez que se complete la carga de la IU, en Seleccionar un modelo, elige Gemma 2 2B.

Ahora, hazle una pregunta a Gemma, por ejemplo, "¿Por qué el cielo es azul?"

8. ¡Felicitaciones!

¡Felicitaciones por completar el codelab!

Te recomendamos que revises la documentación sobre funciones de Cloud Run.

Temas abordados

  • Cómo crear un servicio de varios contenedores en Cloud Run
  • Cómo implementar Ollama como un archivo adicional que entrega un modelo 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 de invocación mensual 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 los proyectos en tu SDK de Cloud. Para ver la lista de todos los proyectos disponibles, ejecuta gcloud projects list.