הפעלת הסקה באמצעות מודל Gemma ב-Cloud Run עם RTX 6000 Pro GPU

1. מבוא

סקירה כללית

מה תלמדו

  • איך פורסים מודל Gemma ב-GPU מסוג Cloud Run RTX 6000 Pro
  • איך מורידים מודל מ-Cloud Storage במקביל במהלך הפעלת הקונטיינר

2. הגדרה ודרישות

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

export PROJECT_ID=<YOUR_PROJECT_ID>

export REGION=europe-west4
export SERVICE_NAME=gemma-rtx-codelab

# set the project
gcloud config set project $PROJECT_ID

הפעלת ממשקי API שנדרשים ל-Codelab הזה

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

יצירת תיקייה ל-codelab

mkdir codelab-rtx
cd codelab-rtx

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

gcloud compute networks subnets update default \
  --region=europe-west4 \
  --enable-private-ip-google-access

3. הגדרת Cloud Storage

קודם יוצרים קטגוריה של Cloud Storage לאחסון משקלי המודל.

יצירת קטגוריה ייחודית

# Generate a unique bucket name
export MODEL_BUCKET="${PROJECT_ID}-rtx-codelab-$(python3 -c 'import uuid; print(str(uuid.uuid4())[:8])')"
echo "Bucket name: $MODEL_BUCKET"

# Create the regional bucket
gcloud storage buckets create gs://$MODEL_BUCKET \
    --location=$REGION \
    --uniform-bucket-level-access

4. אחזור משקלים של מודלים

לאחר מכן, מורידים את מודל Gemma 3 לספרייה מקומית ומעלים אותו לקטגוריה של Cloud Storage.

התקנת Ollama

אפשר להריץ את הפקודה הזו כדי להתקין את Ollama:

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

הורדת מודל

יוצרים ספרייה למודל שהורד.

mkdir model-weights

בתהליך הזה תשתמשו בשני כרטיסיות של טרמינל: אחת להפעלת שרת Ollama וטרמינל נוסף לאחזור המודל.

טרמינל 1 (שרת):

מפעילים את השרת על ידי העברת המיקום של המודל שהורד. הפקודה הזו תמשיך לפעול.

OLLAMA_MODELS=$(pwd)/model-weights ollama serve

Terminal 2 (Client): פותחים כרטיסיית טרמינל חדשה ומורידים את המודל. הלקוח מתקשר אוטומטית עם השרת הפועל.

# note if you wish to use a larger model, you can change this to gemma3:27b
ollama pull gemma3:1b

בחזרה בטרמינל 1: אחרי שההורדה בטרמינל 2 מסתיימת, חוזרים לטרמינל 1 ומקישים על Ctrl+C כדי לעצור את השרת.

העלאה ל-Cloud Storage

עכשיו מעלים את המשקלים לקטגוריה. ‫gcloud storage מטפל אוטומטית בהעלאות מקבילות כדי להאיץ את התהליך.

