יצירה והרצה של משימה שמשתמשת ביחידות TPU

במאמר הזה מוסבר איך ליצור ולהריץ משימת Batch שמשתמשת במכונות וירטואליות (VM) עם יחידות Tensor Processing Unit‏ (TPU). יחידות TPU הן מעגלים משולבים לאפליקציות ספציפיות (ASIC) שפותחו על ידי Google כדי להאיץ עומסי עבודה של למידת מכונה (ML) ובינה מלאכותית (AI). כשיוצרים משימת Batch, אפשר לציין סוג מכונת TPU כדי להאיץ עומסי עבודה של הסקת מסקנות, הערכה, כוונון ואימון של AI ו-ML שמבוססים על סקריפטים או על קונטיינרים.

למידע נוסף על יחידות TPU, קראו את המאמרים מידע על יחידות TPU ב- Google Cloud וסוגי מכונות TPU במאמרי העזרה של Compute Engine. לחלופין, אתם יכולים להאיץ את עיבוד הנתונים ואת עומסי העבודה של AI ו-ML באמצעות שימוש ביחידות GPU.

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

  1. אם לא השתמשתם ב-Batch בעבר, כדאי לקרוא את המאמר תחילת השימוש ב-Batch ולהפעיל את Batch על ידי השלמת הדרישות המוקדמות לפרויקטים ולמשתמשים.
  2. כדי לקבל את ההרשאות שדרושות ליצירת משימה, צריך לבקש מהאדמין להקצות לכם את התפקידים הבאים ב-IAM:

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

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

הגבלות

כשמשימה משתמשת ביחידות TPU, כל המגבלות הבאות חלות בנוסף למגבלות של Compute Engine על יחידות TPU.

  • פרוסות TPU של מארח יחיד בלבד: Batch תומך רק ב-TPU VM עצמאיות, שנקראות פרוסות TPU של מארח יחיד. אין תמיכה בפרוסות TPU עם כמה מארחים, שכל אחת מהן מורכבת מכמה מכונות וירטואליות שמחוברות זו לזו.

    אפשר להריץ משימה בפרוסה אחת או יותר של TPU עם מארח יחיד. לדוגמה, אם במשימה הערך של taskCount מוגדר ל-4 והערך של taskCountPerNode מוגדר ל-1, מספר המכונות הווירטואליות שהמשימה פועלת בהן הוא 4 או פחות. בניגוד לפרוסות TPU עם כמה מארחים, כל פרוסת TPU עם מארח יחיד פועלת כמכונה וירטואלית עצמאית, ולא מספקת רשת של חיבורים בין שבבים (ICI) לתקשורת עם רוחב פס גבוה וזמן אחזור קצר.

    מידע נוסף על פרוסות TPU עם מארח יחיד ומארחים מרובים זמין במסמכי התיעוד של Compute Engine.

  • גרסאות TPU וסוגי מכונות נתמכים: Batch תומך רק בפרוסות TPU במארח יחיד (TPU VMs עצמאיים) בגרסאות ה-TPU ובסוגי המכונות הבאים:

    • ‫TPU7x‏ (Ironwood): tpu7x-standard-4t
    • ‫v6e (Trillium):‏ ct6e-standard-1t,‏ ct6e-standard-4t ו-ct6e-standard-8t

    • v5p: ct5p-hightpu-4t

    למידע נוסף על כל סוג מכונת TPU, כמו דיסקים נתמכים, קראו את המאמר סוגי מכונות TPU במסמכי התיעוד של Compute Engine.

  • אפשרויות צריכה נתמכות: אי אפשר להשתמש ב-Batch עם מכונות וירטואליות מסוג Flex-start VM (מודל הקצאה FLEX_START) למשימות שמשתמשות ב-TPU. חוץ ממכונות Flex-start VM, אתם יכולים לציין כל אפשרות צריכה שנתמכת בגרסת ה-TPU של המשימה, בהתאם לזמינות של אפשרויות הצריכה לפי גרסאות TPU במסמכי התיעוד של Compute Engine.

  • חובה להגדיר מיקום באזור אחד: כשיוצרים משימה שמשתמשת ביחידות TPU, צריך להגביל את המשימה לאזור ספציפי. כדי לעשות את זה, מגדירים את המיקומים המותרים של המשימה (השדה allowedLocations[]) לאזור שמכיל את גרסת ה-TPU או את ההזמנה, אם רלוונטי.

  • תכונות שלא נתמכות: משימות שמשתמשות ב-TPU לא תומכות בתכונות הבאות:

