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

בדף הזה מוסבר איך לנהל עומסי עבודה של יחידות עיבוד גרפי (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

  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:  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.

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