gcloud storage cp -r ./model-weights/* gs://$MODEL_BUCKET/

(אופציונלי) ניקוי משקלים מקומיים

עכשיו שהמודל נמצא ב-Cloud Storage, צריך להסיר את העותק המקומי.

rm -rf model-weights

5. יצירת השירות

קודם יוצרים תיקייה לשירות.

mkdir rtx-service
cd rtx-service

יצירת Dockerfile עם התוכן הבא

FROM ollama/ollama:latest

# Install Google Cloud CLI
RUN apt-get update && apt-get install -y curl gnupg && \
    echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] http://packages.cloud.google.com/apt cloud-sdk main" | tee -a /etc/apt/sources.list.d/google-cloud-sdk.list && \
    curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key --keyring /usr/share/keyrings/cloud.google.gpg add - && \
    apt-get update && apt-get install -y google-cloud-cli && \
    apt-get clean && rm -rf /var/lib/apt/lists/*

# 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

# Copy and set up the startup script
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh

# Start using the entrypoint script
ENTRYPOINT ["/entrypoint.sh"]

יוצרים קובץ בשם entrypoint.sh עם התוכן הבא:

#!/bin/bash
set -e

# Ensure OLLAMA_MODELS directory exists
mkdir -p $OLLAMA_MODELS

# Download model weights from GCS if MODEL_BUCKET is set
if [ -n "$MODEL_BUCKET" ]; then
  echo "Downloading model weights from gs://$MODEL_BUCKET..."
  # gcloud storage handles concurrent downloads automatically
  gcloud storage cp -r "gs://$MODEL_BUCKET/*" "$OLLAMA_MODELS/"
else
  echo "MODEL_BUCKET not set. Skipping download."
fi

# Start Ollama
exec ollama serve

6. פריסה ב-Cloud Run

בקטע הזה נסביר איך פורסים את השירות באמצעות gcloud run deploy. הפקודה הזו תיצור את הקונטיינר מהמקור ותפרוס אותו ב-Cloud Run עם ההגדרות הנדרשות של GPU ורשת.

יצירת חשבון שירות

יוצרים חשבון שירות ייעודי לאפליקציה הזו ומעניקים לו רק את ההרשאות הנדרשות.

# Create a dedicated service account
gcloud iam service-accounts create rtx-codelab-identity \
    --display-name="RTX Codelab Identity"

# Grant permission to read from the model bucket
gcloud storage buckets add-iam-policy-binding gs://$MODEL_BUCKET \
    --member="serviceAccount:rtx-codelab-identity@$PROJECT_ID.iam.gserviceaccount.com" \
    --role="roles/storage.objectViewer"

# Grant access to the Compute Engine network for the Cloud Run service identity
gcloud projects add-iam-policy-binding $PROJECT_ID \
     --member="serviceAccount:rtx-codelab-identity@$PROJECT_ID.iam.gserviceaccount.com" \
     --role="roles/compute.networkUser"

# Grant access to the Compute Engine network for the default service account
gcloud projects add-iam-policy-binding $PROJECT_ID \
 --member="serviceAccount:service-$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')@serverless-robot-prod.iam.gserviceaccount.com" \
 --role="roles/compute.networkUser"

הגדרת רשת

כדי להשיג ביצועים אופטימליים כשמורידים מודלים גדולים, מומלץ להשתמש ביציאה ישירה מ-VPC. כך המאגר יכול לגשת ל-Cloud Storage דרך הרשת הפרטית של Google, בלי לעבור דרך האינטרנט הציבורי ושערי NAT. הדגלים הבאים משמשים בפקודה gcloud run deploy:

  • --network: מתחבר ל-VPC (צריך לוודא שהרשת הזו קיימת ושיש לה תת-רשת באזור שלכם עם גישה פרטית ל-Google).default
  • --subnet: תת-הרשת הספציפית באזור (בדרך כלל default אם משתמשים ברשת שמוגדרת כברירת מחדל).
  • --vpc-egress: מגדירים את הערך all-traffic כדי לאלץ את כל תעבורת היציאה לעבור דרך ה-VPC.

פקודת פריסה

gcloud beta run deploy $SERVICE_NAME \
    --source . \
    --region $REGION \
    --project $PROJECT_ID \
    --no-allow-unauthenticated \
    --port 11434 \
    --service-account rtx-codelab-identity@$PROJECT_ID.iam.gserviceaccount.com \
    --cpu 20 --memory 80Gi \
    --gpu 1 \
    --gpu-type nvidia-rtx-pro-6000 \
    --set-env-vars MODEL_BUCKET=$MODEL_BUCKET \
    --network default \
    --subnet default \
    --vpc-egress all-traffic \
    --no-gpu-zonal-redundancy

7. בדיקת השירות

אחרי הפריסה, אפשר לקיים אינטראקציה עם מודל Gemma 3 באמצעות Ollama API.

קבלת כתובת URL של שירות

מאחזרים את כתובת ה-URL של שירות Cloud Run שפרסתם.

SERVICE_URL=$(gcloud run services describe $SERVICE_NAME --region $REGION --format 'value(status.url)')
echo "Service URL: $SERVICE_URL"

הרצת הסקה

שולחים הנחיה למודל באמצעות curl. אפשר להגדיר את "stream": false כדי לקבל את התגובה המלאה כאובייקט JSON יחיד, ולהשתמש ב-jq כדי לחלץ רק את הטקסט.

הערה: אם אתם משתמשים במודל גדול יותר, למשל gemma3:27b, תצטרכו לשנות את שם המודל בקובץ ה-JSON שבהמשך.

curl -s "$SERVICE_URL/api/generate" \
  -H "Authorization: Bearer $(gcloud auth print-identity-token)" \
  -H "Content-Type: application/json" \
  -d '{
  "model": "gemma3:1b",
  "prompt": "Why is the sky blue?",
  "stream": false
}' | jq -r '.response'

8. מעולה!

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

מומלץ לעיין במסמכי התיעוד של Cloud Run.

מה נכלל

  • איך פורסים מודל Gemma ב-GPU מסוג Cloud Run RTX 6000 Pro
  • איך מורידים מודל מ-Cloud Storage במקביל במהלך הפעלת הקונטיינר

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

כדי להימנע מחיובים בחשבון Google Cloud בגלל השימוש במשאבים שנעשה במסגרת המדריך הזה, אפשר למחוק את הפרויקט או למחוק את המשאבים הספציפיים.

אפשרות 1: מחיקת משאבים

מחיקת שירות Cloud Run

gcloud run services delete $SERVICE_NAME \
      --region $REGION \
      --quiet

מחיקת חשבון השירות

gcloud iam service-accounts delete \
      rtx-codelab-identity@$PROJECT_ID.iam.gserviceaccount.com \
      --quiet

מחיקת הקטגוריה של Cloud Storage

gcloud storage rm --recursive gs://$MODEL_BUCKET

מחיקת תמונת הקונטיינר

גרסת ה-build הזו יצרה קובץ אימג' של קונטיינר ב-Artifact Registry. אפשר למצוא את שם התמונה ולמחוק אותה.

מציגים את רשימת התמונות כדי למצוא את השם המדויק (בדרך כלל gcr.io/PROJECT_ID/SERVICE_NAME)

gcloud container images list --filter="name:$SERVICE_NAME"

מוחקים את התמונה (מחליפים את IMAGE_NAME בתוצאה מהשלב הקודם)

gcloud container images delete <IMAGE_NAME> --force-delete-tags

אפשרות 2: מחיקת הפרויקט

כדי למחוק את הפרויקט כולו, עוברים אל Manage Resources (ניהול משאבים), בוחרים את הפרויקט שיצרתם בשלב 2 ולוחצים על Delete (מחיקה). אם תמחקו את הפרויקט, תצטרכו לשנות את הפרויקטים ב-Cloud SDK. כדי לראות את רשימת כל הפרויקטים הזמינים, מריצים את הפקודה gcloud projects list.