יצירת משימה שמשתמשת ביחידות TPU

כדי ליצור משימה שמשתמשת ב-TPU:

  1. תכנון ההגדרה של משימה שמשתמשת ב-TPU.
  2. יוצרים משימה עם ההגדרות שזיהיתם. בקטע יצירת משימה שמשתמשת ביחידות TPU מופיעות דוגמאות ליצירת משימה שמשתמשת ביחידות TPU.

תכנון ההגדרה של משימה שמשתמשת ב-TPU

לפני שיוצרים משימה שמשתמשת ב-TPU, צריך לבצע את הפעולות הבאות:

  1. בחירת גרסת ה-TPU: בוחרים את גרסת ה-TPU שמתאימה לעומס העבודה. במאמר גרסאות TPU מומלצות לפי סוגי עומסי עבודה תוכלו למצוא רשימה של גרסאות TPU לפי סוג עומס העבודה.

    חשוב לבחור אחת מגרסאות ה-TPU הנתמכות.

  2. בחירת אפשרות לצריכת TPU: בוחרים את האפשרות שמתאימה לעומס העבודה, למשך הזמן ולעלות. חשוב לבחור באחת מאפשרויות הצריכה הנתמכות. בטבלה הבאה מפורטים תרחישי השימוש ודרישות המשימה לכל אפשרות צריכה.

    אפשרויות צריכה ודרישות התפקיד שלהן

    מקושרים להזמנה (מקומות שמורים לעתיד במצב תזמון או מקומות שמורים לעתיד בגושי קיבולת)

    • תרחיש לדוגמה: מומלץ להשתמש באפשרויות צריכה שמוגבלות למקום שמור בשביל משימות שצריכות רמה גבוהה מאוד של הבטחה לזמינות של משאבי TPU לתקופה מסוימת. ב-Compute Engine, המשאבים האלה מתוארים בתור מקום שמור לעתיד במצב תזמון (למשך יום אחד עד 90 ימים) ומקום שמור לעתיד לגושי קיבולת (למשך שנה אחת או יותר).

    • פרטים: לפני שיוצרים משימה, צריך להשיג או לזהות הקצאה לגרסת ה-TPU שבחרתם ולמודל ההקצאה RESERVATION_BOUND. אחרי שיוצרים הזמנה, היא צוברת את העלויות של המכונות הווירטואליות שצוינו באותו מחיר כמו הפעלת המכונות הווירטואליות, עד שמוחקים את ההזמנה. מכונות וירטואליות שצורכות מקום שמור לא צוברות עלויות נפרדות, אבל המקומות השמורים צוברים עלויות בלי קשר לצריכה.

      למידע נוסף, קראו את המאמר בחירת סוג של שמירת מקום במסמכי התיעוד של Compute Engine.

    ב-Batch, המקומות השמורים שמוגבלים להזמנה משמשים למשימות שעומדות בכל התנאים הבאים:

    • מגדירים את השדה provisioningModel לערך RESERVATION_BOUND.
    • מטרגטים באופן ספציפי הזמנה תואמת. בשדה reservation, מגדירים את השם המקוצר (אם ההזמנה נמצאת באותו פרויקט ובאותו אזור) או את נתיב המשאב המלא של ההזמנה, של בלוק ההזמנה או של בלוק המשנה של ההזמנה.

    על פי דרישה

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

    • פרטים: בדרך כלל, הגישה למכונות הווירטואליות של Compute Engine היא על פי דרישה כברירת מחדל. האפשרות "על פי דרישה" מאפשרת לכם לגשת למשאבים (אם הם זמינים) כשתבקשו. המשאבים לא נמחקים עד שהמשימה מסתיימת או עד שמגיעים למגבלת זמן הריצה.

    כברירת מחדל, ב-Batch נעשה שימוש במשאבים על פי דרישה ברוב המשימות. כדי לוודא שהמשימה משתמשת בקיבולת על פי דרישה, צריך לבצע את כל הפעולות הבאות:

    מכונות וירטואליות במודל Spot

    • תרחיש שימוש: מומלץ להשתמש ב-VM במודל Spot כדי להפחית את העלויות של עומסי עבודה עמידים בכשלים.

    • פרטים: אם בקשה ליצירת משימה שמשתמשת ב-VM במודל Spot מתמלאת, המכונות הווירטואליות מחויבות לפי התמחור של VM במודל Spot, שיכול להשתנות לעיתים קרובות ועשוי לספק את ההנחה הגדולה ביותר, עד 91% הנחה על תמחור על פי דרישה. עם זאת, יכול להיות ש-VM במודל Spot לא תמיד יהיו זמינות, וניתן יהיה להפסיק אותן בכל שלב.

      מידע נוסף על VM במודל Spot והמלצות למשימות עם VM במודל Spot.

    Batch משתמש ב-VM במודל Spot למשימות שעומדות בכל התנאים הבאים:

  3. בחירת אזור שבו יחידות ה-TPU שבחרתם זמינות: כדי להשתמש בגרסת TPU, צריך להגדיר את השדה allowedLocations[] של המשימה לאזור שמכיל את יחידות ה-TPU שבחרתם, באופן הבא:

    • אם בחרתם באפשרות צריכה שמשתמשת בהזמנות, אתם צריכים להשתמש באזור שבו נמצאת ההזמנה.
    • אחרת, בוחרים אזור שמכיל את גרסת ה-TPU בהתאם לזמינות של TPU.

    בכל מקרה, האזור חייב להיות גם אחד מהאזורים הנתמכים של Batch.

  4. לוודא שיש לפרויקט מכסת TPU מספיקה: אם אתם יוצרים משימה שמשתמשת ב-TPU עם מכונות וירטואליות על פי דרישה או במחיר Spot, אתם צריכים לוודא שיש לכם מכסת TPU מספיקה באזור שבו אתם רוצים להשתמש. כדי ליצור משימה שמשתמשת ביחידות TPU שצורכות מקום שמור ב-TPU, לא צריך מכסת TPU כי המכסה משמשת כשיוצרים את המקום השמור. במאמר מכסת TPU מפורטים שמות המכסות של TPU, ובמאמר הצגה וניהול של מכסות מוסבר איך רואים את המכסות.

  5. בחירת סוג מכונת TPU: בוחרים סוג מכונת TPU לגרסת ה-TPU שנבחרה. אם בחרתם באפשרות צריכה שמשתמשת בהזמנות, אתם צריכים להשתמש בסוג המכונה של ההזמנה. רשימה של סוגי המכונות שזמינים לכל גרסת TPU מופיעה במאמר סוגי מכונות TPU.

    בגלל המגבלות, אתם צריכים להשתמש בטופולוגיה של מארח יחיד לסוג מכונת ה-TPU.

