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

1. מבוא

סקירה כללית

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

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

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

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

מה תלמדו

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

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

שדרוג ה-CLI של gcloud

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

gcloud components update

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

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

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

הפעלת ממשקי API

לפני שתוכלו להתחיל להשתמש ב-Codelab הזה, יש כמה ממשקי API שתצטרכו להפעיל. כדי להשתמש בקוד הפתוח הזה, צריך להשתמש בממשקי ה-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 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

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

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

5. יצירת קובץ האימג' של Ollama

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

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

יוצרים מאגר ב-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

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

בקטע הזה תיצרו את הקונטיינר של תעבורת הנתונים הנכנסת (ingress) בקצה הקדמי באמצעות 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
        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

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

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

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

8. מעולה!

מזל טוב, השלמת את Codelab!

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

אילו נושאים דיברנו?

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

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

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

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

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