במאמר הזה מוסבר איך לפרוס מודלים פתוחים של Google DeepMind, באופן ספציפי את משפחת Gemma 4, באמצעות Ollama בסביבות GDC עם air gap. המדריך כולל הסברים על השימוש ב-Ollama להגשה פשוטה, תוך שימוש ביכולות של פלטפורמת GDC, כולל משאבי Kubernetes, Harbor ו-GPU. בקטע Model, בוחרים את המודל ואת אפשרות ה-GPU. כל שאר השלבים זהים לכל המודלים.
מודלים נתמכים
| דגם | תג Ollama | פרמטרים | רישיון | אפשרויות GPU |
|---|---|---|---|---|
| Gemma 4 E2B | gemma4:e2b |
5.1 מיליארד (2 מיליארד בפועל) | התנאים וההגבלות של Gemma | 1 x כל GPU |
| Gemma 4 E4B | gemma4:e4b |
8 מיליארד (4 מיליארד בפועל) | התנאים וההגבלות של Gemma | 1 x כל GPU |
| Gemma 4 12B | gemma4:12b |
12B (דחוס) | התנאים וההגבלות של Gemma | 1 x כל GPU |
| Gemma 4 26B-A4B | gemma4:26b |
25.8 מיליארד בסך הכול / 4 מיליארד פעילים (שילוב מומחים) | התנאים וההגבלות של Gemma | 1 x כל GPU |
| Gemma 4 31B | gemma4:31b |
31.3B (דחוס) | התנאים וההגבלות של Gemma | 1 x כל GPU |
ארכיטקטורה
הפתרון כולל פריסה של Ollama כ-backend להצגת מודלים בקונטיינר (Deployment) בתוך אשכול רגיל. משקלי המודל מאוחסנים ב-Persistent Volumes, שמאוכלסים מקבצים שהורדו באופן מקומי והועלו באמצעות pod של טעינה. Service של Kubernetes מסוג LoadBalancer חושף את ה-API לקצה העורפי, ואובייקטים של NetworkPolicy או ProjectNetworkPolicy מאבטחים את הגישה אליו.
לפני שמתחילים
משלימים את הטמעת העזר של מודלים פתוחים עם Ollama בתחנת העבודה, ומוודאים שיש לכם גישה לספרייה ${HOME}/gdcag-solutions.
ניהול זהויות והרשאות גישה
במדריך הזה אנחנו יוצאים מנקודת הנחה שיש לכם את התפקידים הבאים באשכול הרגיל:
- אופציונלי: אדמין רגיל של אשכול (הצגת אשכולות מהמסוף)
- אדמין של אשכול רגיל (
standard-cluster-admin) StandardClusterRoleBindingאלStandardClusterRolecluster-admin(נוצר על ידי אדמין IAM של פרויקט, ראו את הקטע ניהול זהויות והרשאות גישה בהטמעת העזר)
תחנת עבודה
אלא אם צוין אחרת, צריך להריץ את כל הפקודות במדריך הזה מתחנת עבודה עם הכלים הנדרשים וקישוריות לסביבה ולאינטרנט.
הגדרת הסביבה היא שכבתית:
-
${HOME}/gdcag-solutions/env.shטוען את הגדרות הפלטפורמה והמרשם.
${HOME}/gdcag-solutions/open-weight-models/ollama/env.shמוסיף את ההגדרות של Ollama.במדריך למשתמש הזה נוספים
env.d/model.sh(המודל) ו-env.d/accelerator.sh(האפשרות של ה-GPU והגדרות זמן הריצה), שאתם כותבים בקטע Model, ו-env.d/model-common.sh(הערכים שנגזרים מהם).
יוצרים את מבנה הספרייה של המדריך למשתמש:
mkdir -p ${HOME}/gdcag-solutions/open-weight-models/ollama/gemma/env.dיוצרים את קובץ התצורה של סביבת המודל הנפוצה. הוא מחשב את השמות והנתיבים שנגזרים משם המודל:
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/ollama/gemma/env.d/model-common.sh && echo "Successfully created." || echo "Failed to create!" # Model (derived from env.d/model.sh) export GDCS_OLLAMA_MODEL_LOWERCASE="${GDCS_OLLAMA_MODEL,,}" export GDCS_OLLAMA_MODEL_KUBERNETES="$(echo "${GDCS_OLLAMA_MODEL_LOWERCASE}" | tr ':' '-')" # Paths export GDCS_OLLAMA_MODEL_DOWNLOAD_DIR="${GDCS_USER_GUIDE_HOME}/models/${GDCS_OLLAMA_MODEL_LOWERCASE}" export GDCS_OLLAMA_PV_MOUNT_PATH="/root/.ollama/models" # Workload export GDCS_WORKLOAD_NAMESPACE="ollama-gemma" export GDCS_WORKLOAD_NAME="${GDCS_OLLAMA_MODEL_KUBERNETES}" export GDCS_MODEL_LOADER_POD_NAME="loader-${GDCS_OLLAMA_MODEL_KUBERNETES}" EOFיוצרים את קובץ טעינת הסביבה של המדריך למשתמש. הוא מקור לסביבת הבסיס, לסביבת ההטמעה ולסביבת המודל:
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/ollama/gemma/env.sh && echo "Successfully created." || echo "Failed to create!" source "${HOME}/gdcag-solutions/open-weight-models/ollama/env.sh" export GDCS_USER_GUIDE_HOME="${HOME}/gdcag-solutions/open-weight-models/ollama/gemma" echo "GDCS_USER_GUIDE_HOME=${GDCS_USER_GUIDE_HOME}" # Sourced in dependency order: the model selection, the accelerator and runtime settings, then the values derived from them source "${GDCS_USER_GUIDE_HOME}/env.d/model.sh" source "${GDCS_USER_GUIDE_HOME}/env.d/accelerator.sh" source "${GDCS_USER_GUIDE_HOME}/env.d/model-common.sh" EOF
דגם
בכל כרטיסייה מפורטים נתוני המודל, הפקודה שכותבת את קובץ הסביבה של המודל env.d/model.sh, וכרטיסיות בתצוגת עץ שכותבות את קובץ הסביבה של המאיץ env.d/accelerator.sh לאפשרות ה-GPU שבחרתם עם סוגי משאבים והגדרות Ollama במילוי אוטומטי מראש. כדי להחליף מודלים או אפשרויות GPU בהמשך, כותבים קובצי סביבה שונים, מגדירים שוב את הסביבה וחוזרים על הקטע "הטמעה". עומסי העבודה של כמה מודלים יכולים לפעול זה לצד זה באותו מרחב שמות, כי כל שם משאב נגזר משם המודל.
| GPU | זיכרון | סוגי מכונות | סוג המשאב של המאיץ |
|---|---|---|---|
| NVIDIA A100 | 40 GB | a2-highgpu-1g-gdc |
nvidia.com/gpu-pod-NVIDIA_A100_PCIE_40GB |
| NVIDIA A100 | 80 GB | a2-ultragpu-1g-gdc, a2-ultragpu-2g-gdc |
nvidia.com/gpu-pod-NVIDIA_A100_80GB_PCIE |
| NVIDIA H100 | 94 GB | a3-highgpu-1g-gdc (גרסת טרום-השקה), a3-highgpu-2g-gdc (גרסת טרום-השקה), a3-highgpu-4g-gdc |
nvidia.com/gpu-pod-NVIDIA_H100_NVL |
| NVIDIA H200 | 141GB | a3-ultragpu-8g-gdc |
nvidia.com/gpu-pod-NVIDIA_H200 |
| NVIDIA B300 | 288 GB | a4-ultragpu-8g-gdc |
nvidia.com/gpu-pod-NVIDIA_B300_SXM6_AC |
- יוצרים את קובצי הסביבה של המודל ושל המאיץ בשביל המודל ואפשרות ה-GPU שרוצים לפרוס.
Gemma 4 E2B
| מאפיין | ערך |
|---|---|
| תג Ollama | gemma4:e2b |
| פרמטרים | 5.1 מיליארד (2 מיליארד בפועל) |
| רישיון | התנאים וההגבלות של Gemma |
| משקלים | קוונטיזציה כברירת מחדל של Ollama, בערך 4.6GB |
| חלון ההקשר | 128K טוקנים |
יוצרים את קובץ הסביבה של המודל:
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/ollama/gemma/env.d/model.sh && echo "Successfully created." || echo "Failed to create!"
# Model: Gemma 4 E2B
export GDCS_OLLAMA_MODEL="gemma4:e2b"
EOF
יוצרים את קובץ סביבת המאיץ לאפשרות ה-GPU:
NVIDIA A100 40 GB
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/ollama/gemma/env.d/accelerator.sh && echo "Successfully created." || echo "Failed to create!"
# Accelerator: NVIDIA A100 40 GB
export GDCS_WORKLOAD_ACCELERATOR_TYPE="nvidia.com/gpu-pod-NVIDIA_A100_PCIE_40GB"
export GDCS_WORKLOAD_ACCELERATOR_COUNT="1"
# Resources
export GDCS_WORKLOAD_CPU_LIMIT="4"
export GDCS_WORKLOAD_CPU_REQUEST="2"
export GDCS_WORKLOAD_MEMORY_LIMIT="12Gi"
export GDCS_WORKLOAD_MEMORY_REQUEST="6Gi"
# Ollama
export GDCS_OLLAMA_NUM_PARALLEL="4"
export GDCS_OLLAMA_TEST_NUM_PREDICT="128"
EOF
NVIDIA A100 80 GB
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/ollama/gemma/env.d/accelerator.sh && echo "Successfully created." || echo "Failed to create!"
# Accelerator: NVIDIA A100 80 GB
export GDCS_WORKLOAD_ACCELERATOR_TYPE="nvidia.com/gpu-pod-NVIDIA_A100_80GB_PCIE"
export GDCS_WORKLOAD_ACCELERATOR_COUNT="1"
# Resources
export GDCS_WORKLOAD_CPU_LIMIT="4"
export GDCS_WORKLOAD_CPU_REQUEST="2"
export GDCS_WORKLOAD_MEMORY_LIMIT="12Gi"
export GDCS_WORKLOAD_MEMORY_REQUEST="6Gi"
# Ollama
export GDCS_OLLAMA_NUM_PARALLEL="4"
export GDCS_OLLAMA_TEST_NUM_PREDICT="128"
EOF
NVIDIA H100 94 GB
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/ollama/gemma/env.d/accelerator.sh && echo "Successfully created." || echo "Failed to create!"
# Accelerator: NVIDIA H100 94 GB
export GDCS_WORKLOAD_ACCELERATOR_TYPE="nvidia.com/gpu-pod-NVIDIA_H100_NVL"
export GDCS_WORKLOAD_ACCELERATOR_COUNT="1"
# Resources
export GDCS_WORKLOAD_CPU_LIMIT="4"
export GDCS_WORKLOAD_CPU_REQUEST="2"
export GDCS_WORKLOAD_MEMORY_LIMIT="12Gi"
export GDCS_WORKLOAD_MEMORY_REQUEST="6Gi"
# Ollama
export GDCS_OLLAMA_NUM_PARALLEL="4"
export GDCS_OLLAMA_TEST_NUM_PREDICT="128"
EOF
NVIDIA H200 141 GB
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/ollama/gemma/env.d/accelerator.sh && echo "Successfully created." || echo "Failed to create!"
# Accelerator: NVIDIA H200 141 GB
export GDCS_WORKLOAD_ACCELERATOR_TYPE="nvidia.com/gpu-pod-NVIDIA_H200"
export GDCS_WORKLOAD_ACCELERATOR_COUNT="1"
# Resources
export GDCS_WORKLOAD_CPU_LIMIT="4"
export GDCS_WORKLOAD_CPU_REQUEST="2"
export GDCS_WORKLOAD_MEMORY_LIMIT="12Gi"
export GDCS_WORKLOAD_MEMORY_REQUEST="6Gi"
# Ollama
export GDCS_OLLAMA_NUM_PARALLEL="4"
export GDCS_OLLAMA_TEST_NUM_PREDICT="128"
EOF
NVIDIA B300 288 GB
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/ollama/gemma/env.d/accelerator.sh && echo "Successfully created." || echo "Failed to create!"
# Accelerator: NVIDIA B300 288 GB
export GDCS_WORKLOAD_ACCELERATOR_TYPE="nvidia.com/gpu-pod-NVIDIA_B300_SXM6_AC"
export GDCS_WORKLOAD_ACCELERATOR_COUNT="1"
# Resources
export GDCS_WORKLOAD_CPU_LIMIT="4"
export GDCS_WORKLOAD_CPU_REQUEST="2"
export GDCS_WORKLOAD_MEMORY_LIMIT="12Gi"
export GDCS_WORKLOAD_MEMORY_REQUEST="6Gi"
# Ollama
export GDCS_OLLAMA_NUM_PARALLEL="4"
export GDCS_OLLAMA_TEST_NUM_PREDICT="128"
EOF
Gemma 4 E4B
| מאפיין | ערך |
|---|---|
| תג Ollama | gemma4:e4b |
| פרמטרים | 8 מיליארד (4 מיליארד בפועל) |
| רישיון | התנאים וההגבלות של Gemma |
| משקלים | Ollama default quantization, about 6.6 GB |
| חלון ההקשר | 128K טוקנים |
יוצרים את קובץ הסביבה של המודל:
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/ollama/gemma/env.d/model.sh && echo "Successfully created." || echo "Failed to create!"
# Model: Gemma 4 E4B
export GDCS_OLLAMA_MODEL="gemma4:e4b"
EOF
יוצרים את קובץ סביבת המאיץ לאפשרות ה-GPU:
NVIDIA A100 40 GB
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/ollama/gemma/env.d/accelerator.sh && echo "Successfully created." || echo "Failed to create!"
# Accelerator: NVIDIA A100 40 GB
export GDCS_WORKLOAD_ACCELERATOR_TYPE="nvidia.com/gpu-pod-NVIDIA_A100_PCIE_40GB"
export GDCS_WORKLOAD_ACCELERATOR_COUNT="1"
# Resources
export GDCS_WORKLOAD_CPU_LIMIT="4"
export GDCS_WORKLOAD_CPU_REQUEST="2"
export GDCS_WORKLOAD_MEMORY_LIMIT="16Gi"
export GDCS_WORKLOAD_MEMORY_REQUEST="8Gi"
# Ollama
export GDCS_OLLAMA_NUM_PARALLEL="4"
export GDCS_OLLAMA_TEST_NUM_PREDICT="128"
EOF
NVIDIA A100 80 GB
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/ollama/gemma/env.d/accelerator.sh && echo "Successfully created." || echo "Failed to create!"
# Accelerator: NVIDIA A100 80 GB
export GDCS_WORKLOAD_ACCELERATOR_TYPE="nvidia.com/gpu-pod-NVIDIA_A100_80GB_PCIE"
export GDCS_WORKLOAD_ACCELERATOR_COUNT="1"
# Resources
export GDCS_WORKLOAD_CPU_LIMIT="4"
export GDCS_WORKLOAD_CPU_REQUEST="2"
export GDCS_WORKLOAD_MEMORY_LIMIT="16Gi"
export GDCS_WORKLOAD_MEMORY_REQUEST="8Gi"
# Ollama
export GDCS_OLLAMA_NUM_PARALLEL="4"
export GDCS_OLLAMA_TEST_NUM_PREDICT="128"
EOF
NVIDIA H100 94 GB
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/ollama/gemma/env.d/accelerator.sh && echo "Successfully created." || echo "Failed to create!"
# Accelerator: NVIDIA H100 94 GB
export GDCS_WORKLOAD_ACCELERATOR_TYPE="nvidia.com/gpu-pod-NVIDIA_H100_NVL"
export GDCS_WORKLOAD_ACCELERATOR_COUNT="1"
# Resources
export GDCS_WORKLOAD_CPU_LIMIT="4"
export GDCS_WORKLOAD_CPU_REQUEST="2"
export GDCS_WORKLOAD_MEMORY_LIMIT="16Gi"
export GDCS_WORKLOAD_MEMORY_REQUEST="8Gi"
# Ollama
export GDCS_OLLAMA_NUM_PARALLEL="4"
export GDCS_OLLAMA_TEST_NUM_PREDICT="128"
EOF
NVIDIA H200 141 GB
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/ollama/gemma/env.d/accelerator.sh && echo "Successfully created." || echo "Failed to create!"
# Accelerator: NVIDIA H200 141 GB
export GDCS_WORKLOAD_ACCELERATOR_TYPE="nvidia.com/gpu-pod-NVIDIA_H200"
export GDCS_WORKLOAD_ACCELERATOR_COUNT="1"
# Resources
export GDCS_WORKLOAD_CPU_LIMIT="4"
export GDCS_WORKLOAD_CPU_REQUEST="2"
export GDCS_WORKLOAD_MEMORY_LIMIT="16Gi"
export GDCS_WORKLOAD_MEMORY_REQUEST="8Gi"
# Ollama
export GDCS_OLLAMA_NUM_PARALLEL="4"
export GDCS_OLLAMA_TEST_NUM_PREDICT="128"
EOF
NVIDIA B300 288 GB
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/ollama/gemma/env.d/accelerator.sh && echo "Successfully created." || echo "Failed to create!"
# Accelerator: NVIDIA B300 288 GB
export GDCS_WORKLOAD_ACCELERATOR_TYPE="nvidia.com/gpu-pod-NVIDIA_B300_SXM6_AC"
export GDCS_WORKLOAD_ACCELERATOR_COUNT="1"
# Resources
export GDCS_WORKLOAD_CPU_LIMIT="4"
export GDCS_WORKLOAD_CPU_REQUEST="2"
export GDCS_WORKLOAD_MEMORY_LIMIT="16Gi"
export GDCS_WORKLOAD_MEMORY_REQUEST="8Gi"
# Ollama
export GDCS_OLLAMA_NUM_PARALLEL="4"
export GDCS_OLLAMA_TEST_NUM_PREDICT="128"
EOF
Gemma 4 12B
| מאפיין | ערך |
|---|---|
| תג Ollama | gemma4:12b |
| פרמטרים | 12B (דחוס) |
| רישיון | התנאים וההגבלות של Gemma |
| משקלים | Ollama default quantization, בערך 7.7GB |
| חלון ההקשר | 256K טוקנים |
יוצרים את קובץ הסביבה של המודל:
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/ollama/gemma/env.d/model.sh && echo "Successfully created." || echo "Failed to create!"
# Model: Gemma 4 12B
export GDCS_OLLAMA_MODEL="gemma4:12b"
EOF
יוצרים את קובץ סביבת המאיץ לאפשרות ה-GPU:
NVIDIA A100 40 GB
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/ollama/gemma/env.d/accelerator.sh && echo "Successfully created." || echo "Failed to create!"
# Accelerator: NVIDIA A100 40 GB
export GDCS_WORKLOAD_ACCELERATOR_TYPE="nvidia.com/gpu-pod-NVIDIA_A100_PCIE_40GB"
export GDCS_WORKLOAD_ACCELERATOR_COUNT="1"
# Resources
export GDCS_WORKLOAD_CPU_LIMIT="4"
export GDCS_WORKLOAD_CPU_REQUEST="2"
export GDCS_WORKLOAD_MEMORY_LIMIT="16Gi"
export GDCS_WORKLOAD_MEMORY_REQUEST="8Gi"
# Ollama
export GDCS_OLLAMA_NUM_PARALLEL="4"
export GDCS_OLLAMA_TEST_NUM_PREDICT="128"
EOF
NVIDIA A100 80 GB
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/ollama/gemma/env.d/accelerator.sh && echo "Successfully created." || echo "Failed to create!"
# Accelerator: NVIDIA A100 80 GB
export GDCS_WORKLOAD_ACCELERATOR_TYPE="nvidia.com/gpu-pod-NVIDIA_A100_80GB_PCIE"
export GDCS_WORKLOAD_ACCELERATOR_COUNT="1"
# Resources
export GDCS_WORKLOAD_CPU_LIMIT="4"
export GDCS_WORKLOAD_CPU_REQUEST="2"
export GDCS_WORKLOAD_MEMORY_LIMIT="16Gi"
export GDCS_WORKLOAD_MEMORY_REQUEST="8Gi"
# Ollama
export GDCS_OLLAMA_NUM_PARALLEL="4"
export GDCS_OLLAMA_TEST_NUM_PREDICT="128"
EOF
NVIDIA H100 94 GB
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/ollama/gemma/env.d/accelerator.sh && echo "Successfully created." || echo "Failed to create!"
# Accelerator: NVIDIA H100 94 GB
export GDCS_WORKLOAD_ACCELERATOR_TYPE="nvidia.com/gpu-pod-NVIDIA_H100_NVL"
export GDCS_WORKLOAD_ACCELERATOR_COUNT="1"
# Resources
export GDCS_WORKLOAD_CPU_LIMIT="4"
export GDCS_WORKLOAD_CPU_REQUEST="2"
export GDCS_WORKLOAD_MEMORY_LIMIT="16Gi"
export GDCS_WORKLOAD_MEMORY_REQUEST="8Gi"
# Ollama
export GDCS_OLLAMA_NUM_PARALLEL="4"
export GDCS_OLLAMA_TEST_NUM_PREDICT="128"
EOF
NVIDIA H200 141 GB
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/ollama/gemma/env.d/accelerator.sh && echo "Successfully created." || echo "Failed to create!"
# Accelerator: NVIDIA H200 141 GB
export GDCS_WORKLOAD_ACCELERATOR_TYPE="nvidia.com/gpu-pod-NVIDIA_H200"
export GDCS_WORKLOAD_ACCELERATOR_COUNT="1"
# Resources
export GDCS_WORKLOAD_CPU_LIMIT="4"
export GDCS_WORKLOAD_CPU_REQUEST="2"
export GDCS_WORKLOAD_MEMORY_LIMIT="16Gi"
export GDCS_WORKLOAD_MEMORY_REQUEST="8Gi"
# Ollama
export GDCS_OLLAMA_NUM_PARALLEL="4"
export GDCS_OLLAMA_TEST_NUM_PREDICT="128"
EOF
NVIDIA B300 288 GB
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/ollama/gemma/env.d/accelerator.sh && echo "Successfully created." || echo "Failed to create!"
# Accelerator: NVIDIA B300 288 GB
export GDCS_WORKLOAD_ACCELERATOR_TYPE="nvidia.com/gpu-pod-NVIDIA_B300_SXM6_AC"
export GDCS_WORKLOAD_ACCELERATOR_COUNT="1"
# Resources
export GDCS_WORKLOAD_CPU_LIMIT="4"
export GDCS_WORKLOAD_CPU_REQUEST="2"
export GDCS_WORKLOAD_MEMORY_LIMIT="16Gi"
export GDCS_WORKLOAD_MEMORY_REQUEST="8Gi"
# Ollama
export GDCS_OLLAMA_NUM_PARALLEL="4"
export GDCS_OLLAMA_TEST_NUM_PREDICT="128"
EOF
Gemma 4 26B-A4B
| מאפיין | ערך |
|---|---|
| תג Ollama | gemma4:26b |
| פרמטרים | 25.8 מיליארד בסך הכול / 4 מיליארד פעילים (שילוב מומחים) |
| רישיון | התנאים וההגבלות של Gemma |
| משקלים | קוונטיזציה של Ollama כברירת מחדל, בערך 16GB |
| חלון ההקשר | 256K טוקנים |
יוצרים את קובץ הסביבה של המודל:
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/ollama/gemma/env.d/model.sh && echo "Successfully created." || echo "Failed to create!"
# Model: Gemma 4 26B-A4B
export GDCS_OLLAMA_MODEL="gemma4:26b"
EOF
יוצרים את קובץ סביבת המאיץ לאפשרות ה-GPU:
NVIDIA A100 40 GB
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/ollama/gemma/env.d/accelerator.sh && echo "Successfully created." || echo "Failed to create!"
# Accelerator: NVIDIA A100 40 GB
export GDCS_WORKLOAD_ACCELERATOR_TYPE="nvidia.com/gpu-pod-NVIDIA_A100_PCIE_40GB"
export GDCS_WORKLOAD_ACCELERATOR_COUNT="1"
# Resources
export GDCS_WORKLOAD_CPU_LIMIT="4"
export GDCS_WORKLOAD_CPU_REQUEST="2"
export GDCS_WORKLOAD_MEMORY_LIMIT="32Gi"
export GDCS_WORKLOAD_MEMORY_REQUEST="16Gi"
# Ollama
export GDCS_OLLAMA_NUM_PARALLEL="4"
export GDCS_OLLAMA_TEST_NUM_PREDICT="128"
EOF
NVIDIA A100 80 GB
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/ollama/gemma/env.d/accelerator.sh && echo "Successfully created." || echo "Failed to create!"
# Accelerator: NVIDIA A100 80 GB
export GDCS_WORKLOAD_ACCELERATOR_TYPE="nvidia.com/gpu-pod-NVIDIA_A100_80GB_PCIE"
export GDCS_WORKLOAD_ACCELERATOR_COUNT="1"
# Resources
export GDCS_WORKLOAD_CPU_LIMIT="4"
export GDCS_WORKLOAD_CPU_REQUEST="2"
export GDCS_WORKLOAD_MEMORY_LIMIT="32Gi"
export GDCS_WORKLOAD_MEMORY_REQUEST="16Gi"
# Ollama
export GDCS_OLLAMA_NUM_PARALLEL="4"
export GDCS_OLLAMA_TEST_NUM_PREDICT="128"
EOF
NVIDIA H100 94 GB
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/ollama/gemma/env.d/accelerator.sh && echo "Successfully created." || echo "Failed to create!"
# Accelerator: NVIDIA H100 94 GB
export GDCS_WORKLOAD_ACCELERATOR_TYPE="nvidia.com/gpu-pod-NVIDIA_H100_NVL"
export GDCS_WORKLOAD_ACCELERATOR_COUNT="1"
# Resources
export GDCS_WORKLOAD_CPU_LIMIT="4"
export GDCS_WORKLOAD_CPU_REQUEST="2"
export GDCS_WORKLOAD_MEMORY_LIMIT="32Gi"
export GDCS_WORKLOAD_MEMORY_REQUEST="16Gi"
# Ollama
export GDCS_OLLAMA_NUM_PARALLEL="4"
export GDCS_OLLAMA_TEST_NUM_PREDICT="128"
EOF
NVIDIA H200 141 GB
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/ollama/gemma/env.d/accelerator.sh && echo "Successfully created." || echo "Failed to create!"
# Accelerator: NVIDIA H200 141 GB
export GDCS_WORKLOAD_ACCELERATOR_TYPE="nvidia.com/gpu-pod-NVIDIA_H200"
export GDCS_WORKLOAD_ACCELERATOR_COUNT="1"
# Resources
export GDCS_WORKLOAD_CPU_LIMIT="4"
export GDCS_WORKLOAD_CPU_REQUEST="2"
export GDCS_WORKLOAD_MEMORY_LIMIT="32Gi"
export GDCS_WORKLOAD_MEMORY_REQUEST="16Gi"
# Ollama
export GDCS_OLLAMA_NUM_PARALLEL="4"
export GDCS_OLLAMA_TEST_NUM_PREDICT="128"
EOF
NVIDIA B300 288 GB
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/ollama/gemma/env.d/accelerator.sh && echo "Successfully created." || echo "Failed to create!"
# Accelerator: NVIDIA B300 288 GB
export GDCS_WORKLOAD_ACCELERATOR_TYPE="nvidia.com/gpu-pod-NVIDIA_B300_SXM6_AC"
export GDCS_WORKLOAD_ACCELERATOR_COUNT="1"
# Resources
export GDCS_WORKLOAD_CPU_LIMIT="4"
export GDCS_WORKLOAD_CPU_REQUEST="2"
export GDCS_WORKLOAD_MEMORY_LIMIT="32Gi"
export GDCS_WORKLOAD_MEMORY_REQUEST="16Gi"
# Ollama
export GDCS_OLLAMA_NUM_PARALLEL="4"
export GDCS_OLLAMA_TEST_NUM_PREDICT="128"
EOF
Gemma 4 31B
| מאפיין | ערך |
|---|---|
| תג Ollama | gemma4:31b |
| פרמטרים | 31.3B (דחוס) |
| רישיון | התנאים וההגבלות של Gemma |
| משקלים | Ollama default quantization, בערך 19GB |
| חלון ההקשר | 256K טוקנים |
יוצרים את קובץ הסביבה של המודל:
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/ollama/gemma/env.d/model.sh && echo "Successfully created." || echo "Failed to create!"
# Model: Gemma 4 31B
export GDCS_OLLAMA_MODEL="gemma4:31b"
EOF
יוצרים את קובץ סביבת המאיץ לאפשרות ה-GPU:
NVIDIA A100 40 GB
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/ollama/gemma/env.d/accelerator.sh && echo "Successfully created." || echo "Failed to create!"
# Accelerator: NVIDIA A100 40 GB
export GDCS_WORKLOAD_ACCELERATOR_TYPE="nvidia.com/gpu-pod-NVIDIA_A100_PCIE_40GB"
export GDCS_WORKLOAD_ACCELERATOR_COUNT="1"
# Resources
export GDCS_WORKLOAD_CPU_LIMIT="4"
export GDCS_WORKLOAD_CPU_REQUEST="2"
export GDCS_WORKLOAD_MEMORY_LIMIT="40Gi"
export GDCS_WORKLOAD_MEMORY_REQUEST="20Gi"
# Ollama
export GDCS_OLLAMA_NUM_PARALLEL="4"
export GDCS_OLLAMA_TEST_NUM_PREDICT="128"
EOF
NVIDIA A100 80 GB
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/ollama/gemma/env.d/accelerator.sh && echo "Successfully created." || echo "Failed to create!"
# Accelerator: NVIDIA A100 80 GB
export GDCS_WORKLOAD_ACCELERATOR_TYPE="nvidia.com/gpu-pod-NVIDIA_A100_80GB_PCIE"
export GDCS_WORKLOAD_ACCELERATOR_COUNT="1"
# Resources
export GDCS_WORKLOAD_CPU_LIMIT="4"
export GDCS_WORKLOAD_CPU_REQUEST="2"
export GDCS_WORKLOAD_MEMORY_LIMIT="40Gi"
export GDCS_WORKLOAD_MEMORY_REQUEST="20Gi"
# Ollama
export GDCS_OLLAMA_NUM_PARALLEL="4"
export GDCS_OLLAMA_TEST_NUM_PREDICT="128"
EOF
NVIDIA H100 94 GB
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/ollama/gemma/env.d/accelerator.sh && echo "Successfully created." || echo "Failed to create!"
# Accelerator: NVIDIA H100 94 GB
export GDCS_WORKLOAD_ACCELERATOR_TYPE="nvidia.com/gpu-pod-NVIDIA_H100_NVL"
export GDCS_WORKLOAD_ACCELERATOR_COUNT="1"
# Resources
export GDCS_WORKLOAD_CPU_LIMIT="4"
export GDCS_WORKLOAD_CPU_REQUEST="2"
export GDCS_WORKLOAD_MEMORY_LIMIT="40Gi"
export GDCS_WORKLOAD_MEMORY_REQUEST="20Gi"
# Ollama
export GDCS_OLLAMA_NUM_PARALLEL="4"
export GDCS_OLLAMA_TEST_NUM_PREDICT="128"
EOF
NVIDIA H200 141 GB
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/ollama/gemma/env.d/accelerator.sh && echo "Successfully created." || echo "Failed to create!"
# Accelerator: NVIDIA H200 141 GB
export GDCS_WORKLOAD_ACCELERATOR_TYPE="nvidia.com/gpu-pod-NVIDIA_H200"
export GDCS_WORKLOAD_ACCELERATOR_COUNT="1"
# Resources
export GDCS_WORKLOAD_CPU_LIMIT="4"
export GDCS_WORKLOAD_CPU_REQUEST="2"
export GDCS_WORKLOAD_MEMORY_LIMIT="40Gi"
export GDCS_WORKLOAD_MEMORY_REQUEST="20Gi"
# Ollama
export GDCS_OLLAMA_NUM_PARALLEL="4"
export GDCS_OLLAMA_TEST_NUM_PREDICT="128"
EOF
NVIDIA B300 288 GB
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/ollama/gemma/env.d/accelerator.sh && echo "Successfully created." || echo "Failed to create!"
# Accelerator: NVIDIA B300 288 GB
export GDCS_WORKLOAD_ACCELERATOR_TYPE="nvidia.com/gpu-pod-NVIDIA_B300_SXM6_AC"
export GDCS_WORKLOAD_ACCELERATOR_COUNT="1"
# Resources
export GDCS_WORKLOAD_CPU_LIMIT="4"
export GDCS_WORKLOAD_CPU_REQUEST="2"
export GDCS_WORKLOAD_MEMORY_LIMIT="40Gi"
export GDCS_WORKLOAD_MEMORY_REQUEST="20Gi"
# Ollama
export GDCS_OLLAMA_NUM_PARALLEL="4"
export GDCS_OLLAMA_TEST_NUM_PREDICT="128"
EOF
מגדירים את קובץ הסביבה:
source ${HOME}/gdcag-solutions/open-weight-models/ollama/gemma/env.sh
אשכול
אחזור פרטי הכניסה של האשכול:
gdcloud clusters get-credentials "${GDC_STANDARD_CLUSTER_NAME}" \ --project="${GDC_PROJECT}"מוודאים שסוג המשאב של המאיץ בקובץ הסביבה של המאיץ זמין באשכול:
kubectl get nodes \ -o custom-columns='NAME:.metadata.name,ACCELERATOR:.status.allocatable.'"${GDCS_WORKLOAD_ACCELERATOR_TYPE}"
הטמעה
מרחב שמות
יוצרים את מרחב השמות:
kubectl create namespace "${GDCS_WORKLOAD_NAMESPACE}" \ --dry-run=client \ --output=yaml | kubectl apply -f -מוסיפים את
imagePullSecret:kubectl create secret docker-registry "${GDCS_HARBOR_K8S_PULL_SECRET}" \ --dry-run=client \ --from-file=.dockerconfigjson=${GDCS_HARBOR_K8S_DOCKER_CONFIG}/config.json \ --namespace="${GDCS_WORKLOAD_NAMESPACE}" \ --output=yaml | kubectl apply -f -
משקלי המודל
מורידים את משקולות המודל:
${GDCS_IMPLEMENTATION_HOME}/ollama_model_weight_download.shמחשבים את הגודל הנדרש של
PersistentVolumeClaimלפי משקלי המודל שהורדתם, בתוספת 25% (מעוגל כלפי מעלה ל-GiB השלם הבא):MODEL_KIB=$(du -sk "${GDCS_OLLAMA_MODEL_DOWNLOAD_DIR}" | awk '{print $1}') export GDCS_MODEL_PVC_SIZE="$(( (MODEL_KIB * 125 / 100 + 1048575) / 1048576 ))Gi" echo "GDCS_MODEL_PVC_SIZE=${GDCS_MODEL_PVC_SIZE}"יוצרים את המניפסט של
PersistentVolumeClaimלמשקלי המודל:cat <<EOF > "${GDCS_USER_GUIDE_HOME}/${GDCS_WORKLOAD_NAME}-pvc.yaml" && echo "Successfully created." || echo "Failed to create!" apiVersion: v1 kind: PersistentVolumeClaim metadata: name: ${GDCS_WORKLOAD_NAME}-rwo namespace: ${GDCS_WORKLOAD_NAMESPACE} spec: accessModes: - ReadWriteOnce resources: requests: storage: ${GDCS_MODEL_PVC_SIZE} EOFמחילים את המניפסט של
PersistentVolumeClaimעל משקלי המודל:kubectl apply --filename="${GDCS_USER_GUIDE_HOME}/${GDCS_WORKLOAD_NAME}-pvc.yaml"מחכים שה-
PersistentVolumeClaimיקשור וידפיס את הערכים שמפעיל התשתית צריך כדי לשנות את מדיניות איכות השירות (QoS) של הקלט/פלט:kubectl wait \ --for=jsonpath='{.status.phase}'=Bound \ "pvc/${GDCS_WORKLOAD_NAME}-rwo" \ --namespace="${GDCS_WORKLOAD_NAMESPACE}" \ --timeout=120s BACKING_PVC=$(kubectl get pvc "${GDCS_WORKLOAD_NAME}-rwo" \ --namespace="${GDCS_WORKLOAD_NAMESPACE}" \ --output=jsonpath='{.spec.volumeName}') echo "BACKING_PVC=${BACKING_PVC} ORG=${GDC_ORG}"אם
performance-rwoלא זמין באשכול, בקשו ממפעיל התשתית להחיל את מדיניות ה-QoS לביצועים גבוהים (system-performance-<ORG>-admin, 30 IOPS לכל GiB עם מינימום של 6,148 IOPS) על אמצעי האחסון שמגבה אתPersistentVolumeClaim. מזינים את הערכים שלBACKING_PVCו-ORGשהודפסו בשלב הקודם. מפעיל התשתית מיישם את המדיניות כפי שמתואר במדריך ההפעלה FILE-R0097 במסמכי התיעוד של מפעיל התשתית. המדיניות נכנסת לתוקף בנפח הפעיל, כך שאפשר להמשיך לשלבים הבאים.יוצרים את המניפסט לטעינת המודל
Pod:cat <<EOF > "${GDCS_USER_GUIDE_HOME}/${GDCS_WORKLOAD_NAME}-loader.yaml" && echo "Successfully created." || echo "Failed to create!" apiVersion: v1 kind: Pod metadata: name: ${GDCS_MODEL_LOADER_POD_NAME} namespace: ${GDCS_WORKLOAD_NAMESPACE} spec: containers: - command: ["/bin/sh", "-c", "trap 'exit 0' TERM; while :; do sleep 1; done"] image: ${GDCS_HARBOR_PROJECT_URI}/busybox/busybox:${GDCS_BUSYBOX_IMAGE_TAG} imagePullPolicy: IfNotPresent name: loader volumeMounts: - mountPath: ${GDCS_OLLAMA_PV_MOUNT_PATH} name: model-cache imagePullSecrets: - name: ${GDCS_HARBOR_K8S_PULL_SECRET} restartPolicy: Never volumes: - name: model-cache persistentVolumeClaim: claimName: ${GDCS_WORKLOAD_NAME}-rwo EOFמחילים את המניפסט של טוען המודלים
Pod:kubectl apply --filename="${GDCS_USER_GUIDE_HOME}/${GDCS_WORKLOAD_NAME}-loader.yaml"מחכים עד שהסטטוס של טוען המודלים
Podיהיה Running:kubectl wait \ --for=jsonpath='{.status.phase}'=Running \ "pod/${GDCS_MODEL_LOADER_POD_NAME}" \ --namespace="${GDCS_WORKLOAD_NAMESPACE}" \ --timeout=120sמעלים את משקלי המודל:
${GDCS_IMPLEMENTATION_HOME}/model_weight_upload.sh \ --local-dir="${GDCS_OLLAMA_MODEL_DOWNLOAD_DIR}" \ --pod="${GDCS_MODEL_LOADER_POD_NAME}" \ --target-dir="${GDCS_OLLAMA_PV_MOUNT_PATH}"מוחקים את טוען המודלים
Pod:kubectl delete pod "${GDCS_MODEL_LOADER_POD_NAME}" \ --namespace="${GDCS_WORKLOAD_NAMESPACE}"
שרת הסקה
יוצרים את המניפסט של Ollama
Deployment:cat <<EOF > "${GDCS_USER_GUIDE_HOME}/${GDCS_WORKLOAD_NAME}-deployment.yaml" && echo "Successfully created." || echo "Failed to create!" apiVersion: v1 kind: ConfigMap metadata: name: ${GDCS_WORKLOAD_NAME} data: OLLAMA_FLASH_ATTENTION: "1" OLLAMA_HOST: "0.0.0.0" OLLAMA_KEEP_ALIVE: "-1" OLLAMA_MODELS: "${GDCS_OLLAMA_PV_MOUNT_PATH}" OLLAMA_NUM_PARALLEL: "${GDCS_OLLAMA_NUM_PARALLEL}" OLLAMA_ORIGINS: "*" --- apiVersion: apps/v1 kind: Deployment metadata: name: ${GDCS_WORKLOAD_NAME} labels: app: ${GDCS_WORKLOAD_NAME} spec: replicas: 1 selector: matchLabels: app: ${GDCS_WORKLOAD_NAME} strategy: type: Recreate template: metadata: labels: app: ${GDCS_WORKLOAD_NAME} spec: containers: - envFrom: - configMapRef: name: ${GDCS_WORKLOAD_NAME} image: ${GDCS_HARBOR_PROJECT_URI}/ollama/ollama:${GDCS_OLLAMA_IMAGE_TAG} imagePullPolicy: IfNotPresent lifecycle: postStart: exec: command: - /bin/sh - -c - | echo "Waiting for local API to respond..." timeout=60 until /bin/ollama list > /dev/null 2>&1 || [ "\$timeout" -le 0 ]; do sleep 1 timeout=\$((timeout - 1)) done if [ "\$timeout" -le 0 ]; then echo "Timed out waiting for Ollama server to start." >&2 exit 1 fi echo "Preloading model into memory..." /bin/ollama run "${GDCS_OLLAMA_MODEL}" "" livenessProbe: failureThreshold: 3 httpGet: path: / port: 11434 periodSeconds: 30 timeoutSeconds: 10 name: ollama ports: - containerPort: 11434 name: http-ollama readinessProbe: failureThreshold: 3 httpGet: path: /api/tags port: 11434 periodSeconds: 10 successThreshold: 1 timeoutSeconds: 5 resources: limits: cpu: ${GDCS_WORKLOAD_CPU_LIMIT} memory: ${GDCS_WORKLOAD_MEMORY_LIMIT} ${GDCS_WORKLOAD_ACCELERATOR_TYPE}: "${GDCS_WORKLOAD_ACCELERATOR_COUNT}" requests: cpu: ${GDCS_WORKLOAD_CPU_REQUEST} memory: ${GDCS_WORKLOAD_MEMORY_REQUEST} ${GDCS_WORKLOAD_ACCELERATOR_TYPE}: "${GDCS_WORKLOAD_ACCELERATOR_COUNT}" securityContext: allowPrivilegeEscalation: false seLinuxOptions: type: spc_t startupProbe: failureThreshold: 60 httpGet: path: / port: 11434 periodSeconds: 10 timeoutSeconds: 5 volumeMounts: - mountPath: ${GDCS_OLLAMA_PV_MOUNT_PATH} name: model-cache - mountPath: /dev/shm name: shm imagePullSecrets: - name: ${GDCS_HARBOR_K8S_PULL_SECRET} volumes: - name: model-cache persistentVolumeClaim: claimName: ${GDCS_WORKLOAD_NAME}-rwo - emptyDir: medium: Memory sizeLimit: "8Gi" name: shm --- apiVersion: v1 kind: Service metadata: name: ${GDCS_WORKLOAD_NAME} spec: ports: - name: http-ollama port: 80 protocol: TCP targetPort: 11434 selector: app: ${GDCS_WORKLOAD_NAME} type: LoadBalancer EOFמחילים את המניפסט של Ollama
Deployment:kubectl apply --filename="${GDCS_USER_GUIDE_HOME}/${GDCS_WORKLOAD_NAME}-deployment.yaml" --namespace="${GDCS_WORKLOAD_NAMESPACE}"יוצרים את המניפסט של Ollama
NetworkPolicy:cat <<EOF > "${GDCS_USER_GUIDE_HOME}/ollama-netpol.yaml" && echo "Successfully created." || echo "Failed to create!" apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-ollama-ingress namespace: ${GDCS_WORKLOAD_NAMESPACE} spec: ingress: - from: - ipBlock: cidr: 0.0.0.0/0 - namespaceSelector: {} ports: - port: 11434 protocol: TCP podSelector: {} policyTypes: - Ingress EOFמחילים את המניפסט של Ollama
NetworkPolicy:kubectl apply --filename="${GDCS_USER_GUIDE_HOME}/ollama-netpol.yaml"מחכים שה-
Podיפעל:kubectl wait \ --for=jsonpath='{.status.phase}'=Running \ "pod" \ --selector="app=${GDCS_WORKLOAD_NAME}" \ --namespace="${GDCS_WORKLOAD_NAMESPACE}" \ --timeout=300sמחכים שהסטטוס של
Deploymentיהיה "מוכן":kubectl wait \ --for=condition=Available \ "deployment/${GDCS_WORKLOAD_NAME}" \ --namespace="${GDCS_WORKLOAD_NAMESPACE}" \ --timeout=600sאופציונלי: כדי לעקוב אחרי התקדמות ההפעלה, אפשר להעביר בסטרימינג את יומני הקונטיינר:
kubectl logs deployment/${GDCS_WORKLOAD_NAME} \ --follow \ --namespace="${GDCS_WORKLOAD_NAMESPACE}"
אימות
מאחזרים את כתובת ה-IP של LoadBalancer בשביל Ollama:
export OLLAMA_LB_IP=$(kubectl get service/${GDCS_WORKLOAD_NAME} --namespace="${GDCS_WORKLOAD_NAMESPACE}" --output=jsonpath='{.status.loadBalancer.ingress[*].ip}') echo "OLLAMA_LB_IP=${OLLAMA_LB_IP}"שולחים בקשת בדיקה ל-Ollama באמצעות מאזן העומסים (Ollama API, יצירת טקסט):
curl http://${OLLAMA_LB_IP}/api/generate \ -H "Content-Type: application/json" \ -d '{ "model": "'${GDCS_OLLAMA_MODEL}'", "prompt": "Explain Google Distributed Cloud air-gapped briefly.", "stream": false }'שליחת בקשה לבדיקת סטרימינג:
curl http://${OLLAMA_LB_IP}/api/generate \ -H "Content-Type: application/json" \ -d '{ "model": "'${GDCS_OLLAMA_MODEL}'", "prompt": "Explain Google Distributed Cloud air-gapped briefly.", "stream": true }'שולחים בקשת בדיקה ל-API של Ollama שתואם ל-OpenAI באמצעות מאזן העומסים:
curl http://${OLLAMA_LB_IP}/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "'${GDCS_OLLAMA_MODEL}'", "messages": [ {"role": "user", "content": "Explain Google Distributed Cloud air-gapped briefly."} ] }'שולחים בקשת בדיקה ל-Ollama באמצעות העברה ליציאה אחרת:
kubectl port-forward service/${GDCS_WORKLOAD_NAME} \ --namespace="${GDCS_WORKLOAD_NAMESPACE}" 11434:80 & PF_PID=$! sleep 1 curl http://127.0.0.1:11434/api/tags kill ${PF_PID}