Jak używać narzędzia Ollama jako aplikacji pomocniczej z procesorami graficznymi Cloud Run i z Open WebUI jako kontenerem ruchu przychodzącego frontendu

1. Wprowadzenie

Omówienie

Cloud Run niedawno dodał obsługę karty graficznej. Jest ona dostępna w ramach publicznej wersji przedpremierowej na liście oczekujących. Jeśli chcesz wypróbować tę funkcję, wypełnij ten formularz, aby wpisać się na listę oczekujących. Cloud Run to platforma kontenerów w Google Cloud, która ułatwia uruchamianie kodu w kontenerze bez konieczności zarządzania klastrem.

Obecnie dostępne są procesory graficzne Nvidia L4 z 24 GB pamięci RAM. Na każdą instancję Cloud Run przypada 1 GPU, a automatyczne skalowanie Cloud Run nadal działa. Obejmuje to skalowanie do 5 instancji (z możliwością zwiększenia limitu) oraz skalowanie w dół do zera, gdy nie ma żądań.

Jednym z zastosowań kart graficznych jest uruchamianie własnych dużych modeli językowych (LLM). Ten samouczek przedstawia proces wdrażania usługi obsługującej LLM.

W tym laboratorium kodu wdrożysz usługę wielokontenerową, która używa Open WebUI jako kontenera wejściowego frontendu i używa Ollama w kontenerze pobocznym, aby udostępnić model Gemma 2 2B przechowywany w zasobniku Google Cloud Storage.

Czego się nauczysz

  • Jak utworzyć usługę z wieloma kontenerami w Cloud Run
  • Jak wdrożyć Ollama jako model pomocniczy do modelu Gemma 2 2B
  • Jak wdrożyć Open WebUI jako kontener ruchu przychodzącego frontendu

2. Ustawianie zmiennych środowiskowych i Włączanie interfejsów API

Uaktualnij interfejs wiersza poleceń gcloud

Najpierw musisz mieć zainstalowaną najnowszą wersję interfejsu wiersza poleceń gcloud. Interfejs wiersza poleceń możesz zaktualizować, uruchamiając to polecenie:

gcloud components update

Konfigurowanie zmiennych środowiskowych

Możesz ustawić zmienne środowiskowe, których będziesz używać w tym ćwiczeniu.

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

Włącz interfejsy API

Zanim zaczniesz korzystać z tego ćwiczenia, musisz włączyć kilka interfejsów API. To ćwiczenie w Codelabs wymaga używania poniższych interfejsów API. Możesz włączyć te interfejsy API, uruchamiając to polecenie:

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

Utwórz katalog na potrzeby tego ćwiczenia w Codelabs.

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

3. Utwórz zasobnik GCS do przechowywania modelu Gemma 2 2B

Najpierw zainstaluj Ollama, aby pobrać model. Spowoduje to pobranie modelu do katalogu /home/$USER/.ollama/models.

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

Teraz uruchom ollama przez uruchomienie

ollama serve

Ollama zaczyna nasłuchiwać na porcie 11434.

Otwórz drugie okno terminala, aby pobrać model Gemma 2 2B.

ollama pull gemma2:2b

(Opcjonalnie) Możesz użyć Gemma w wierszu poleceń, uruchamiając polecenie

ollama run gemma2:2b

Gdy skończysz rozmawiać z Gemini, możesz zamknąć czat, wpisując

/bye

4. Tworzenie zasobnika na dane

Po pobraniu modelu możesz go przenieść do zasobnika GCS.

Najpierw utwórz zasób.

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

Teraz przenieś folder models do GCS.

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

5. Utwórz obraz Ollama

Utwórz plik dockerfile o następującej zawartości

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"]

Utwórz repozytorium Artifact Registry, aby przechowywać obrazy usługi.

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

Utwórz obraz pomocniczy 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. Tworzenie obrazu frontendu Open WebUI

W tej sekcji utworzysz kontener ruchu przychodzącego frontendu za pomocą Open WebUI.

Użyj Dockera, aby ściągnąć obraz Open WebUI.

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

Następnie skonfiguruj Dockera tak, aby używał Twoich danych logowania do Google Cloud do uwierzytelniania w Artifact Registry. Dzięki temu możesz użyć Dockera do przesłania obrazu do repozytorium Artifact Registry.

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

Dodaj tag do obrazu, a następnie prześlij go do 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. Wdrażanie usługi obsługi wielu kontenerów w Cloud Run

Wdróż usługę obsługi wielu kontenerów za pomocą pliku yaml

Utwórz service.yaml o poniższej zawartości.

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

Zaktualizuj plik service.yaml, zastępując parametr PROJECT_ID identyfikatorem projektu:

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

Wdróż w Cloud Run za pomocą tego polecenia.

gcloud beta run services replace service.yaml

Testowanie usługi Cloud Run

Teraz otwórz adres URL usługi w przeglądarce.

Po zakończeniu wczytywania interfejsu w sekcji Wybierz model wybierz Gemma 2 2B.

Teraz zadaj Gemmie pytanie, np. „Dlaczego niebo jest niebieskie?”

8. Gratulacje!

Gratulujemy ukończenia ćwiczenia.

Zalecamy zapoznanie się z dokumentacją dotyczącą funkcji Cloud Run.

Omówione zagadnienia

  • Jak utworzyć usługę wielu kontenerów w Cloud Run
  • Jak wdrożyć Ollama jako model pomocniczy do modelu Gemma 2 2B
  • Jak wdrożyć Open WebUI jako kontener ruchu przychodzącego frontendu

9. Czyszczenie danych

Aby uniknąć niezamierzonych opłat (na przykład jeśli usługi Cloud Run zostaną nieumyślnie wywoływane więcej razy niż miesięczny przydział wywołań Cloud Run na poziomie bezpłatnym), możesz usunąć Cloud Run albo projekt utworzony w kroku 2.

Aby usunąć funkcję Cloud Run, otwórz konsolę Cloud Run na stronie https://console.cloud.google.com/run i usuń usługę ollama-sidecar-codelab.

Jeśli zdecydujesz się usunąć cały projekt, możesz otworzyć stronę https://console.cloud.google.com/cloud-resource-manager, wybrać projekt utworzony w kroku 2 i kliknąć Usuń. Jeśli usuniesz projekt, musisz zmienić projekty w pakiecie SDK Cloud. Aby wyświetlić listę wszystkich dostępnych projektów, uruchom polecenie gcloud projects list.