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
.