בדף הזה מוסבר איך לנהל עומסי עבודה של יחידות עיבוד גרפי (GPU) ב-Google Distributed Cloud במודל מחובר. כדי להשתמש בפונקציונליות הזו, צריך להגדיר חומרה מחוברת של Distributed Cloud שמכילה יחידות GPU. מידע נוסף זמין במאמר בנושא תכנון הגדרת הציוד.
עומסי עבודה מחוברים של Distributed Cloud יכולים לפעול בקונטיינרים ובמכונות וירטואליות:
עומסי עבודה של GPU שפועלים בקונטיינרים. כל משאבי ה-GPU באשכול המחובר ל-Distributed Cloud מוקצים בהתחלה לעומסי עבודה שפועלים בקונטיינרים. מנהל ההתקן של ה-GPU להרצת עומסי עבודה מבוססי-GPU בקונטיינרים כלול ב-Distributed Cloud במודל מחובר. בכל קונטיינר, ספריות ה-GPU מותקנות בנתיב
/opt/nvidia.עומסי עבודה של GPU שפועלים במכונות וירטואליות. כדי להריץ עומס עבודה מבוסס-GPU במכונה וירטואלית, צריך להקצות משאבי GPU במכונות וירטואליות בצומת המחובר של Distributed Cloud, כמו שמתואר בהמשך הדף הזה. הפעולה הזו מדלגת על מנהל ההתקן (דרייבר) המובנה של ה-GPU ומעבירה את ה-GPU ישירות למכונות וירטואליות. צריך להתקין באופן ידני מנהל התקן תואם של GPU במערכת ההפעלה האורחת של כל מכונה וירטואלית. בנוסף, אתם צריכים לוודא שיש לכם את כל הרישיונות שנדרשים להפעלת מנהלי התקנים מיוחדים של GPU במכונות הווירטואליות.
כדי לוודא שיש יחידות GPU בצומת שמחובר ל-Distributed Cloud, צריך לוודא שיש לצומת את התווית vm.cluster.gke.io.gpu=true. אם התווית לא מופיעה בצומת, המשמעות היא שלא מותקנים כרטיסי GPU במכונה הפיזית המחוברת ל-Distributed Cloud.
הקצאת משאבי GPU
כברירת מחדל, כל משאבי ה-GPU בכל צומת באשכול מוקצים לעומסי עבודה מבוססי-קונטיינרים. כדי להתאים אישית את הקצאת משאבי ה-GPU בכל צומת, צריך לבצע את השלבים שבקטע הזה.
הגדרת הקצאת משאבי GPU
כדי להקצות משאבי GPU בצומת שמחובר ל-Distributed Cloud, משתמשים בפקודה הבאה כדי לערוך את
GPUAllocationהמשאב בהתאמה אישית בצומת היעד:kubectl edit gpuallocation NODE_NAME --namespace vm-system
מחליפים את
NODE_NAMEבשם של צומת היעד ב-Distributed Cloud.בדוגמה הבאה, הפלט של הפקודה מציג את הקצאת משאבי ה-GPU שמוגדרת כברירת מחדל במפעל. כברירת מחדל, כל משאבי ה-GPU מוקצים לעומסי עבודה מבוססי-קונטיינרים (
pod), ולא מוקצים משאבי GPU לעומסי עבודה של מכונות וירטואליות (vm):... spec: pod: 2 # Number of GPUs allocated for container workloads vm: 0 # Number of GPUs allocated for VM workloadsמגדירים את הקצאות משאבי ה-GPU באופן הבא:
- כדי להקצות משאב GPU לעומסי עבודה מבוססי-קונטיינר, מגדילים את הערך בשדה
podומקטינים את הערך בשדהvmבאותה כמות. - כדי להקצות משאב GPU לעומסי עבודה של מכונות וירטואליות, מגדילים את הערך של השדה
vmומקטינים את הערך של השדהpodבאותו סכום.
המספר הכולל של משאבי ה-GPU שהוקצו לא יכול להיות גדול ממספר מעבדי ה-GPU שמותקנים במכונה הפיזית המחוברת ל-Distributed Cloud שבה הצומת פועל. אחרת, הצומת דוחה את ההקצאה הלא חוקית.
בדוגמה הבאה, שני משאבי GPU הוקצו מחדש מעומסי עבודה מבוססי-קונטיינרים (
pod) לעומסי עבודה של מכונות וירטואליות (vm):... spec: pod: 0 # Number of GPUs allocated for container workloads vm: 2 # Number of GPUs allocated for VM workloadsבסיום, מחילים את משאב
GPUAllocationששונה על האשכול ומחכים שהסטטוס שלו ישתנה ל-AllocationFulfilled.- כדי להקצות משאב GPU לעומסי עבודה מבוססי-קונטיינר, מגדילים את הערך בשדה
בדיקת הקצאת משאבי ה-GPU
כדי לבדוק את הקצאת משאבי ה-GPU, משתמשים בפקודה הבאה:
kubectl describe gpuallocations NODE_NAME --namespace vm-system
מחליפים את
NODE_NAMEבשם של הצומת המחובר של Distributed Cloud.הפקודה מחזירה פלט שדומה לדוגמה הבאה:
Name: mynode1 ... spec: node: mynode1 pod: 2 # Number of GPUs allocated for container workloads vm: 0 # Number of GPUs allocated for VM workloads Status: Allocated: true Conditions: Last Transition Time: 2022-09-23T03:14:10Z Message: Observed Generation: 1 Reason: AllocationFulfilled Status: True Type: AllocationStatus Last Transition Time: 2022-09-23T03:14:16Z Message: Observed Generation: 1 Reason: DeviceStateUpdated Status: True Type: DeviceStateUpdated Consumption: pod: 0/2 # Number of GPUs currently consumed by container workloads vm: 0/0 # Number of GPUs currently consumed by VM workloads Device Model: NVIDIA L4 Events: <none>
הגדרת קונטיינר לשימוש במשאבי GPU
כדי להגדיר קונטיינר שפועל ב-Distributed Cloud ומחובר לשימוש במשאבי GPU, מגדירים את המפרט שלו כמו בדוגמה הבאה, ואז מחילים אותו על האשכול:
apiVersion: v1 kind: Pod metadata: name: my-gpu-pod spec: containers: - name: my-gpu-container image: CUDA_TOOLKIT_IMAGE command: ["/bin/bash", "-c", "--"] args: ["while true; do sleep 600; done;"] env: resources: requests: GPU_MODEL: 2 limits: GPU_MODEL: 2 nodeSelector: kubernetes.io/hostname: NODE_NAME
מחליפים את מה שכתוב בשדות הבאים:
-
CUDA_TOOLKIT_IMAGE: הנתיב המלא והשם של תמונת ערכת הכלים NVIDIA CUDA. הגרסה של ערכת הכלים של CUDA צריכה להיות זהה לגרסה של מנהל ההתקן של NVIDIA שפועלת באשכול המחובר של Distributed Cloud. כדי לראות את גרסת מנהל ההתקן של NVIDIA, אפשר לעיין בהערות לגבי הגרסה של Distributed Cloud. כדי למצוא את הגרסה התואמת של CUDA toolkit, אפשר לעיין בתאימות ל-CUDA. -
NODE_NAME: השם של צומת היעד של Google Distributed Cloud במודל מחובר. -
GPU_MODEL: המודל של NVIDIA GPU שמותקן במכונה המחוברת של Distributed Cloud. החל מהגרסה הזו, הערך הנתמך היחיד הואnvidia.com/gpu-pod-NVIDIA_L4עבור NVIDIA L4 GPU.
הגדרת מכונה וירטואלית לשימוש במשאבי GPU
כדי להגדיר מכונה וירטואלית שפועלת ב-Distributed Cloud ומחוברת לשימוש במשאבי GPU, צריך להגדיר את מפרט המשאבים VirtualMachine שלה כמו בדוגמה הבאה, ואז להחיל אותו על האשכול:
apiVersion: vm.cluster.gke.io/v1 kind: VirtualMachine ... spec: ... gpu: model: GPU_MODEL quantity: 2
מחליפים את מה שכתוב בשדות הבאים:
-
GPU_MODEL: המודל של NVIDIA GPU שמותקן במכונה המחוברת של Distributed Cloud. החל מהגרסה הזו, הערך הנתמך היחיד הואnvidia.com/gpu-pod-NVIDIA_L4עבור NVIDIA L4 GPU.