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

במדריך הזה מוסבר איך לבצע אופטימיזציה להקצאת GPU לעומסי עבודה של אימון בקנה מידה בינוני וקטן באמצעות מכונות וירטואליות עם הפעלה גמישה. מכונות וירטואליות מסוג Flex-start נוצרות באמצעות אפשרות הצריכה flex-start. במדריך הזה משתמשים במכונות וירטואליות עם הפעלה גמישה כדי לפרוס עומס עבודה שמורכב משתי משימות Kubernetes. לכל משימה נדרש GPU אחד. ‫GKE מקצה באופן אוטומטי צומת יחיד עם שני GPUs מסוג A100 כדי להריץ את שני הג'ובים.

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

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

תמחור Flex-start

מומלץ להשתמש ב-Flex-start אם נפח העבודה שלכם דורש הקצאה דינמית של משאבים לפי הצורך, למשך עד שבעה ימים עם הזמנות לטווח קצר, ללא ניהול מורכב של מכסות וגישה חסכונית. התכונה 'התחלה גמישה' מבוססת על Dynamic Workload Scheduler והחיוב מתבצע לפי התמחור של Dynamic Workload Scheduler:

  • הנחה (עד 53%) על vCPU,‏ GPU ו-TPU.
  • התשלום מתבצע לפי שימוש.

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

לפני שמתחילים, חשוב לוודא שביצעתם את הפעולות הבאות:

  • מפעילים את ממשק ה-API של Google Kubernetes Engine.
  • הפעלת Google Kubernetes Engine API
  • אם רוצים להשתמש ב-CLI של Google Cloud למשימה הזו, צריך להתקין ואז להפעיל את ה-CLI של gcloud. אם התקנתם בעבר את ה-CLI של gcloud, מריצים את הפקודה gcloud components update כדי לקבל את הגרסה העדכנית. יכול להיות שגרסאות קודמות של ה-CLI של gcloud לא יתמכו בהרצת הפקודות שמופיעות במסמך הזה.

אם אין לכם אשכול או שהאשכול לא עומד בדרישות, אתם יכולים ליצור אשכול אזורי רגיל באמצעות ה-CLI של gcloud. מוסיפים את הדגלים הבאים כדי לקבל מידע על תחילת שימוש גמישה:

--location=us-central1 \
--node-locations=us-central1-a,us-central1-b \
--machine-type=g2-standard-8

כשיוצרים מאגר צמתים עם התחלה גמישה, משתמשים בדגלים שצוינו קודם ובדגל --accelerator type=nvidia-l4,count=1.

אם יש לכם אשכול Standard שעומד בדרישות, בהמשך המאמר מוסבר איך לבחור סוג של מאיץ GPU וסוג מכונה לאשכול.

בחירת סוג של מאיץ GPU

אם אתם משתמשים באשכול במצב Autopilot, דלגו על הקטע הזה ועברו אל הקטע הפעלת עומס עבודה של אצווה.

הזמינות של GPU היא ספציפית לכל אזור. צריך למצוא סוג של מאיץ GPU שזמין באזור שבו נמצא אשכול Standard. אם יש לכם אשכול אזורי רגיל, האזור שבו סוג מאיץ ה-GPU זמין חייב להיות באזור שבו נמצא האשכול. כשיוצרים את מאגר הצמתים, מציינים את סוג המאיץ ואת האזורים של הצמתים. אם מציינים סוג של מאיץ שלא זמין במיקום של האשכול, יצירת מאגר הצמתים נכשלת.

מריצים את הפקודות הבאות כדי לקבל את המיקום של האשכול ואת סוג מאיץ ה-GPU הנתמך.

  1. כדי לראות את המיקום של המקבץ:

    gcloud container clusters list
    

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

    NAME                LOCATION  MASTER_VERSION      MASTER_IP     MACHINE_TYPE  NODE_VERSION        NUM_NODES  STATUS   STACK_TYPE
    example-cluster-1   us-west2  1.33.2-gke.1111000  34.102.3.122  e2-medium     1.33.2-gke.1111000  9          RUNNING  IPV4
    
  2. הצגת רשימה של סוגי מאיצי ה-GPU הזמינים, לא כולל תחנות עבודה וירטואליות במיקום:

    gcloud compute accelerator-types list | grep CONTROL_PLANE_LOCATION | grep -v "Workstation"
    

    מחליפים את CONTROL_PLANE_LOCATION במיקום של האשכול.

    לדוגמה, כדי לקבל רשימה של סוגי מאיצי GPU באזור us-west2, מריצים את הפקודה הבאה:

    gcloud compute accelerator-types list | grep us-west2 | grep -v "Workstation"
    

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

    nvidia-b200            us-west2-c                 NVIDIA B200 180GB
    nvidia-tesla-p4        us-west2-c                 NVIDIA Tesla P4
    nvidia-tesla-t4        us-west2-c                 NVIDIA T4
    nvidia-tesla-p4        us-west2-b                 NVIDIA Tesla P4
    nvidia-tesla-t4        us-west2-b                 NVIDIA T4
    

