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

1. Introduzione

Panoramica

Di recente, Cloud Run ha aggiunto il supporto per le GPU. È disponibile come anteprima pubblica in lista d'attesa. Se vuoi provare la funzionalità, compila questo modulo per iscriverti alla 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.

Attualmente, le GPU che rendiamo disponibili sono GPU Nvidia L4 con 24 GB di vRAM. È disponibile una GPU per istanza Cloud Run e la scalabilità automatica di Cloud Run continua a essere applicata. Sono inclusi lo scale up fino a 5 istanze (con aumento della quota disponibile) e lo scale down fino a zero istanze quando non ci sono richieste.

Un caso d'uso delle GPU è l'esecuzione di modelli linguistici di grandi dimensioni (LLM) aperti. Questo tutorial illustra la procedura di deployment di un servizio che esegue un modello LLM.

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

Cosa imparerai a fare

  • Creare un servizio di 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 contenitore di ingresso frontend

2. Imposta le variabili di ambiente e abilita le API

Eseguire l'upgrade dell'interfaccia a riga di comando gcloud

Innanzitutto, devi installare una versione recente di gcloud CLI. Puoi aggiornare l'interfaccia a riga di comando 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

Innanzitutto, dovrai installare 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 a rimanere in ascolto sulla porta 11434.

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

ollama pull gemma2:2b

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

ollama run gemma2:2b

Quando hai finito di chattare con Gemma, puoi uscire digitando

/bye

4. Crea un bucket di archiviazione

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

Per prima cosa, crea il bucket.

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

Ora sposta la cartella dei modelli su GCS.

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

5. Crea l'immagine di Ollama

Crea un file Dockerfile con i seguenti contenuti

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 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 in entrata frontend utilizzando Open WebUI.

Utilizza Docker per scaricare l'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 autenticarsi con Artifact Registry. In questo modo potrai utilizzare Docker per eseguire il push di un'immagine a un repository Artifact Registry.

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

Aggiungi un tag all'immagine ed esegui il push ad 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 multi-container in Cloud Run

Utilizza un file YAML per eseguire il deployment del servizio multi-container

Crea un 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
        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 per sostituire 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 seguente comando.

gcloud beta run services replace service.yaml

Testare il servizio Cloud Run

Ora apri l'URL del servizio nel browser web.

Al termine del caricamento dell'interfaccia utente, seleziona Gemma 2 2B in Seleziona un modello.

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

8. Complimenti!

Complimenti per aver completato il codelab.

Ti consigliamo di consultare la documentazione sulle funzioni Cloud Run.

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
  • Eseguire il deployment di Open WebUI come container in entrata frontend

9. Esegui la pulizia

Per evitare addebiti involontari, ad esempio se i servizi Cloud Run vengono invocati inavvertitamente più volte rispetto all'allocazione mensile di invocazioni Cloud Run nel livello senza costi, puoi eliminare Cloud Run o il progetto 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 all'indirizzo 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 modificare i progetti nel tuo Cloud SDK. Puoi visualizzare l'elenco di tutti i progetti disponibili eseguendo gcloud projects list.