Utilizzare Ollama come file collaterale con GPU Cloud Run e Open WebUI come container in entrata frontend

1. Introduzione

Panoramica

Cloud Run ha recentemente aggiunto il supporto GPU. È disponibile come anteprima pubblica con lista d'attesa. Se ti interessa provare la funzionalità, compila questo modulo per entrare nella lista d'attesa. Cloud Run è una piattaforma di container su Google Cloud che semplifica l'esecuzione del codice in un container, senza richiedere la gestione di un cluster.

Oggi, le GPU che rendiamo disponibili sono le GPU Nvidia L4 con 24 GB di vRAM. C'è una GPU per istanza Cloud Run e la scalabilità automatica di Cloud Run è ancora applicabile. Ciò include lo scale out fino a 5 istanze (con aumento della quota disponibile), nonché lo scale down fino a zero istanze quando non ci sono richieste.

Un caso d'uso delle GPU è l'esecuzione dei tuoi modelli linguistici di grandi dimensioni (LLM) open source. Questo tutorial spiega come eseguire il deployment di un servizio che esegue un LLM.

In questo codelab, eseguirai il deployment di un servizio multi-container che utilizza Open WebUI come container di ingresso frontend e Ollama in un sidecar per gestire un modello Gemma 2 2B archiviato in un bucket Google Cloud Storage.

Cosa imparerai a fare

  • Come creare un servizio con più container in Cloud Run
  • Come eseguire il deployment di Ollama come sidecar che pubblica un modello Gemma 2 2B
  • Come eseguire il deployment di Open WebUI come container di ingresso frontend

2. Imposta le variabili di ambiente e abilita le API

Esegui l'upgrade di gcloud CLI

Innanzitutto, devi avere installato una versione recente di gcloud CLI. Puoi aggiornare la CLI eseguendo il seguente comando:

gcloud components update

Configura le variabili di ambiente

Puoi impostare le variabili di ambiente che verranno utilizzate durante questo codelab.

PROJECT_ID=<YOUR_PROJECT_ID>
REGION=us-central1
gcloud config set project $PROJECT_ID

Abilita API

Prima di poter iniziare a utilizzare questo codelab, devi abilitare diverse API. Questo codelab richiede l'utilizzo delle seguenti API. Puoi abilitare queste API eseguendo il seguente comando:

gcloud services enable run.googleapis.com \
    cloudbuild.googleapis.com \
    storage.googleapis.com \
    artifactregistry.googleapis.com

Crea una directory per questo codelab.

mkdir ollama-sidecar-codelab
cd ollama-sidecar-codelab

3. Crea un bucket GCS per archiviare il modello Gemma 2 2B

Per prima cosa, installa Ollama per scaricare il modello. Il modello verrà scaricato in /home/$USER/.ollama/models

curl -fsSL https://ollama.com/install.sh | sh

Ora esegui ollama eseguendo

ollama serve

Ollama inizia ad ascoltare sulla porta 11434.

Apri una seconda finestra del terminale per scaricare il modello Gemma 2 2B.

ollama pull gemma2:2b

(Facoltativo) Puoi interagire con Gemma dalla riga di comando eseguendo

ollama run gemma2:2b

Al termine della conversazione con Gemma, puoi uscire digitando

/bye

4. Crea un bucket di archiviazione

Ora che il modello è stato scaricato, puoi spostarlo nel bucket GCS.

Per prima cosa, crea il bucket.

gcloud storage buckets create gs://$PROJECT_ID-gemma2-2b-codelab

Ora sposta la cartella dei modelli in GCS.

gsutil cp -r /home/$USER/.ollama/models gs://$PROJECT_ID-gemma2-2b-codelab

5. Crea l'immagine Ollama

Crea un Dockerfile con i seguenti contenuti

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 repository Artifact Registry per archiviare le immagini del servizio.

gcloud artifacts repositories create ollama-sidecar-codelab-repo --repository-format=docker \
    --location=us-central1 --description="Ollama + OpenWebUI website demo" \
    --project=$PROJECT_ID

Crea l'immagine sidecar di 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 l'immagine del frontend Open WebUI

In questa sezione creerai il container di ingresso frontend utilizzando Open WebUI.

Utilizza Docker per eseguire il pull dell'immagine Open WebUI.

docker pull ghcr.io/open-webui/open-webui:main

Poi configura Docker in modo che utilizzi le tue credenziali Google Cloud per l'autenticazione con Artifact Registry. In questo modo potrai utilizzare Docker per eseguire il push di un'immagine in un repository Artifact Registry.

gcloud auth configure-docker us-central1-docker.pkg.dev

Tagga l'immagine ed esegui il push su 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. Esegui il deployment del servizio multiconteiner in Cloud Run

Utilizzare un file YAML per eseguire il deployment del servizio multiconteiner

Crea un file service.yaml con i seguenti contenuti.

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

Aggiorna service.yaml sostituendo PROJECT_ID con il tuo ID progetto:

sed -i "s/YOUR_PROJECT_ID/${PROJECT_ID}/g" service.yaml

Esegui il deployment in Cloud Run utilizzando il comando seguente.

gcloud beta run services replace service.yaml

Testa il servizio Cloud Run

Ora apri l'URL del servizio nel browser web.

Una volta completato il caricamento della UI, scegli Gemma 2 2B in Seleziona un modello.

Ora fai una domanda a Gemma, ad esempio "Perché il cielo è blu?"

8. Complimenti!

Congratulazioni per aver completato il codelab.

Ti consigliamo di consultare la documentazione su Cloud Run Functions.

Argomenti trattati

  • Come creare un servizio con più container in Cloud Run
  • Come eseguire il deployment di Ollama come sidecar che pubblica un modello Gemma 2 2B
  • Come eseguire il deployment di Open WebUI come container di ingresso frontend

9. Esegui la pulizia

Per evitare addebiti involontari (ad esempio, se i servizi Cloud Run vengono richiamati inavvertitamente più volte rispetto all'allocazione mensile di chiamate a Cloud Run nel livello senza costi), puoi eliminare Cloud Run o il progetto che hai creato nel passaggio 2.

Per eliminare la funzione Cloud Run, vai alla console Cloud Run all'indirizzo https://console.cloud.google.com/run ed elimina il servizio ollama-sidecar-codelab.

Se scegli di eliminare l'intero progetto, puoi andare alla pagina https://console.cloud.google.com/cloud-resource-manager, selezionare il progetto che hai creato nel passaggio 2 e scegliere Elimina. Se elimini il progetto, dovrai cambiarlo in Cloud SDK. Puoi visualizzare l'elenco di tutti i progetti disponibili eseguendo gcloud projects list.