צריך לבחור סוג מכונה תואם

אם אתם משתמשים באשכול במצב Autopilot, דלגו על הקטע הזה ועברו אל הקטע הפעלת עומס עבודה של אצווה.

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

  1. אפשר לעיין בטבלה מודלים של GPU שזמינים.
  2. מאתרים את השורה של סוג מאיץ ה-GPU שבחרתם.
  3. בודקים את העמודה 'סדרת המכונה' באותה שורה. בעמודה הזו מצוין באיזו סדרת מכונות צריך להשתמש.
  4. כדי לראות את השמות של סוגי המכונות שאפשר לציין, לוחצים על הקישור בסדרת המכונות.

היוצא מן הכלל היחיד הוא סדרת מכונות N1, שבה יש הנחיות נוספות לגבי סוגי מכונות N1 שאפשר להשתמש בהם עם סוג המאיץ שבחרתם.

לפני שמשתמשים במכונה שעברה אופטימיזציה לשימוש במאיץ, צריך לוודא שהיא נתמכת במצב הקצאת משאבים עם הפעלה גמישה, כמו שמוצג בזמינות של אפשרויות צריכה לפי סוג המכונה.

קביעת מספר המאיצים

אם אתם משתמשים באשכול במצב Autopilot, דלגו על הקטע הזה ועברו אל הקטע הפעלת עומס עבודה של אצווה.

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

  1. מידע נוסף זמין במאמר בנושא סוגי מכונות עם GPU.
  2. בטבלה, חפשו את סוג המאיץ עבור סדרת המכונות שלכם.
  3. משתמשים בערך שבעמודה 'מספר יחידות ה-GPU'.

יצירת מאגר צמתים עם flex-start

אם אתם משתמשים באשכול במצב Autopilot, דלגו על הקטע הזה ועברו אל הקטע הפעלת עומס עבודה של אצווה.

כדי ליצור מאגר צמתים עם הפעלה גמישה באשכול קיים מסוג Standard, אפשר להשתמש ב-CLI של gcloud או ב-Terraform.

gcloud

  1. יוצרים מאגר צמתים עם flex-start:

    gcloud container node-pools create NODE_POOL_NAME \
        --cluster CLUSTER_NAME \
        --location CONTROL_PLANE_LOCATION \
        --project PROJECT_ID \
        --accelerator type=ACCELERATOR_TYPE,count=COUNT \
        --machine-type MACHINE_TYPE \
        --max-run-duration MAX_RUN_DURATION \
        --flex-start \
        --node-locations NODE_ZONES \
        --num-nodes 0 \
        --enable-autoscaling \
        --total-min-nodes 0 \
        --total-max-nodes 5 \
        --location-policy ANY \
        --reservation-affinity none \
        --no-enable-autorepair
    

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

    • NODE_POOL_NAME: השם שבחרתם למאגר הצמתים.
    • CLUSTER_NAME: השם של אשכול Standard שרוצים לשנות.
    • CONTROL_PLANE_LOCATION: אזור המחשוב של מישור הבקרה של האשכול.
    • PROJECT_ID: מזהה הפרויקט.
    • ACCELERATOR_TYPE: הסוג הספציפי של המאיץ (לדוגמה, nvidia-tesla-t4 ל-NVIDIA T4) לצירוף למופעים.
    • COUNT: מספר המאיצים לצירוף למופעים. ערך ברירת המחדל הוא 1.
    • MACHINE_TYPE: סוג המכונה שבה רוצים להשתמש לצמתים.
    • MAX_RUN_DURATION: אופציונלי. זמן הריצה המקסימלי של צומת בשניות, עד ברירת המחדל של שבעה ימים. המספר שאתם מזינים חייב להסתיים ב-s. לדוגמה, כדי לציין יום אחד, מזינים 86400s.
    • NODE_ZONES: רשימה מופרדת בפסיקים של אזור אחד או יותר שבהם GKE יוצר את מאגר הצמתים.

    בפקודה הזו, הדגל --flex-start מורה ל-gcloud ליצור מאגר צמתים עם מכונות וירטואליות (VM) מסוג Flex-start.

    ‫GKE יוצר מאגר צמתים עם צמתים שמכילים שתי מכונות מסוג המאיץ שצוין. במאגר הצמתים אין צמתים בהתחלה, והתכונה 'התאמה אוטומטית לעומס' מופעלת

  2. בודקים את הסטטוס של התחלה גמישה במאגר הצמתים:

    gcloud container node-pools describe NODE_POOL_NAME \
        --cluster CLUSTER_NAME \
        --location CONTROL_PLANE_LOCATION \
        --format="get(config.flexStart)"
    

    אם האפשרות flex-start מופעלת במאגר הצמתים, השדה flexStart מוגדר ל-True.

