בדף הזה מוסבר מתי כדאי להשתמש ב-NVIDIA GPU Operator ואיך להפעיל אותו ב-GKE.
סקירה כללית
אופרטורים הם תוספי תוכנה של Kubernetes שמאפשרים למשתמשים ליצור משאבים בהתאמה אישית שמנהלים אפליקציות ואת הרכיבים שלהן. אפשר להשתמש באופרטורים כדי לבצע אוטומציה של משימות מורכבות מעבר למה ש-Kubernetes מספקת, כמו פריסה ושדרוג של אפליקציות.
NVIDIA GPU Operator הוא אופרטור של Kubernetes שמספק תשתית וממשק API משותפים לפריסה, להגדרה ולניהול של רכיבי תוכנה שנדרשים להקצאת יחידות GPU של NVIDIA באשכול Kubernetes. ה-NVIDIA GPU Operator מספק חוויה עקבית, מפשט את ניהול המשאבים של ה-GPU ומייעל את השילוב של עומסי עבודה מואצים באמצעות GPU ב-Kubernetes.
למה כדאי להשתמש ב-NVIDIA GPU Operator?
מומלץ להשתמש בניהול GPU ב-GKE עבור צמתי ה-GPU, כי GKE מנהל באופן מלא את מחזור החיים של צמתי ה-GPU. כדי להתחיל להשתמש ב-GKE לניהול צמתי GPU, בוחרים באחת מהאפשרויות הבאות:
לחלופין, יכול להיות ש-NVIDIA GPU Operator יתאים לכם אם אתם מחפשים חוויה עקבית בכמה ספקי שירותי ענן, אם אתם כבר משתמשים ב-NVIDIA GPU Operator או אם אתם משתמשים בתוכנה שתלויה ב-NVIDIA GPU Operator.
לשיקולים נוספים שיעזרו לכם להחליט בין האפשרויות האלה, תוכלו לעיין במאמר ניהול מחסנית ה-GPU דרך GKE או דרך NVIDIA GPU Operator ב-GKE.
מגבלות
יש תמיכה ב-NVIDIA GPU Operator גם בקובצי אימג' של צמתים של מערכת הפעלה שמותאמת לקונטיינרים (COS) וגם בקובצי אימג' של צמתים של Ubuntu, עם המגבלות הבאות:
- החל מגרסה 24.6.0 של GPU Operator ואילך, יש תמיכה ב-NVIDIA GPU Operator ב-GKE.
- ה-NVIDIA GPU Operator לא נתמך באשכולות של Autopilot.
- אין תמיכה ב-NVIDIA GPU Operator בתמונות של צומתי Windows.
- מפעיל ה-GPU של NVIDIA לא מנוהל על ידי GKE. כדי לשדרג את NVIDIA GPU Operator, אפשר לעיין במסמכי התיעוד של NVIDIA.
לפני שמתחילים
לפני שמתחילים, חשוב לוודא שביצעתם את המשימות הבאות:
- מפעילים את ממשק ה-API של Google Kubernetes Engine. הפעלת Google Kubernetes Engine API
- כדי להשתמש ב-CLI של Google Cloud למשימה הזו, צריך להתקין ואז לאתחל את ה-CLI של gcloud. אם התקנתם בעבר את ה-CLI של gcloud, מריצים את הפקודה
gcloud components updateכדי לקבל את הגרסה העדכנית. יכול להיות שגרסאות קודמות של ה-CLI של gcloud לא יתמכו בהרצת הפקודות שמופיעות במסמך הזה.
- מוודאים שאתם עומדים בדרישות שמפורטות במאמר בנושא הפעלת מעבדים גרפיים במאגרי צמתים רגילים.
מוודאים ש-Helm מותקן בסביבת הפיתוח. Helm מותקן מראש ב-Cloud Shell.
אין דרישה ספציפית לגרסת Helm, אבל אפשר להשתמש בפקודה הבאה כדי לוודא ש-Helm מותקן.
helm versionאם הפלט דומה ל-
Command helm not found, אפשר להתקין את ה-CLI של Helm באמצעות הפקודה הבאה:curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 \ && chmod 700 get_helm.sh \ && ./get_helm.sh
יצירה והגדרה של מאגר צמתים של GPU
כדי ליצור ולהגדיר את מאגר הצמתים של ה-GPU, מבצעים את השלבים הבאים:
כדי ליצור מאגר צמתים של GPU, פועלים לפי ההוראות במאמר בנושא יצירת מאגר צמתים של GPU עם השינויים הבאים:
- מגדירים את
gpu-driver-version=disabledכדי לדלג על ההתקנה האוטומטית של מנהל ההתקן של ה-GPU, כי היא לא נתמכת כשמשתמשים ב-NVIDIA GPU Operator. - מגדירים את הערך של
--node-labels="gke-no-default-nvidia-gpu-device-plugin=true"ל-disable כדי להשבית את Daemonset של פלאגין המכשיר של GPU מנוהל ב-GKE.
מריצים את הפקודה הבאה ומצרפים דגלים אחרים ליצירת מאגר צמתים של GPU לפי הצורך:
gcloud container node-pools create POOL_NAME \ --accelerator type=GPU_TYPE,count=AMOUNT,gpu-driver-version=disabled \ --node-labels="gke-no-default-nvidia-gpu-device-plugin=true"מחליפים את מה שכתוב בשדות הבאים:
- POOL_NAME השם שבחרתם למאגר הצמתים.
- GPU_TYPE: סוג ה-GPU המואץ שרוצים להשתמש בו. לדוגמה,
nvidia-h100-80gb. - AMOUNT: מספר יחידות ה-GPU לצירוף לצמתים במאגר הצמתים.
לדוגמה, הפקודה הבאה יוצרת מאגר צמתים של GKE,
a3nodepool, עם מעבדי GPU מדגם H100 באשכול אזוריa3-cluster. בדוגמה הזו, ה-Daemonset של תוסף מכשיר ה-GPU של GKE וההתקנה האוטומטית של מנהל ההתקן מושבתים.gcloud container node-pools create a3nodepool \ --cluster=a3-cluster \ --location=us-central1 \ --node-locations=us-central1-a \ --accelerator=type=nvidia-h100-80gb,count=8,gpu-driver-version=disabled \ --machine-type=a3-highgpu-8g \ --node-labels="gke-no-default-nvidia-gpu-device-plugin=true" \ --num-nodes=1- מגדירים את
מריצים את הפקודה הבאה כדי לקבל את פרטי הכניסה לאימות של האשכול:
USE_GKE_GCLOUD_AUTH_PLUGIN=True \ gcloud container clusters get-credentials CLUSTER_NAME \ --location CONTROL_PLANE_LOCATIONמחליפים את מה שכתוב בשדות הבאים:
- CLUSTER_NAME: שם האשכול שמכיל את מאגר הצמתים.
- CONTROL_PLANE_LOCATION: המיקום של מישור הבקרה של האשכול ב-Compute Engine. מציינים אזור לאשכולות אזוריים או אזור לאשכולות אזוריים.
הפלט אמור להיראות כך:
Fetching cluster endpoint and auth data. kubeconfig entry generated for CLUSTER_NAME.(אופציונלי) מוודאים שאפשר להתחבר לאשכול.
kubectl get nodes -o wideאמורה להופיע רשימה של כל הצמתים שפועלים באשכול הזה.
כדי ליצור את מרחב השמות
gpu-operatorעבור NVIDIA GPU Operator, מריצים את הפקודה הבאה:kubectl create ns gpu-operatorהפלט אמור להיראות כך:
namespace/gpu-operator createdכדי ליצור מכסת משאבים במרחב השמות
gpu-operator, מריצים את הפקודה הבאה:kubectl apply -n gpu-operator -f - << EOF apiVersion: v1 kind: ResourceQuota metadata: name: gpu-operator-quota spec: hard: pods: 100 scopeSelector: matchExpressions: - operator: In scopeName: PriorityClass values: - system-node-critical - system-cluster-critical EOFהפלט אמור להיראות כך:
resourcequota/gpu-operator-quota createdכדי לראות את מכסת המשאבים של מרחב השמות
gpu-operator:kubectl get -n gpu-operator resourcequota gpu-operator-quotaהפלט אמור להיראות כך:
NAME AGE REQUEST LIMIT gpu-operator-quota 2m27s pods: 0/100מתקינים ידנית את הדרייברים בצמתים של מערכת הפעלה שמותאמת לקונטיינרים או של Ubuntu. הוראות מפורטות להתקנה ידנית של מנהלי התקנים ל-GPU של NVIDIA מופיעות במאמר התקנה ידנית של מנהלי התקנים ל-GPU של NVIDIA.
אם משתמשים ב-COS, מריצים את הפקודות הבאות כדי לפרוס את ההתקנה של DaemonSet ולהתקין את גרסת ברירת המחדל של מנהל ההתקן של ה-GPU:
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/nvidia-driver-installer/cos/daemonset-preloaded.yamlאם משתמשים ב-Ubuntu, ה-DaemonSet שפורסים תלוי בסוג ה-GPU ובגרסת הצומת של GKE, כמו שמתואר בקטע Ubuntu בהוראות.
מריצים את הפקודה הבאה כדי לוודא מהי גרסת הדרייבר של ה-GPU:
kubectl logs -l k8s-app=nvidia-driver-installer \ -c "nvidia-driver-installer" --tail=-1 -n kube-systemאם התקנת מנהל ההתקן של ה-GPU מסתיימת בהצלחה, הפלט דומה לזה:
I0716 03:17:38.863927 6293 cache.go:66] DRIVER_VERSION=535.183.01 … I0716 03:17:38.863955 6293 installer.go:58] Verifying GPU driver installation I0716 03:17:41.534387 6293 install.go:543] Finished installing the drivers.
התקנת NVIDIA GPU Operator
בקטע הזה מוסבר איך להתקין את NVIDIA GPU Operator באמצעות Helm. מידע נוסף זמין במאמר של NVIDIA בנושא התקנת NVIDIA GPU Operator.
מוסיפים את מאגר NVIDIA Helm:
helm repo add nvidia https://helm.ngc.nvidia.com/nvidia \ && helm repo updateמתקינים את NVIDIA GPU Operator באמצעות Helm עם אפשרויות ההגדרה הבאות:
- מוודאים שהגרסה של GPU Operator היא 24.6.0 ואילך.
- מגדירים את נתיב ההתקנה של הדרייבר ב-GPU Operator באמצעות
hostPaths.driverInstallDir=/home/kubernetes/bin/nvidia. מגדירים את נתיב ההתקנה של ערכת הכלים
toolkit.installDir=/home/kubernetes/bin/nvidiaגם ל-COS וגם ל-Ubuntu. ב-COS, אפשר לכתוב בספרייה/homeוהיא משמשת כמיקום עם שמירת מצב (stateful) לאחסון קובצי ה-runtime הבינאריים של NVIDIA. למידע נוסף, אפשר לעיין במאמר סקירה כללית על דיסקים ומערכת קבצים ב-COS.
גרסה v25.10.0 ואילך
helm install --wait --generate-name \ -n gpu-operator \ nvidia/gpu-operator \ --set hostPaths.driverInstallDir=/home/kubernetes/bin/nvidia \ --set toolkit.installDir=/home/kubernetes/bin/nvidia \ --set driver.enabled=falseגרסה 25.3.4 או גרסה ישנה יותר
- מפעילים את Container Device Interface (CDI) ב-GPU Operator באמצעות
cdi.enabled=trueו-cdi.default=true, כי מצב Legacy לא נתמך. CDI נדרש גם ל-COS וגם ל-Ubuntu ב-GKE.
helm install --wait --generate-name \ --version=v25.3.4 \ -n gpu-operator \ nvidia/gpu-operator \ --set hostPaths.driverInstallDir=/home/kubernetes/bin/nvidia \ --set toolkit.installDir=/home/kubernetes/bin/nvidia \ --set cdi.enabled=true \ --set cdi.default=true \ --set driver.enabled=false \ --set operator.runtimeClass=containerd \ --set 'toolkit.env[0].name=CONTAINERD_CONFIG' \ --set 'toolkit.env[0].value=/etc/containerd/config.toml' \ --set 'toolkit.env[1].name=CONTAINERD_SOCKET' \ --set 'toolkit.env[1].value=/run/containerd/containerd.sock' \ --set 'toolkit.env[2].name=RUNTIME_CONFIG_SOURCE' \ --set 'toolkit.env[2].value="command\, file"'מידע נוסף על ההגדרות האלה זמין במאמרים Common Chart Customization Options ו-Common Deployment Scenarios במסמכי NVIDIA.
מוודאים שאופרטור ה-GPU של NVIDIA מותקן בהצלחה.
כדי לבדוק שהאופרנדים של GPU Operator פועלים כמו שצריך, מריצים את הפקודה הבאה:
kubectl get pods -n gpu-operatorהפלט אמור להיראות כך:
NAME READY STATUS RESTARTS AGE gpu-operator-5c7cf8b4f6-bx4rg 1/1 Running 0 11m gpu-operator-node-feature-discovery-gc-79d6d968bb-g7gv9 1/1 Running 0 11m gpu-operator-node-feature-discovery-master-6d9f8d497c-thhlz 1/1 Running 0 11m gpu-operator-node-feature-discovery-worker-wn79l 1/1 Running 0 11m gpu-feature-discovery-fs9gw 1/1 Running 0 8m14s gpu-operator-node-feature-discovery-worker-bdqnv 1/1 Running 0 9m5s nvidia-container-toolkit-daemonset-vr8fv 1/1 Running 0 8m15s nvidia-cuda-validator-4nljj 0/1 Completed 0 2m24s nvidia-dcgm-exporter-4mjvh 1/1 Running 0 8m15s nvidia-device-plugin-daemonset-jfbcj 1/1 Running 0 8m15s nvidia-mig-manager-kzncr 1/1 Running 0 2m5s nvidia-operator-validator-fcrr6 1/1 Running 0 8m15sכדי לבדוק שמספר ה-GPU מוגדר בצורה נכונה בשדה 'Allocatable' של הצומת, מריצים את הפקודה הבאה:
kubectl describe node GPU_NODE_NAME | grep Allocatable -A7מחליפים את GPU_NODE_NAME בשם הצומת שיש בו כרטיסי GPU.
הפלט אמור להיראות כך:
Allocatable: cpu: 11900m ephemeral-storage: 47060071478 hugepages-1Gi: 0 hugepages-2Mi: 0 memory: 80403000Ki nvidia.com/gpu: 1 # showing correct count of GPU associated with the nods pods: 110כדי לוודא שעומס העבודה של ה-GPU פועל בצורה תקינה, אפשר להשתמש בכלי
cuda-vectoradd:cat << EOF | kubectl create -f - apiVersion: v1 kind: Pod metadata: name: cuda-vectoradd spec: restartPolicy: OnFailure containers: - name: vectoradd image: nvidia/samples:vectoradd-cuda11.2.1 resources: limits: nvidia.com/gpu: 1 EOFלאחר מכן, מריצים את הפקודה הבאה:
kubectl logs cuda-vectoraddהפלט אמור להיראות כך:
[Vector addition of 50000 elements] Copy input data from the host memory to the CUDA device CUDA kernel launch with 196 blocks of 256 threads Copy output data from the CUDA device to the host memory Test PASSED Done
המאמרים הבאים
- איך מפעילים יחידות GPU במאגרי צמתים רגילים
- מידע על שיטות לשיתוף GPU ב-GKE
- שיטות מומלצות להתאמה לעומס (autoscaling) של עומסי עבודה של הסקת LLM עם GPUs ב-GKE
- למסמכי התיעוד של NVIDIA GPU Operator