יצירת משימה שמשתמשת ביחידות TPU

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

אפשרות צריכה הוראות לדוגמה למשימה
מקום שמור (מקום שמור לעתיד במצב תזמון או מקום שמור לעתיד לגושי קיבולת)

שימוש ביחידות TPU עם אפשרויות צריכה שקשורות להזמנות

מכונות וירטואליות על פי דרישה או מכונות וירטואליות במודל Spot

שימוש ביחידות TPU עם מכונות וירטואליות על פי דרישה או במודל Spot

שימוש ביחידות TPU עם מכונות וירטואליות על פי דרישה או במודל Spot

אתם יכולים ליצור משימה שמשתמשת ביחידות TPU עם מכונות וירטואליות על פי דרישה או VM במודל Spot, באמצעות ה-CLI של gcloud או Batch API.

gcloud

  1. יוצרים קובץ תצורה בפורמט JSON שמציין סוג מכונת TPU נתמך עם מארח יחיד, מגדירים את מודל ההקצאה ל-STANDARD או ל-SPOT ומריצים במיקום שבו סוג מכונת ה-TPU זמין.

    לדוגמה, כדי ליצור משימת סקריפט בסיסית, יוצרים קובץ JSON עם התוכן הבא:

    {
      "taskGroups": [
        {
          "taskSpec": {
            "runnables": [
              {
                "script": {
                  "text": "echo Hello world from TPU task ${BATCH_TASK_INDEX}."
                }
              }
            ]
          },
          "taskCount": 3,
          "parallelism": 1
        }
      ],
      "allocationPolicy": {
        "instances": [
          {
            "policy": {
              "provisioningModel": "PROVISIONING_MODEL",
              "machineType": "MACHINE_TYPE"
            }
          }
        ],
        "location": {
          "allowedLocations": [
            "ALLOWED_LOCATIONS"
          ]
        }
      },
      "logsPolicy": {
        "destination": "CLOUD_LOGGING"
      }
    }
    

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

    • ‫PROVISIONING_MODEL: מודל ההקצאה של אפשרות הצריכה: STANDARD למכונות וירטואליות על פי דרישה או SPOT למכונות וירטואליות במודל Spot.

    • ‫MACHINE_TYPE: סוג מכונת TPU נתמך עם מארח יחיד, לדוגמה ct5p-hightpu-4t.

    • ‫ALLOWED_LOCATIONS: המיקומים המותרים למשימה. במשימה שמשתמשת ב-TPU, צריך להגדיר את השדה allowedLocations[] לאזור שמציע את סוג המכונה של TPU – לדוגמה, zones/us-central1-a מציע את סוג המכונה של TPU ct5p-hightpu-4t.

  2. כדי ליצור ולהריץ את המשימה, משתמשים בפקודה gcloud batch jobs submit:

    gcloud batch jobs submit JOB_NAME \
        --location LOCATION \
        --config JSON_CONFIGURATION_FILE
    

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

    • ‫JOB_NAME: שם המשימה.

    • ‫LOCATION: המיקום של המשימה.

    • ‫JSON_CONFIGURATION_FILE: הנתיב לקובץ JSON עם פרטי ההגדרות של המשימה.

