ניהול עומסי עבודה של קונטיינרים ב-GPU

אתם יכולים להפעיל ולנהל משאבים של מעבד גרפי (GPU) במאגרי התמונות שלכם. לדוגמה, יכול להיות שתעדיפו להריץ מחברות של בינה מלאכותית (AI) ולמידת מכונה (ML) בסביבת GPU. תמיכה ב-GPU מופעלת כברירת מחדל במכשיר Google Distributed Cloud (GDC) air-gapped.

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

כדי להשלים את המשימות שמתוארות במאמר הזה, צריך לבקש את ההרשאות הנדרשות ולהכין את הסביבה.

שליחת בקשה לתפקידי IAM

כדי ליצור, למחוק, לערוך או להציג את המשאבים באשכול Kubernetes, צריך לבקש מאדמין ה-IAM בארגון להקצות לכם את התפקיד אדמין של מרחב שמות (namespace-admin) במרחב השמות של הפרויקט. התפקיד הזה מאפשר לפרוס עומסי עבודה של GPU במרחב השמות של הפרויקט.

הכנת הסביבה

  • נכנסים לחשבון ויוצרים את קובץ ה-kubeconfig לאשכול Kubernetes בשרת פיזי.

  • משתמשים בנתיב kubeconfig של אשכול Kubernetes כדי להחליף את הערך CLUSTER_KUBECONFIG בהוראות האלה.

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

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

  1. מוודאים שהצמתים באשכול Kubernetes תומכים בהקצאת משאבי ה-GPU:

    kubectl describe nodes NODE_NAME
    

    מחליפים את NODE_NAME בצומת שמנהל את המעבדים הגרפיים שרוצים לבדוק.

    הפלט הרלוונטי אמור להיראות כך:

    Capacity:
      nvidia.com/gpu-pod-NVIDIA_A100_80GB_PCIE: 1
    Allocatable:
      nvidia.com/gpu-pod-NVIDIA_A100_80GB_PCIE: 1
    
  2. מוסיפים את השדות .containers.resources.requests ו-.containers.resources.limits למפרט של הקונטיינר. מכיוון שקלאסטר Kubernetes מוגדר מראש עם מכונות GPU, ההגדרה זהה לכל עומסי העבודה:

     ...
     containers:
     - name: CONTAINER_NAME
       image: CONTAINER_IMAGE
       resources:
         requests:
           nvidia.com/gpu-pod-NVIDIA_A100_80GB_PCIE: 1
         limits:
           nvidia.com/gpu-pod-NVIDIA_A100_80GB_PCIE: 1
     ...
    

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

    • CONTAINER_NAME: השם של הקונטיינר.
    • CONTAINER_IMAGE: קובץ האימג' של הקונטיינר שאליו רוצים לגשת למכונות ה-GPU. חובה לכלול את הנתיב של מאגר התמונות ואת הגרסה של התמונה, כמו REGISTRY_PATH/hello-app:1.0.
  3. כדי לגשת ל-GPU, צריך גם לתת הרשאות נוספות לקונטיינרים. לכל קונטיינר שמבקש GPU, מוסיפים את ההרשאות הבאות למפרט הקונטיינר:

    ...
    securityContext:
     seLinuxOptions:
       type: unconfined_t
    ...
    
  4. מחילים את קובץ המניפסט של מאגר התגים:

    kubectl apply -f CONTAINER_MANIFEST_FILE \
        -n NAMESPACE \
        --kubeconfig CLUSTER_KUBECONFIG
    

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

    • CONTAINER_MANIFEST_FILE: קובץ ה-YAML של המשאב המותאם אישית של עומס העבודה של הקונטיינר.
    • NAMESPACE: מרחב השמות של הפרויקט שבו רוצים לפרוס את עומסי העבודה של הקונטיינרים.
    • CLUSTER_KUBECONFIG: קובץ ה-kubeconfig של אשכול Kubernetes במתכת חשופה שבו אתם פורסים עומסי עבודה של קונטיינרים.
  5. מוודאים שה-Pods פועלים ומשתמשים ביחידות ה-GPU:

    kubectl get pods -A | grep CONTAINER_NAME \
        -n NAMESPACE \
        --kubeconfig CLUSTER_KUBECONFIG
    

    הפלט הרלוונטי אמור להיראות כך:

    Port:           80/TCP
    Host Port:      0/TCP
    State:          Running
    Ready:          True
    Restart Count:  0
    Limits:
      nvidia.com/gpu-pod-NVIDIA_A100_80GB_PCIE:  1
    Requests:
      nvidia.com/gpu-pod-NVIDIA_A100_80GB_PCIE:  1