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

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

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

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

תמחור Flex-start

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

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

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

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

  • מפעילים את ממשק Google Kubernetes Engine API.
  • הפעלת Google Kubernetes Engine API
  • כדי להשתמש ב-CLI של Google Cloud למשימה הזו, צריך להתקין ואז להפעיל את gcloud CLI. אם התקנתם בעבר את ה-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. אם יש לכם אשכול אזורי מסוג 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 models available מפורטים המודלים הזמינים של יחידות ה-GPU.
  2. מאתרים את השורה של סוג מאיץ ה-GPU שבחרתם.
  3. בודקים את העמודה 'סדרת המכונה' באותה שורה. בעמודה הזו מצוין באיזו סדרת מכונות צריך להשתמש.
  4. כדי לראות את השמות של סוגי המכונות שאפשר לציין, לוחצים על הקישור בסדרת המכונות.

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

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

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

אם אתם משתמשים באשכול במצב 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 \
        --consolidation-delay=CONSOLIDATION_DELAY
    

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

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

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

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

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 קורא ל-APIs כדי ליצור אשכול עם מאגר צמתים שמשתמש במכונות וירטואליות עם GPUs שניתנות להפעלה גמישה. Google Cloud במאגר הצמתים יש בהתחלה אפס צמתים, והוא מוגדר עם שינוי גודל אוטומטי. מידע נוסף על 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, בקר משימות יוצר פוד אחד או יותר ועוזר לוודא שהם מבצעים משימה ספציפית בהצלחה.

  1. בGoogle Cloud מסוף, לוחצים על סמל ההפעלה של Cloud Shell הפעלת Cloud Shell כדי להפעיל סשן של 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. במסוף Google Cloud , נכנסים לדף Manage resources.

    כניסה לדף Manage resources

  2. ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete.
  3. כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.

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

  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
    

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