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

Przegląd

Cloud Run niedawno dodał obsługę procesorów graficznych. Jest ona dostępna w ramach publicznej wersji przedpremierowej, do której można dołączyć po zapisaniu się na listę oczekujących. Jeśli chcesz wypróbować tę funkcję, wypełnij ten formularz, aby dołączyć do listy oczekujących. Cloud Run to platforma kontenerowa w Google Cloud, która ułatwia uruchamianie kodu w kontenerze bez konieczności zarządzania klastrem.

Obecnie udostępniamy procesory graficzne Nvidia L4 z 24 GB pamięci vRAM. Na każdą instancję Cloud Run przypada 1 procesor GPU, a autoskalowanie Cloud Run nadal obowiązuje. Obejmuje to skalowanie w górę do 5 instancji (z możliwością zwiększenia limitu) oraz skalowanie w dół do 0 instancji, gdy nie ma żadnych żądań.

Jednym z przypadków użycia procesorów graficznych jest uruchamianie własnych otwartych dużych modeli językowych (LLM). Z tego samouczka dowiesz się, jak wdrożyć usługę, która uruchamia LLM.

W tym laboratorium dowiesz się, jak wdrożyć usługę z wieloma kontenerami, która używa Open WebUI jako kontenera wejściowego frontendu i Ollamy w kontenerze pomocniczym do udostępniania modelu Gemma 2 2B przechowywanego w zasobniku Google Cloud Storage.

Czego się nauczysz

  • Jak utworzyć usługę z wieloma kontenerami w Cloud Run
  • Jak wdrożyć Ollamę jako kontener pomocniczy obsługujący model Gemma 2 2B
  • Jak wdrożyć Open WebUI jako kontener wejściowy frontendu

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

Uaktualnianie gcloud CLI

Najpierw musisz zainstalować najnowszą wersję interfejsu wiersza poleceń gcloud. Aby zaktualizować interfejs wiersza poleceń, uruchom to polecenie:

gcloud components update

Konfigurowanie zmiennych środowiskowych

Możesz ustawić zmienne środowiskowe, których będziesz używać podczas naszych ćwiczeń z programowania.

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

Włącz interfejsy API

Zanim zaczniesz korzystać z tego samouczka, musisz włączyć kilka interfejsów API. W tym samouczku musisz użyć tych 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 dla tego laboratorium.

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

3. Tworzenie zasobnika GCS do przechowywania modelu Gemma 2 2B

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

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

Teraz uruchom Ollamę, wpisując

ollama serve

Ollama zaczyna nasłuchiwać na porcie 11434.

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

ollama pull gemma2:2b

(Opcjonalnie) Możesz korzystać z Gemma z poziomu wiersza poleceń, uruchamiając

ollama run gemma2:2b

Po zakończeniu rozmowy z Gammą możesz wyjść, wpisując

/bye

4. Tworzenie zasobnika Cloud Storage

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

Najpierw utwórz zasobnik.

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

Teraz przenieś folder modeli do GCS.

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

5. Tworzenie obrazu Ollamy

Utwórz plik Dockerfile o tej treści:

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

Utwórz repozytorium Artifact Registry do przechowywania obrazów usług.

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

Tworzenie obrazu kontenera dodatkowego 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 wejściowy frontendu za pomocą Open WebUI.

Użyj Dockera, aby pobrać obraz Open WebUI.

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

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

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

Dodaj tag do obrazu, a następnie przenieś 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 z wieloma kontenerami w Cloud Run

Wdrażanie usługi z wieloma kontenerami za pomocą pliku YAML

Utwórz plik service.yaml o tej 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
        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

Zaktualizuj plik service.yaml, zastępując 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 załadowaniu interfejsu w sekcji Wybierz model kliknij Gemma 2 2B.

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ę z wieloma kontenerami w Cloud Run
  • Jak wdrożyć Ollamę jako kontener pomocniczy obsługujący model Gemma 2 2B
  • Jak wdrożyć Open WebUI jako kontener wejściowy frontendu

9. Czyszczenie danych

Aby uniknąć przypadkowych opłat (np. jeśli usługi Cloud Run zostaną przypadkowo wywołane więcej razy niż miesięczna liczba wywołań Cloud Run w bezpłatnej wersji), możesz usunąć Cloud Run lub projekt utworzony w kroku 2.

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

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