ניהול עומסי עבודה ב-GPU

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

כדי לתכנן ולהזמין תצורה כזו, בוחרים בתצורה 2 במסמכים הבאים:

אם מתקן ה-Distributed Cloud שלכם כולל יחידות GPU, אתם יכולים להגדיר את עומסי העבודה של Distributed Cloud כך שישתמשו במשאבי GPU.

עומסי עבודה של Distributed Cloud יכולים לפעול בקונטיינרים ובמכונות וירטואליות:

  • עומסי עבודה של GPU שפועלים בקונטיינרים. כשמפעילים תמיכה ב-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 בעומסי העבודה, צריך ליצור או לשנות את המשאב המותאם אישית VMRuntime שמכיל את הפרמטר enableGPU עם הערך true, ואז להחיל אותו על אשכול Distributed Cloud. לדוגמה:

apiVersion: vm.cluster.gke.io/v1
kind: VMRuntime
metadata:
  name: vmruntime
spec:
  # Enable GPU support
  enableGPU: true

בהתאם לסוג האשכול שבו רוצים להפעיל את VM Runtime במערכת המשנה של המכונה הווירטואלית ב-GDC, מבצעים אחת מהפעולות הבאות:

  • במקרים של אשכולות במישור הבקרה של Cloud שבהם עדיין לא הפעלתם את VM Runtime במערכת המשנה של המכונה הווירטואלית ב-GDC, אתם צריכים ליצור את המשאב VMRuntime באופן ידני.
  • במקרה של אשכולות של מישור הבקרה ב-Cloud שבהם כבר הפעלתם את VM Runtime במערכת המשנה של המכונה הווירטואלית ב-GDC, אתם צריכים לערוך את משאב VMRuntime הקיים.
  • במקרים של אשכולות של מישור בקרה מקומי, צריך לערוך את משאב VMRuntime הקיים.

אותו משאב VMRuntime גם מגדיר את VM Runtime בתמיכה של GDC באשכול שלכם באמצעות הפרמטר enable. חשוב להגדיר את שני הפרמטרים בהתאם לצורכי עומס העבודה שלכם. לא צריך להפעיל את VM Runtime בתמיכה של GDC כדי להפעיל תמיכה ב-GPU באשכול Distributed Cloud.

בטבלה הבאה מפורטות ההגדרות האפשריות.

ערך של enable ערך של enableGPU ההגדרה שמתקבלת
false false עומסי העבודה פועלים רק במאגרי מידע, ואי אפשר להשתמש במשאבי GPU.
false true עומסי עבודה פועלים רק בקונטיינרים ויכולים להשתמש במשאבי GPU.
true true

עומסי עבודה יכולים לפעול במכונות וירטואליות ובקונטיינרים.

שני סוגי העומסים יכולים להשתמש במשאבי GPU.

true false

עומסי עבודה יכולים לפעול במכונות וירטואליות ובקונטיינרים.

אף אחד מסוגי עומסי העבודה לא יכול להשתמש במשאבי GPU.

אימות שהתמיכה ב-GPU הופעלה

כדי לוודא שתמיכת ה-GPU הופעלה באשכול, משתמשים בפקודה הבאה:

kubectl get pods --namespace vm-system

הפקודה מחזירה פלט שדומה לדוגמה הבאה:

NAME                                         READY   STATUS     RESTARTS  AGE
...
gpu-controller-controller-manager-vbv4w      2/2     Running    0         31h
kubevirt-gpu-dp-daemonset-gxj7g              1/1     Running    0         31h
nvidia-gpu-dp-daemonset-bq2vj                1/1     Running    0         31h
...

בפלט, אפשר לוודא שרכיבי ה-Pod של בקר ה-GPU נפרסו ופועלים במרחב השמות vm-system.

הקצאת משאבי GPU

כברירת מחדל, כשמפעילים תמיכה ב-GPU באשכול Distributed Cloud, כל משאבי ה-GPU בכל צומת באשכול מוקצים לעומסי עבודה מבוססי-קונטיינר. כדי להתאים אישית את הקצאת משאבי ה-GPU בכל צומת, מבצעים את השלבים שבקטע הזה.

הגדרת הקצאת משאבי GPU

  1. כדי להקצות משאבי 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
    
  2. מגדירים את הקצאות משאבי ה-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, משתמשים בפקודה הבאה:

    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:  Tesla T4
     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:
        nvidia.com/gpu-pod-TESLA_T4: 2
        limits:
        nvidia.com/gpu-pod-TESLA_T4: 2
    nodeSelector:
      kubernetes.io/hostname: NODE_NAME

מחליפים את מה שכתוב בשדות הבאים:

  • CUDA_TOOLKIT_IMAGE: הנתיב המלא והשם של תמונת ערכת הכלים NVIDIA CUDA. הגרסה של ערכת הכלים של CUDA צריכה להיות זהה לגרסה של מנהל ההתקנים (דרייבר) של NVIDIA שפועלת באשכול Distributed Cloud. כדי לראות את גרסת מנהל ההתקן של NVIDIA, אפשר לעיין בהערות לגבי הגרסה של Distributed Cloud. כדי למצוא את הגרסה התואמת של CUDA toolkit, אפשר לעיין בתאימות ל-CUDA.
  • NODE_NAME: השם של צומת היעד ב-Distributed Cloud.

הגדרת מכונה וירטואלית לשימוש במשאבי GPU

כדי להגדיר מכונה וירטואלית שפועלת ב-Distributed Cloud כך שתשתמש במשאבי GPU, צריך להגדיר את מפרט המשאבים VirtualMachine שלה כמו בדוגמה הבאה, ואז להחיל אותו על האשכול:

apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
...
spec:
  ...
  gpu:
    model: nvidia.com/gpu-vm-TESLA_T4
    quantity: 2

המאמרים הבאים