API

שולחים בקשת POST ל-method jobs.create שמציינת סוג מכונת TPU עם מארח יחיד, מגדירים את מודל ההקצאה ל-STANDARD או ל-SPOT ומריצים במיקום שבו סוג מכונת ה-TPU זמין.

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

POST https://batch.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/jobs?job_id=JOB_NAME

{
  "taskGroups": [
    {
      "taskSpec": {
        "runnables": [
          {
            "script": {
              "text": "echo Hello world from TPU task ${BATCH_TASK_INDEX}."
            }
          }
        ]
      },
      "taskCount": 3,
      "parallelism": 1
    }
  ],
  "allocationPolicy": {
    "instances": [
      {
        "policy": {
          "provisioningModel": "PROVISIONING_MODEL",
          "machineType": "MACHINE_TYPE"
        }
      }
    ],
    "location": {
      "allowedLocations": [
        "ALLOWED_LOCATIONS"
      ]
    }
  },
  "logsPolicy": {
    "destination": "CLOUD_LOGGING"
  }
}

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

  • ‫PROJECT_ID: מזהה הפרויקט שלכם.

  • ‫LOCATION: המיקום של המשימה.

  • ‫JOB_NAME: שם המשימה.

  • ‫PROVISIONING_MODEL: מודל ההקצאה של אפשרות הצריכה: STANDARD למכונות וירטואליות על פי דרישה או SPOT למכונות וירטואליות במודל Spot.

  • ‫MACHINE_TYPE: סוג מכונת TPU נתמך עם מארח יחיד, לדוגמה ct5p-hightpu-4t.

  • ‫ALLOWED_LOCATIONS: המיקומים המותרים למשימה. במשימה שמשתמשת ב-TPU, צריך להגדיר את השדה allowedLocations[] לאזור שמציע את סוג המכונה של TPU – לדוגמה, zones/us-central1-a מציע את סוג המכונה של TPU ct5p-hightpu-4t.

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

אתם יכולים ליצור משימה שמשתמשת ב-TPU עם אפשרות צריכה למודל הקצאת המשאבים שמוגבל למקומות שמורים (RESERVATION_BOUND) – מקומות שמורים עתידיים לגושי קיבולת או מקומות שמורים עתידיים במצב תזמון – באמצעות ה-CLI של gcloud או Batch API.

