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

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

בהקצאת משאבים דינמית, מערכת Kubernetes מתזמנת את ה-Pods על סמך הגדרת המכשיר שאליו יש הפניה. מפעילים של אפליקציות לא צריכים לבחור צמתים ספציפיים בעומסי העבודה שלהם, ולא צריכים לוודא שכל Pod מבקש בדיוק את מספר המכשירים שמצורפים לצמתים האלה. התהליך הזה דומה להקצאת נפחי אחסון.

היכולת הזו עוזרת לכם להריץ עומסי עבודה של AI על ידי הקצאה דינמית ומדויקת של משאבי ה-GPU באשכולות ה-Bare Metal, וכך לשפר את ניצול המשאבים והביצועים של עומסי עבודה תובעניים.

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

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

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

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

    בדוגמאות הבאות של עומסי עבודה אפשר לראות איך מפנים אל ResourceClaimgpu-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 עם גרסה נתמכת של NVIDIA GPU operator,‏ Container Device Interface‏ (CDI) מטפל בהחדרת מכשירים ובתיוג SELinux באופן אוטומטי. לא נדרש להשתמש בהגדרה ידנית של מדיניות SELinux או להגדיר את pod securityContext.

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

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