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

במדריך הזה מוסבר איך לבצע אופטימיזציה של הקצאת GPU לעומסי עבודה של אימון בקנה מידה בינוני וקטן באמצעות מכונות וירטואליות עם הפעלה גמישה. מכונות וירטואליות מסוג Flex-start נוצרות באמצעות אפשרות הצריכה 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 וכל דיסק SSD מקומי שמצורף.
  • תשלום לפי שימוש (PAYG).

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

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

  • מפעילים את ממשק ה-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

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

הזמינות של 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
    

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

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

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

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

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

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

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

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

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

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

יצירת מאגר צמתים עם הפעלה גמישה (Standard בלבד)

אם אתם משתמשים באשכול Autopilot, אתם יכולים לדלג על הקטע הזה כי אתם לא צריכים ליצור מאגרי צמתים באופן ידני. כשמפעילים את המניפסט של Job או Pod בקטע Run a batch workload, ‏ GKE Autopilot מקצה באופן אוטומטי את מכונות ה-VM הנדרשות מסוג Flex-start על סמך nodeSelector.

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

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