gcloud

  1. יוצרים קובץ תצורה בפורמט JSON שמציין הקצאת מקום למכונה מסוג TPU עם מארח יחיד, מגדיר את מודל ההקצאה ל-RESERVATION_BOUND ופועל באזור של הקצאת המקום.

    לדוגמה, כדי ליצור משימת סקריפט בסיסית, יוצרים קובץ JSON עם התוכן הבא:

    {
      "taskGroups": [
        {
          "taskSpec": {
            "runnables": [
              {
                "script": {
                  "text": "echo Hello world from TPU task ${BATCH_TASK_INDEX}."
                }
              }
            ]
          },
          "taskCount": 3,
          "parallelism": 1
        }
      ],
      "allocationPolicy": {
        "instances": [
          {
            "policy": {
              "provisioningModel": "RESERVATION_BOUND",
              "reservation": "RESERVATION",
              "machineType": "MACHINE_TYPE"
            }
          }
        ],
        "location": {
          "allowedLocations": [
            "ALLOWED_LOCATIONS"
          ]
        }
      },
      "logsPolicy": {
        "destination": "CLOUD_LOGGING"
      }
    }
    

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

    • RESERVATION: מחליפים באחד מהנתיבים הבאים להזמנה:

      • אם אתם רוצים להשתמש במקום שמור לעתיד במצב תזמון או בכל חלק של המקום השמור למקום שמור לעתיד לגושי קיבולת, ציינו את המקום השמור:

        projects/PROJECT_ID/zones/ZONE/reservations/RESERVATION_NAME
        
      • אם אתם רוצים להשתמש בבלוק ספציפי ממקום שמור לעתיד של גושי קיבולת, ציינו את הבלוק של המקום השמור:

        projects/PROJECT_ID/zones/ZONE/reservations/RESERVATION_NAME/reservationBlocks/BLOCK_NAME
        
      • אם אתם רוצים להשתמש בבלוק משנה ספציפי ממקום שמור לעתיד של בלוקים של קיבולת, ציינו את בלוק המשנה של המקום השמור:

        projects/PROJECT_ID/zones/ZONE/reservations/RESERVATION_NAME/reservationSubBlocks/SUB_BLOCK_NAME
        
    • ‫MACHINE_TYPE: סוג מכונת ה-TPU של ההזמנה, לדוגמה ct5p-hightpu-4t.

    • ‫ALLOWED_LOCATIONS: המיקומים המותרים למשימה. במשימה שמשתמשת ב-TPU שמורים, צריך להגדיר את השדה allowedLocations[] לאזור של ההזמנה. לדוגמה, zones/us-central1-a מציע את סוג המכונה ct5p-hightpu-4t של TPU.

  2. כדי ליצור ולהריץ את המשימה, משתמשים בפקודה gcloud batch jobs submit:

    gcloud batch jobs submit JOB_NAME \
        --location LOCATION \
        --config JSON_CONFIGURATION_FILE
    

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

    • ‫JOB_NAME: שם המשימה.

    • ‫LOCATION: המיקום של המשימה.

    • ‫JSON_CONFIGURATION_FILE: הנתיב לקובץ JSON עם פרטי ההגדרות של המשימה.

API

שולחים בקשת POST ל-jobs.create method שמציינת הקצאה לסוג מכונת TPU עם מארח יחיד, מגדירה את מודל ההקצאה ל-RESERVATION_BOUND ופועלת באזור של ההקצאה.

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

POST https://batch.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/jobs?job_id=JOB_NAME

{
  "taskGroups": [
    {
      "taskSpec": {
        "runnables": [
          {
            "script": {
              "text": "echo Hello world from TPU task ${BATCH_TASK_INDEX}."
            }
          }
        ]
      },
      "taskCount": 3,
      "parallelism": 1
    }
  ],
  "allocationPolicy": {
    "instances": [
      {
        "policy": {
          "provisioningModel": "RESERVATION_BOUND",
          "reservation": "RESERVATION",
          "machineType": "MACHINE_TYPE"
        }
      }
    ],
    "location": {
      "allowedLocations": [
        "ALLOWED_LOCATIONS"
      ]
    }
  },
  "logsPolicy": {
    "destination": "CLOUD_LOGGING"
  }
}

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

  • ‫PROJECT_ID: מזהה הפרויקט שלכם.

  • ‫LOCATION: המיקום של המשימה.

  • ‫JOB_NAME: שם המשימה.

  • ‫RESERVATION: מחליפים באחד מהנתיבים הבאים להזמנה:

    • אם אתם רוצים להשתמש במקום שמור לעתיד במצב תזמון או בכל חלק של המקום השמור למקום שמור לעתיד לגושי קיבולת, ציינו את המקום השמור:

      projects/PROJECT_ID/zones/ZONE/reservations/RESERVATION_NAME
      
    • אם אתם רוצים להשתמש בבלוק ספציפי ממקום שמור לעתיד של גושי קיבולת, ציינו את הבלוק של המקום השמור:

      projects/PROJECT_ID/zones/ZONE/reservations/RESERVATION_NAME/reservationBlocks/BLOCK_NAME
      
    • אם אתם רוצים להשתמש בבלוק משנה ספציפי ממקום שמור לעתיד של בלוקים של קיבולת, ציינו את בלוק המשנה של המקום השמור:

      projects/PROJECT_ID/zones/ZONE/reservations/RESERVATION_NAME/reservationSubBlocks/SUB_BLOCK_NAME
      
  • ‫MACHINE_TYPE: סוג מכונת ה-TPU של ההזמנה, לדוגמה ct5p-hightpu-4t.

  • ‫ALLOWED_LOCATIONS: המיקומים המותרים למשימה. במשימה שמשתמשת ב-TPU שמורים, צריך להגדיר את השדה allowedLocations[] לאזור של ההזמנה. לדוגמה, zones/us-central1-a מציע את סוג המכונה ct5p-hightpu-4t של TPU.

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

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