ניהול מכשירי GPU באמצעות הקצאת משאבים דינמית

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

לפני שמתחילים

לפני שמגדירים את עומסי העבודה ב-GPU לשימוש בהקצאת משאבים דינמית, צריך לוודא שהתנאים המוקדמים הבאים מתקיימים:

  • אשכול ה-bare metal שלכם הוא מגרסה 1.33.0 ואילך.
  • מערכת ההפעלה היא Ubuntu 22.04 או Red Hat Enterprise Linux (RHEL) 9.4.
  • עדכנתם את האשכול כדי להפעיל הקצאת משאבים דינמית, כמו שמתואר במאמר הפעלת הקצאת משאבים דינמית.
  • יש לכם לפחות מכונת צומת אחת עם GPU מצורף ומנהל התקן של NVIDIA GPU מותקן. מידע נוסף מופיע במאמר התקנה או הסרה של NVIDIA GPU Operator שכלול בחבילה.
  • אם אתם משתמשים במפעיל ה-GPU של NVIDIA שמגיע בחבילה, גרסה 1.33.0 ואילך מפעילה את Container Device Interface‏ (CDI) כברירת מחדל. אם אתם משתמשים במפעיל GPU שהותקן ידנית, ודאו ש-CDI מופעל ב-ClusterPolicy.
  • פעלתם לפי ההוראות במאמר מנהל ההתקן של NVIDIA DRA למעבדי GPU כדי להתקין את מנהל ההתקן של NVIDIA DRA בכל הצמתים שמחוברים למעבדי GPU.

יצירת עומסי עבודה של GPU שמשתמשים בהקצאת משאבים דינמית

כדי שעומסי העבודה ב-GPU יוכלו להשתמש בהקצאת משאבים דינמית כדי לבקש GPU, הם צריכים להיות במרחב שמות משותף עם ResourceClaim שמתאר את הבקשה להקצאת מכשיר GPU. עומסי העבודה צריכים להפנות אל ResourceClaim כדי ש-Kubernetes יקצה משאבי GPU.

כדי להגדיר סביבה שבה עומסי העבודה משתמשים בהקצאת משאבים דינמית כדי לבקש משאבי GPU, צריך לבצע את השלבים הבאים:

  1. כדי ליצור משאבים שקשורים להקצאת משאבים דינמית, יוצרים Namespace חדש באשכול:

    cat <<EOF | kubectl apply --kubeconfig=CLUSTER_KUBECONFIG -f -
    apiVersion: v1
    kind: Namespace
    metadata:
      name: NAMESPACE_NAME
    EOF
    

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

    • ‫CLUSTER_KUBECONFIG: הנתיב לקובץ kubeconfig של אשכול המשתמש.

    • ‫NAMESPACE_NAME בשם של מרחב השמות להקצאת משאבים דינמית.

  2. יוצרים ResourceClaim כדי לתאר את הבקשה לגישה ל-GPU:

    cat <<EOF | kubectl apply --kubeconfig=CLUSTER_KUBECONFIG -f -
    apiVersion: resource.k8s.io/v1beta1
    kind: ResourceClaim
    metadata:
      namespace: NAMESPACE_NAME
      name: RESOURCE_CLAIM_NAME
    spec:
        devices:
          requests:
          - name: gpu
            deviceClassName: gpu.nvidia.com
    EOF
    

    מחליפים את RESOURCE_CLAIM_NAME בשם של בקשת המשאב לבקשות GPU.

  3. יוצרים עומסי עבודה שמפנים אל ResourceClaim שנוצר בשלב הקודם.

    בדוגמאות הבאות של עומסי עבודה אפשר לראות איך להפנות ל-ResourceClaim בשם gpu-claim במרחב השמות dra-test. הקונטיינרים ב-Pod של pod1 הם דוגמאות של ארכיטקטורת מכשירים מאוחדת (CUDA) של NVIDIA, שמיועדות להרצת עומסי עבודה של CUDA במעבדי ה-GPU. כשה-Pod של pod1 מסתיים בהצלחה, זה אומר שהיכולת של הקצאת משאבים דינמית פועלת כמו שצריך, ושהקצאת המשאבים הדינמית מוכנה לנהל את משאבי ה-GPU באשכול.

    Ubuntu

    1. מריצים את הפקודה הבאה כדי להחיל את המניפסט על האשכול:

      cat <<EOF | kubectl apply --kubeconfig=CLUSTER_KUBECONFIG -f -
      apiVersion: v1
      kind: Pod
      metadata:
        name: pod1
        namespace: dra-test
      spec:
        restartPolicy: OnFailure
        resourceClaims:
          - name: gpu
            resourceClaimName: gpu-claim
        containers:
          - name: ctr0
            image: nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda12.5.0
            resources:
              claims:
                - name: gpu
          - name: ctr1
            image: nvcr.io/nvidia/k8s/cuda-sample:devicequery
            resources:
              claims:
                - name: gpu
      EOF
      

    RHEL

    1. מריצים את הפקודה הבאה כדי להחיל את המניפסט על האשכול:

      cat <<EOF | kubectl apply --kubeconfig=CLUSTER_KUBECONFIG -f -
      apiVersion: v1
      kind: Pod
      metadata:
        name: pod1
        namespace: dra-test
      spec:
        restartPolicy: OnFailure
      
        resourceClaims:
          - name: gpu
            resourceClaimName: gpu-claim
        containers:
          - name: ctr0
            image: nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda12.5.0
            resources:
              claims:
                - name: gpu
          - name: ctr1
            image: nvcr.io/nvidia/k8s/cuda-sample:devicequery
            resources:
              claims:
                - name: gpu
      EOF
      

מגבלות

כשמשתמשים בהקצאת משאבים דינמית, חשוב להביא בחשבון את המגבלות הבאות:

  • כשמשתמשים במערכת ההפעלה RHEL עם גרסה נתמכת של מפעיל ה-GPU של NVIDIA, ממשק המכשיר של הקונטיינר (CDI) מטפל בהזרקת המכשיר ובתיוג SELinux באופן אוטומטי. לא צריך להגדיר ידנית את מדיניות SELinux או להגדיר את pod securityContext.

  • התכונה הזו משתמשת בקבוצת ה-API‏ resource.k8s.io/v1beta1, שהיא שונה מקבוצת ה-API של Kubernetes בקוד פתוח לתכונה הזו, resource.k8s.io/v1. קבוצת ה-API בקוד פתוח v1 מספקת יותר תכונות ויציבות טובה יותר מקבוצת ה-API‏ v1beta1.

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