איך להשתמש ב-Olama כתחליף למעבדי GPU Cloud Run ו-Open WebUI כקונטיינר של תעבורת נתונים נכנסת (ingress) בחזית

1. מבוא

סקירה כללית

לאחרונה נוספה ל-Cloud Run תמיכה ב-GPU. התכונה זמינה ב-Public Preview, אבל צריך להירשם לרשימת המתנה כדי להשתמש בה. אם אתם רוצים לנסות את התכונה, אתם יכולים למלא את הטופס הזה כדי להצטרף לרשימת ההמתנה. ‫Cloud Run היא פלטפורמת קונטיינרים ב-Google Cloud שמאפשרת להריץ את הקוד בקונטיינר בקלות, בלי צורך לנהל אשכול.

היום, מעבדי ה-GPU שאנחנו מציעים הם מעבדי Nvidia L4 עם 24GB של vRAM. יש GPU אחד לכל מכונה של Cloud Run, והתכונה 'התאמה אוטומטית לעומס' של Cloud Run עדיין חלה. היא כוללת הרחבה של עד 5 מופעים (עם אפשרות להגדלת המכסה), וגם צמצום של עד אפס מופעים כשאין בקשות.

אחד מתרחישי השימוש במעבדי GPU הוא הפעלה של מודלים גדולים של שפה (LLM) שהם קוד פתוח. במדריך הזה מוסבר איך פורסים שירות שמריץ מודל שפה גדול (LLM).

ב-codelab הזה תפרסו שירות מרובה-קונטיינרים שמשתמש ב-Open WebUI כקונטיינר כניסה של חזית עורפית, ומשתמש ב-Ollama ב-sidecar כדי להפעיל מודל Gemma 2 2B שמאוחסן בקטגוריית Google Cloud Storage.

מה תלמדו

  • איך יוצרים שירות עם כמה קונטיינרים ב-Cloud Run
  • איך פורסים את Ollama כ-sidecar שמריץ מודל Gemma 2 2B
  • איך פורסים את Open WebUI כקונטיינר של שער כניסה לחלק הקדמי של האתר

2. הגדרה של משתני סביבה והפעלת ממשקי API

שדרוג ה-CLI של gcloud

קודם צריך להתקין גרסה עדכנית של gcloud CLI. כדי לעדכן את ה-CLI, מריצים את הפקודה הבאה:

gcloud components update

הגדרה של משתני סביבה

אתם יכולים להגדיר משתני סביבה שישמשו אתכם לאורך כל ה-codelab הזה.

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

הפעלת ממשקי API

לפני שמתחילים להשתמש ב-codelab הזה, צריך להפעיל כמה ממשקי API. ב-codelab הזה נדרש שימוש בממשקי ה-API הבאים. כדי להפעיל את ממשקי ה-API האלה, מריצים את הפקודה הבאה:

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

יוצרים ספרייה בשביל ה-codelab הזה.

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

3. יצירת קטגוריה ב-GCS לאחסון מודל Gemma 2 2B

קודם כול, מתקינים את Ollama כדי להוריד את המודל. המודל יורד לתיקייה ‎ /home/$USER/.ollama/models

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

עכשיו מריצים את ollama באמצעות הפקודה

ollama serve

‫Ollama מתחיל להאזין ביציאה 11434.

פותחים חלון טרמינל שני כדי למשוך את מודל Gemma 2 2B אל

ollama pull gemma2:2b

(אופציונלי) אפשר ליצור אינטראקציה עם Gemma משורת הפקודה על ידי הפעלת

ollama run gemma2:2b

בסיום השיחה עם Gemma, אפשר לצאת על ידי הקלדה של

/bye

4. יצירת קטגוריית אחסון

אחרי שהמודל יורד, אפשר להעביר אותו לדלי GCS.

קודם כול יוצרים את הקטגוריה.

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

עכשיו מעבירים את התיקייה models ל-GCS.

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

5. יצירת תמונת Ollama

יוצרים קובץ Docker עם התוכן הבא

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

יוצרים מאגר ב-Artifact Registry לאחסון תמונות השירות.

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

יצירת קובץ אימג' של ollama sidecar

gcloud builds submit \
   --tag us-central1-docker.pkg.dev/$PROJECT_ID/ollama-sidecar-codelab-repo/ollama-gemma-2b \
   --machine-type e2-highcpu-32

6. יצירת תמונת חזית של Open WebUI

בקטע הזה ניצור את קונטיינר הכניסה של חזית האתר באמצעות Open WebUI.

משתמשים ב-Docker כדי להוריד את תמונת Open WebUI.

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

לאחר מכן מגדירים את Docker כך שישתמש בפרטי הכניסה שלכם ב-Google Cloud כדי לבצע אימות עם Artifact Registry. כך תוכלו להשתמש ב-Docker כדי להעביר בדחיפה תמונה למאגר ב-Artifact Registry.

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

מתייגים את קובץ האימג' ומעבירים אותו בדחיפה ל-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. פריסת שירות מרובה קונטיינרים ב-Cloud Run

שימוש בקובץ yaml לפריסת שירות מרובה-מאגדים

יוצרים קובץ service.yaml עם התוכן הבא.

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

מעדכנים את הקובץ service.yaml כדי להחליף את PROJECT_ID במזהה הפרויקט:

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

מבצעים פריסה ל-Cloud Run באמצעות הפקודה הבאה.

gcloud beta run services replace service.yaml

בדיקת שירות Cloud Run

עכשיו פותחים את כתובת האתר של השירות בדפדפן האינטרנט.

אחרי שהממשק יסיים להיטען, בקטע Select a model (בחירת מודל), בוחרים באפשרות Gemma 2 2B.

עכשיו שואלים את Gemma שאלה, למשל "למה השמיים כחולים?"

‫8. מעולה!

כל הכבוד, סיימתם את ה-Codelab!

מומלץ לעיין במסמכי התיעוד בנושא פונקציות Cloud Run

מה למדנו

  • איך יוצרים שירות עם כמה קונטיינרים ב-Cloud Run
  • איך פורסים את Ollama כ-sidecar שמריץ מודל Gemma 2 2B
  • איך פורסים את Open WebUI כקונטיינר של שער כניסה לחלק הקדמי של האתר

‫9. הסרת המשאבים

כדי להימנע מחיובים לא מכוונים (לדוגמה, אם שירותי Cloud Run מופעלים בטעות יותר פעמים מההקצאה החודשית של הפעלות Cloud Run בתוכנית בחינם), אפשר למחוק את Cloud Run או את הפרויקט שיצרתם בשלב 2.

כדי למחוק את פונקציית Cloud Run, עוברים אל Cloud Run Cloud Console בכתובת https://console.cloud.google.com/run ומוחקים את ollama-sidecar-codelab השירות.

אם אתם רוצים למחוק את הפרויקט כולו, אתם יכולים להיכנס לכתובת https://console.cloud.google.com/cloud-resource-manager, לבחור את הפרויקט שיצרתם בשלב 2 וללחוץ על 'מחיקה'. אם מוחקים את הפרויקט, צריך לשנות את הפרויקט ב-Cloud SDK. כדי לראות את רשימת כל הפרויקטים הזמינים, מריצים את הפקודה gcloud projects list.