Terraform

אפשר להשתמש ב-flex-start עם GPU באמצעות מודול Terraform.

  1. מוסיפים את הבלוק הבא להגדרות של Terraform:
resource "google_container_node_pool" " "gpu_dws_pool" {
name = "gpu-dws-pool"

queued_provisioning {
    enabled = false
}

}
node_config {
    machine_type = "MACHINE_TYPE"
    accelerator_type = "ACCELERATOR_TYPE"
    accelerator_count = COUNT
    node_locations = ["NODE_ZONES"]
    flex_start = true
}

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

  • MACHINE_TYPE: סוג המכונה שבה רוצים להשתמש לצמתים.
  • ACCELERATOR_TYPE: הסוג הספציפי של המאיץ (לדוגמה, nvidia-tesla-t4 עבור NVIDIA T4) לצירוף למופעים.
  • COUNT: מספר המאיצים לצירוף למופעים. ערך ברירת המחדל הוא 1.
  • NODE_ZONES: רשימה מופרדת בפסיקים של אזור אחד או יותר שבהם GKE יוצר את מאגר הצמתים.

‫Terraform קורא לממשקי API של Google Cloud כדי ליצור אשכול עם מאגר צמתים שמשתמש במכונות וירטואליות עם כרטיסי GPU שניתנות להפעלה גמישה. במאגר הצמתים יש בהתחלה אפס צמתים, והוא מוגדר עם התאמה אוטומטית לעומס. מידע נוסף על Terraform זמין במפרט המשאבים של google_container_node_pool ב-terraform.io.

אימות הסטטוס של התחלה גמישה במאגר הצמתים

מריצים את הפקודה הבאה:

gcloud container node-pools describe NODE_POOL_NAME \
    --cluster CLUSTER_NAME \
    --location CONTROL_PLANE_LOCATION \
    --format="get(config.flexStart)"

אם האפשרות flex-start מופעלת במאגר הצמתים, השדה flexStart מוגדר ל-True.

הרצת עומס עבודה באצווה

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

  1. בGoogle Cloud מסוף, מפעילים סשן של Cloud Shell על ידי לחיצה על סמל ההפעלה של Cloud Shell Activate Cloud Shell. סשן ייפתח בחלונית התחתונה של מסוף Google Cloud .

  2. יוצרים קובץ בשם dws-flex-start.yaml:

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: job-1
    spec:
      template:
        spec:
          nodeSelector:
            cloud.google.com/gke-flex-start: "true"
            cloud.google.com/gke-accelerator: ACCELERATOR_TYPE
          containers:
          - name: container-1
            image: gcr.io/k8s-staging-perf-tests/sleep:latest
            args: ["10s"] # Sleep for 10 seconds
            resources:
              requests:
                  nvidia.com/gpu: 1
              limits:
                  nvidia.com/gpu: 1
          restartPolicy: OnFailure
    ---
    apiVersion: batch/v1
    kind: Job
    metadata:
      name: job-2
    spec:
      template:
        spec:
          nodeSelector:
            cloud.google.com/gke-flex-start: "true"
            cloud.google.com/gke-accelerator: ACCELERATOR_TYPE
          containers:
          - name: container-2
            image: gcr.io/k8s-staging-perf-tests/sleep:latest
            args: ["10s"] # Sleep for 10 seconds
            resources:
              requests:
                  nvidia.com/gpu: 1
              limits:
                  nvidia.com/gpu: 1
          restartPolicy: OnFailure
    
  3. החלת מניפסט dws-flex-start.yaml:

    kubectl apply -f dws-flex-start.yaml
    
  4. מוודאים שהעבודות פועלות באותו צומת:

    kubectl get pods -l "job-name in (job-1,job-2)" -o wide
    

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

    NAME    READY   STATUS      RESTARTS   AGE   IP       NODE               NOMINATED NODE   READINESS GATES
    job-1   0/1     Completed   0          19m   10.(...) gke-flex-zonal-a2  <none>           <none>
    job-2   0/1     Completed   0          19m   10.(...) gke-flex-zonal-a2  <none>           <none>
    

הסרת המשאבים

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

מחיקת הפרויקט

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

מחיקת המשאב הספציפי

  1. מחיקת המשרות:

    kubectl delete job -l "job-name in (job-1,job-2)"
    
  2. מוחקים את מאגר הצמתים:

    gcloud container node-pools delete NODE_POOL_NAME \
          --location CONTROL_PLANE_LOCATION
    
  3. מחיקת האשכול:

    gcloud container clusters delete CLUSTER_NAME
    

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