פריסת עומסי עבודה של TPU ב-GKE Standard

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

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

לפני שקוראים את הדף הזה, חשוב לוודא שמכירים את הנושאים הבאים:

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

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

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

תכנון ההגדרה של TPU

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

מוודאים שיש מכסת TPU

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

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

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

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

כדי ליצור מאגר צמתים של פרוסות TPU על פי דרישה או במחיר מוזל ב-GKE, צריך מכסת Compute Engine API. המכסה של Compute Engine API‏ (compute.googleapis.com) שונה מהמכסה של Cloud TPU API‏ (tpu.googleapis.com), שנדרשת כשיוצרים יחידות TPU באמצעות Cloud TPU API.

כדי לבדוק את המגבלה ואת השימוש הנוכחי במכסת Compute Engine API עבור TPU:

  1. נכנסים לדף Quotas במסוף Google Cloud :

    לפתיחת הדף Quotas

  2. בתיבה Filter, מבצעים את הפעולות הבאות:

    1. משתמשים בטבלה הבאה כדי לבחור ולהעתיק את מאפיין המכסה בהתאם לגרסת ה-TPU ולסוג המכונה. לדוגמה, אם אתם מתכננים ליצור צמתים של TPU v5e על פי דרישה שסוג המכונה שלהם מתחיל ב-ct5lp-, צריך להזין Name: TPU v5 Lite PodSlice chips.

      גרסת TPU, סוג המכונה מתחיל ב- המאפיין והשם של המכסה עבור מופעים על פי דרישה המאפיין והשם של המכסה למכונות Spot2
      ‫TPU v3,‏
      ct3-
      Dimensions (e.g. location):
      tpu_family:CT3
      לא רלוונטי
      ‫TPU v3,‏
      ct3p-
      Dimensions (e.g. location):
      tpu_family:CT3P
      לא רלוונטי
      TPU v4,
      ct4p-
      Name:
      TPU v4 PodSlice chips
      Name:
      Preemptible TPU v4 PodSlice chips
      TPU v5e,
      ct5lp-
      Name:
      TPU v5 Lite PodSlice chips
      Name:
      Preemptible TPU v5 Lite Podslice
      chips
      ‫TPU v5p,
      ct5p-
      Name:
      TPU v5p chips
      Name:
      Preemptible TPU v5p chips
      TPU Trillium,
      ct6e-
      Dimensions (e.g. location):
      tpu_family:CT6E
      Name:
      Preemptible TPU slices v6e
      ‫Ironwood (TPU7x) (תצוגה מקדימה),
      tpu7x-standard-4t
      Dimensions (e.g. location):
      tpu_family:tpu7x
      Name:
      Preemptible TPU slices tpu7x
    2. בוחרים את המאפיין Dimensions (e.g. locations) (מאפיינים (למשל מיקומים)) ומזינים region: ואחריו את שם האזור שבו אתם מתכננים ליצור יחידות TPU ב-GKE. לדוגמה, מזינים region:us-west4 אם מתכננים ליצור צמתים של חלקי TPU באזור us-west4-a. מכסת ה-TPU היא אזורית, ולכן כל האזורים באותו אזור צורכים את אותה מכסת TPU.

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

כשיוצרים הזמנה של TPU, גם המגבלה וגם ערכי השימוש הנוכחיים של המכסה המתאימה גדלים במספר הצ'יפים בהזמנת ה-TPU. לדוגמה, כשיוצרים הזמנה ל-16 שבבי TPU v5e, שסוג המכונה שלהם מתחיל ב-ct5lp-, הערכים Limit (מגבלה) ו-Current usage (שימוש נוכחי) של מכסת TPU v5 Lite PodSlice chips באזור הרלוונטי גדלים ב-16.

  1. כשיוצרים מאגר צמתים של חלקי TPU, משתמשים בדגלים --reservation ו---reservation-affinity=specific כדי ליצור מופע קבוע-מראש. אפשר להזמין TPU כשרוכשים התחייבות.

  2. כשיוצרים מאגר צמתים של חלקי TPU, משתמשים בדגל --spot כדי ליצור מכונת Spot.

מכסות למשאבי GKE נוספים

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

  • מכסת SSD של Persistent Disk (GB): דיסק האתחול של כל צומת Kubernetes דורש 100GB כברירת מחדל. לכן, צריך להגדיר את המכסה הזה לפחות בגובה של מכפלת מספר הצמתים המקסימליים של GKE שאתם צופים ליצור ב-100GB (צמתים * 100GB).
  • מכסת כתובות IP בשימוש: כל צומת Kubernetes צורך כתובת IP אחת. לכן, צריך להגדיר את המכסה הזו לפחות כמספר המקסימלי של צמתי GKE שאתם צפויים ליצור.
  • מוודאים ש-max-pods-per-node תואם לטווח של רשת המשנה: כל צומת Kubernetes משתמש בטווחים משניים של כתובות IP עבור קבוצות Pod. לדוגמה, max-pods-per-node מתוך 32 דורש 64 כתובות IP, שמתורגמות לתת-רשת ‎ /26 לכל צומת. חשוב לדעת שאסור לשתף את הטווח הזה עם אף אשכול אחר. כדי להימנע ממיצוי טווח כתובות ה-IP, משתמשים בדגל --max-pods-per-node כדי להגביל את מספר הפודים שאפשר לתזמן בצומת. המכסה של max-pods-per-node צריכה להיות לפחות גבוהה כמו המספר המקסימלי של צמתי GKE שאתם מתכננים ליצור.

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

בדיקה שההזמנה זמינה

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

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

יצירת אשכול

אפשר ליצור אשכול שמשתמש ב-TPU באמצעות Google Cloud CLI או חבילת עיבוד מואץ (XPK).

  • משתמשים ב-CLI של gcloud כדי ליצור באופן ידני את מופע אשכול GKE להתאמה אישית מדויקת או להרחבה של סביבות GKE קיימות בייצור.
  • אפשר להשתמש ב-XPK כדי ליצור במהירות אשכולות GKE ולהפעיל עומסי עבודה לצורך הוכחת היתכנות ובדיקות. מידע נוסף מופיע בקובץ ה-README של XPK.

gcloud

יוצרים אשכול GKE במצב רגיל באזור עם TPU זמינים.

שיטה מומלצת:

משתמשים באשכולות אזוריים, שמספקים זמינות גבוהה של רמת הבקרה של Kubernetes.

gcloud container clusters create CLUSTER_NAME \
  --location LOCATION \
  --cluster-version VERSION

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

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

xpk

  1. כדי להתקין XPK, מבצעים את השלבים בקובץ XPK installation.
  2. יוצרים אשכול GKE במצב רגיל באזור עם TPU זמינים. הפקודה הבאה יוצרת את אשכול GKE עם מאגר צמתים שכולל את משאבי ה-TPU שצוינו:

    xpk cluster create \
      --cluster=$CLUSTER_NAME \
      --project=$PROJECT_ID \
      --zone=$ZONE \
      --tpu-type=$ACCELERATOR_TYPE \
      --num-slices=NUM_SLICES \
      --reservation=$RESERVATION_NAME
    

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

    • CLUSTER_NAME: שם לאשכול.
    • PROJECT_ID: מזהה הפרויקט ב- Google Cloud .
    • ZONE: שם האזור בהתאם לגרסת ה-TPU שרוצים להשתמש בה. כדי לזהות מיקום זמין, אפשר לעיין במאמר זמינות של TPU ב-GKE. כדי להשתמש בקיבולת שהוזמנה, צריך לוודא שמשתמשים באזור שבו הוזמנה הקיבולת.
    • ACCELERATOR_TYPE: סוג ה-TPU ואחריו הטופולוגיה או מספר הליבות, למשל tpu7x-16.
    • NUM_SLICES: מספר מאגרי הצמתים של פרוסות TPU.
    • RESERVATION_NAME: השם של ההזמנה.

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

  See your GKE Cluster here:  https://console.cloud.google.com/kubernetes/clusters/details/<location>/CLUSTER_NAME/details?project=PROJECT_ID

‫XPK מספק כתובות URL למסוף Google Cloud . שומרים את כתובות ה-URL האלה, שאפשר להשתמש בהן כדי לעקוב אחרי מדדים של אשכולות ועומסי עבודה.

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

הקצאת מעבדי TPU

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

יצירה ידנית של מאגר צמתים

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

יצירת מאגר צמתים של פלח TPU עם מארח יחיד

אפשר ליצור מאגר צמתים של פרוסת TPU במארח יחיד באמצעות Google Cloud CLI,‏ Terraform או מסוף Google Cloud .

gcloud

gcloud container node-pools create NODE_POOL_NAME \
    --location=LOCATION \
    --cluster=CLUSTER_NAME \
    --node-locations=NODE_ZONES \
    --machine-type=MACHINE_TYPE \
    [--sandbox=type=gvisor]

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

  • NODE_POOL_NAME: השם של מאגר הצמתים החדש.
  • LOCATION: שם האזור בהתאם לגרסת ה-TPU שרוצים להשתמש בה. כדי לזהות מיקום זמין, אפשר לעיין במאמר זמינות של TPU ב-GKE.
  • CLUSTER_NAME: שם האשכול.
  • NODE_ZONES: רשימה מופרדת בפסיקים של אזור אחד או יותר שבהם GKE יוצר את מאגר הצמתים.

    אופציונלי: אפשר להשתמש באזור AI, כמו us-central1-ai1a. אזורי AI הם מיקומים מיוחדים שעברו אופטימיזציה לעומסי עבודה של AI/ML בתוך אזורים Google Cloud .

  • MACHINE_TYPE: הגרסה והסוג של ה-TPU. לדוגמה, אפשר להשתמש ב-tpu7x-standard-4t עבור Ironwood ‏ (TPU7x).

אפשר גם להשתמש בדגלים הבאים:

  • --num-nodes=NUM_NODES: המספר הראשוני של הצמתים במאגר הצמתים בכל אזור.

    שיטה מומלצת:

    אם משתמשים בדגל enable-autoscaling בשביל מאגר הצמתים, צריך להגדיר את num-nodes לערך 0 כדי שהמידרוג האוטומטי יקצה צמתים נוספים ברגע שעומסי העבודה ידרשו אותם.

  • --reservation=RESERVATION_NAME: השם של ההזמנה ש-GKE משתמש בה כשיוצרים את מאגר הצמתים. אם לא מציינים את הדגל הזה, GKE משתמש ב-TPU זמינים. מידע נוסף על הזמנות TPU זמין במאמר מידע על הזמנות Cloud TPU.

  • --node-labels cloud.google.com/gke-workload-type=HIGH_AVAILABILITY: מציין ל-GKE שמאגר הצמתים של פרוסת ה-TPU במארח יחיד הוא חלק מאוסף. משתמשים בדגל הזה אם התנאים הבאים מתקיימים:

    • מאגר הצמתים מריץ עומס עבודה של הסקת מסקנות במאגר הצמתים החדש.
    • מאגר הצמתים משתמש ב-TPU Trillium.
    • מאגר הצמתים לא משתמש במכונות וירטואליות מסוג Spot.

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

  • --enable-autoscaling: יצירת מאגר צמתים עם הפעלה של שינוי גודל אוטומטי. נדרשים הדגלים הנוספים הבאים:

    • --total-min-nodes=TOTAL_MIN_NODES: מספר המינימום של כל הצמתים במאגר הצמתים.
    • --total-max-nodes=TOTAL_MAX_NODES: המספר המקסימלי של כל הצמתים במאגר הצמתים.
    • --location-policy=ANY: לתת עדיפות לשימוש בהזמנות שלא נעשה בהן שימוש ולהפחית את הסיכון להפסקת השימוש במכונות וירטואליות מסוג Spot.
  • --spot: מגדיר את מאגר הצמתים לשימוש במכונות וירטואליות במודל Spot עבור הצמתים במאגר הצמתים. אי אפשר לשנות את ההגדרה הזו אחרי שיוצרים את מאגר הצמתים.

  • --flex-start: הגדרת מאגר הצמתים לשימוש במכונות וירטואליות מסוג Flex-start. מכונות וירטואליות מסוג Flex-start נוצרות באמצעות אפשרות הצריכה flex-start. מידע נוסף זמין במאמר הרצת עומס עבודה קטן של אצווה באמצעות מכונות וירטואליות עם TPU ועם הפעלה גמישה.

רשימה מלאה של כל הדגלים שאפשר לציין מופיעה במאמר העזר בנושא gcloud container clusters create.

Terraform

  1. צריך לוודא שמשתמשים בגרסה 4.84.0 ואילך של ספק google.
  2. מוסיפים את הבלוק הבא להגדרות של Terraform:
resource "google_container_node_pool" "NODE_POOL_RESOURCE_NAME" {
  provider           = google
  project            = PROJECT_ID
  cluster            = CLUSTER_NAME
  name               = POOL_NAME
  location           = CLUSTER_LOCATION
  node_locations     = [NODE_ZONES]

  node_config {
    machine_type = MACHINE_TYPE
    reservation_affinity {
      consume_reservation_type = "SPECIFIC_RESERVATION"
      key = "compute.googleapis.com/reservation-name"
      values = [RESERVATION_LABEL_VALUES]
    }
    spot = true
    flex_start = false
  }
}

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

  • NODE_POOL_RESOURCE_NAME: השם של משאב מאגר הצמתים בתבנית Terraform.
  • PROJECT_ID: מזהה הפרויקט.
  • CLUSTER_NAME: השם של האשכול הקיים.
  • POOL_NAME: השם של מאגר הצמתים שרוצים ליצור.
  • CLUSTER_LOCATION: אזורי המחשוב של האשכול. מציינים את האזור שבו גרסת ה-TPU זמינה. מידע נוסף זמין במאמר בחירת גרסה וטופולוגיה של TPU.
  • NODE_ZONES: רשימה מופרדת בפסיקים של אזור אחד או יותר שבהם GKE יוצר את מאגר הצמתים.

    אופציונלי: אפשר להשתמש באזור AI, כמו us-central1-ai1a. אזורי AI הם מיקומים מיוחדים שעברו אופטימיזציה לעומסי עבודה של AI/ML בתוך אזורים Google Cloud .

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

אפשר גם להשתמש במשתנים הבאים:

  • autoscaling: יצירת מאגר צמתים עם הפעלה של שינוי גודל אוטומטי. ב-TPU slice עם מארח יחיד, GKE מבצע שינוי גודל בין הערכים TOTAL_MIN_NODES ל-TOTAL_MAX_NODES.
    • TOTAL_MIN_NODES: מספר הצמתים המינימלי במאגר הצמתים. השדה הזה הוא אופציונלי, אלא אם מצוין גם שינוי גודל אוטומטי.
    • TOTAL_MAX_NODES: המספר המקסימלי של כל הצמתים במאגר הצמתים. השדה הזה הוא אופציונלי, אלא אם מצוין גם שינוי גודל אוטומטי.
  • RESERVATION_NAME: אם משתמשים במידע על הזמנות של Cloud TPU, זוהי רשימת התוויות של משאבי ההזמנה שבהן צריך להשתמש כשיוצרים את מאגר הצמתים. מידע נוסף על אכלוס השדה RESERVATION_LABEL_VALUES ב-reservation_affinity זמין במאמר בנושא Terraform Provider.
  • spot: מגדיר את מאגר הצמתים לשימוש ב-VMs במודל Spot עבור צמתי ה-TPU. אי אפשר לשנות את ההגדרה הזו אחרי שיוצרים את מאגר הצמתים. מידע נוסף זמין במאמר בנושא מכונות וירטואליות מסוג Spot.
  • flex_start: מגדיר את מאגר הצמתים לשימוש באפשרות הצריכה flex-start. אי אפשר להגדיר את הערך true אם האפשרות spot מופעלת. התכונה 'התחלה גמישה' נתמכת ב-GKE בגרסה ‎1.33.0-gke.1712000 ואילך.

המסוף

כדי ליצור מאגר צמתים עם מעבדי TPU:

  1. נכנסים לדף Google Kubernetes Engine במסוף Google Cloud .

    מעבר אל Google Kubernetes Engine

  2. ברשימת האשכולות, לוחצים על שם האשכול שרוצים לשנות.

  3. לוחצים על הוספת מאגר צמתים.

  4. בקטע Node pool details (פרטי מאגר הצמתים), מסמנים את התיבה Specify node locations (ציון מיקומי צמתים).

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

  6. בחלונית הניווט, לוחצים על צמתים.

  7. בקטע Machine Configuration (הגדרת המכונה), בוחרים באפשרות TPUs.

  8. בתפריט הנפתח סדרה, בוחרים אחת מהאפשרויות הבאות:

    • CT3: TPU v3, מכשיר מארח יחיד
    • CT3P: TPU v3, multi host pod slice
    • CT4P: TPU v4
    • CT5LP: TPU v5e
    • CT5P: TPU v5p
    • CT6E: TPU Trillium (v6e)
  9. בתפריט הנפתח Machine type (סוג המכונה), בוחרים את שם המכונה שרוצים להשתמש בה עבור הצמתים. כדי להגדיר את סוג המכונה ואת טופולוגיית ה-TPU שיוצרים מאגר צמתים של פרוסת TPU במארח יחיד, אפשר להיעזר בטבלה בחירת גרסת ה-TPU.

  10. בתפריט הנפתח TPU Topology (טופולוגיית TPU), בוחרים את הטופולוגיה הפיזית של פרוסת ה-TPU.

  11. בתיבת הדו-שיח נדרשים שינויים, לוחצים על ביצוע שינויים.

  12. מוודאים שסוג דיסק האתחול הוא דיסק מתמיד סטנדרטי או דיסק מתמיד שמבוסס על SSD.

  13. אופציונלי: מסמנים את תיבת הסימון Enable nodes on spot VMs כדי להשתמש במכונות וירטואליות זמניות (Spot) עבור הצמתים במאגר הצמתים.

  14. לוחצים על יצירה.

יצירת מאגר צמתים של פרוסת TPU עם כמה מארחים

השלבים ליצירת מאגר צמתים של פרוסת TPU עם כמה מארחים שונים, בהתאם לגרסת ה-TPU שבה אתם משתמשים: Ironwood‏ (TPU7x) או גרסה קודמת של TPU.

‫Ironwood (TPU7x)

אפשר ליצור מאגר צמתים של פרוסת TPU עם כמה מארחים בגרסה Ironwood‏ (TPU7x) באמצעות Google Cloud CLI או Terraform:

gcloud

כדי ליצור מאגר צמתים של פרוסת TPU עם כמה מארחים באמצעות Ironwood‏ (TPU7x), צריך קודם ליצור מדיניות עומס עבודה.

  1. יוצרים מדיניות של עומסי עבודה:

    gcloud compute resource-policies create workload-policy WORKLOAD_POLICY_NAME \
        --type=HIGH_THROUGHPUT \
        --accelerator-topology=TPU_TOPOLOGY \
        --project=PROJECT_ID \
        --region=REGION
    

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

    • WORKLOAD_POLICY_NAME: שם למדיניות של עומס העבודה.
    • TPU_TOPOLOGY: טופולוגיית TPU Ironwood‏ (TPU7x). לדוגמה, 2x2x2. כדי לראות את כל הטופולוגיות הנתמכות של Ironwood‏ (TPU7x), אפשר לעיין בקטע בנושא טופולוגיה.
    • PROJECT_ID: מזהה הפרויקט ב- Google Cloud .
    • REGION: האזור של מדיניות עומס העבודה. מדיניות עומס עבודה היא משאב אזורי שאפשר לעשות בו שימוש חוזר במאגרי צמתים שחולקים את אותה טופולוגיה.
  2. יוצרים את מאגר הצמתים עם מדיניות עומס העבודה:

    gcloud container node-pools create NODE_POOL_NAME \
      --cluster=CLUSTER_NAME \
      --machine-type=tpu7x-standard-4t \
      --placement-policy=WORKLOAD_POLICY_NAME \
      --location=CONTROL_PLANE_LOCATION \
      --node-locations=NODE_ZONE \
      --project=PROJECT_ID \
      --reservation=RESERVATION_NAME \
      --reservation-affinity=specific
    

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

    • NODE_POOL_NAME: השם של מאגר הצמתים החדש.
    • CLUSTER_NAME: השם של אשכול GKE.
    • WORKLOAD_POLICY_NAME: השם של מדיניות עומס העבודה שיצרתם.
    • CONTROL_PLANE_LOCATION: המיקום של מישור הבקרה של האשכול ב-Compute Engine. מציינים אזור לאשכולות אזוריים או אזור זמין לאשכולות אזוריים.
    • NODE_ZONE: שם האזור בהתאם לגרסת ה-TPU שרוצים להשתמש בה.

      אופציונלי: אפשר להשתמש באזור AI, כמו us-central1-ai1a. אזורי AI הם מיקומים מיוחדים שעברו אופטימיזציה לעומסי עבודה של AI/ML בתוך אזורים Google Cloud .

      כדי לזהות מיקום זמין, אפשר לעיין במאמר זמינות של TPU ב-GKE.
    • PROJECT_ID: מזהה הפרויקט ב- Google Cloud .
    • RESERVATION_NAME: השם של ההזמנה לשימוש.

    בפקודה הזו, הדגל --tpu-topology הוחלף בדגל --placement-policy.

Terraform

  1. צריך לוודא שמשתמשים בגרסה 4.84.0 ואילך של ספק google.
  2. יוצרים מדיניות של עומסי עבודה:

    resource "google_compute_resource_policy" {
      name   = "WORKLOAD_POLICY_NAME"
      region = CLUSTER_LOCATION
      workload_policy {
        type = "HIGH_THROUGHPUT"
        accelerator_topology = "TPU_TOPOLOGY"
      }
    }
    

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

    • WORKLOAD_POLICY_NAME: שם למדיניות של עומס העבודה.
    • CLUSTER_LOCATION: מיקום החישוב של האשכול. מומלץ להשתמש באשכול אזורי כדי לשפר את המהימנות של מישור הבקרה של Kubernetes. אפשר גם להשתמש באשכול אזורי. מידע נוסף זמין במאמר בנושא בחירת גרסה וטופולוגיה של TPU.
    • TPU_TOPOLOGY: טופולוגיית TPU Ironwood‏ (TPU7x). לדוגמה, 2x2x2. כדי לראות את כל הטופולוגיות הנתמכות של Ironwood‏ (TPU7x), אפשר לעיין במאמר בנושא תכנון TPUs.

    מידע נוסף על ההפניה google_compute_resource_policy זמין במאמר Terraform Provider.

  3. מוסיפים את הבלוק הבא להגדרות של Terraform:

    resource "google_container_node_pool" "NODE_POOL_RESOURCE_NAME" {
      provider           = google
      project            = PROJECT_ID
      cluster            = CLUSTER_NAME
      name               = POOL_NAME
      location           = CLUSTER_LOCATION
      node_locations     = [NODE_ZONES]
      initial_node_count = NUM_NODES
    
      autoscaling {
        max_node_count = MAX_NODES
        location_policy      = "ANY"
      }
      node_config {
        machine_type = MACHINE_TYPE
        reservation_affinity {
          consume_reservation_type = "SPECIFIC_RESERVATION"
          key = "compute.googleapis.com/reservation-name"
          values = [RESERVATION_LABEL_VALUES]
        }
        flex_start = false
        spot = true
      }
    
      placement_policy {
        policy_name = WORKLOAD_POLICY_NAME
      }
    }
    

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

    • NODE_POOL_RESOURCE_NAME: השם של משאב מאגר הצמתים בתבנית Terraform.
    • PROJECT_ID: מזהה הפרויקט.
    • CLUSTER_NAME: השם של האשכול הקיים שאליו רוצים להוסיף את מאגר הצמתים.
    • POOL_NAME: השם של מאגר הצמתים שרוצים ליצור.
    • NODE_ZONES: רשימה מופרדת בפסיקים של אזור אחד או יותר שבהם GKE יוצר את מאגר הצמתים.

      אופציונלי: אפשר להשתמש באזור AI, כמו us-central1-ai1a. אזורי AI הם מיקומים מיוחדים שעברו אופטימיזציה לעומסי עבודה של AI/ML בתוך אזורים Google Cloud .

    • NUM_NODES: מספר הצמתים במאגר הצמתים. הערך צריך להיות אפס או מכפלה של מספר שבבי ה-TPU חלקי ארבע, כי בכל צומת של פרוסת TPU עם כמה מארחים יש ארבעה שבבים. לדוגמה, אם TPU_TOPOLOGY הוא 4x8, יש 32 שבבים, ולכן הערך של NUM_NODES צריך להיות 8. מידע נוסף על טופולוגיות של TPU זמין בטבלה שבמאמר בחירת גרסת ה-TPU.
    • TPU_TOPOLOGY: מציין את הטופולוגיה הפיזית שנבחרה עבור פרוסת ה-TPU. הפורמט של הטופולוגיה תלוי בגרסת ה-TPU שבה אתם משתמשים. מידע נוסף על טופולוגיות של TPU זמין בטבלה שבקטע בחירת טופולוגיה.

    אפשר גם להשתמש במשתנים הבאים:

    • RESERVATION_NAME: אם משתמשים בהזמנת TPU, צריך לספק רשימה של תוויות משאבי הזמנה לשימוש כשיוצרים את מאגר הצמתים. מידע נוסף על אכלוס השדה RESERVATION_LABEL_VALUES ב-reservation_affinity זמין במאמר בנושא Terraform Provider.
    • autoscaling: יצירת מאגר צמתים עם הפעלה של שינוי גודל אוטומטי. כש-GKE מבצע שינוי גודל של מאגר צמתים של פרוסת TPU מרובת-מארחים, הוא מבצע שינוי גודל של מאגר הצמתים מאפס לגודל המקסימלי באופן אטומי.
      • MAX_NODES: הגודל המקסימלי של מאגר הצמתים. הערך צריך להיות שווה למכפלה של הערכים שמוגדרים ב-TPU_TOPOLOGY ({A}x{B}x{C}) חלקי מספר השבבים בכל מכונה וירטואלית. לדוגמה, אם הערך של TPU_TOPOLOGY הוא 2x2x2, המוצר הוא 8. מכיוון שלכל מכונה וירטואלית ב-tpu7x-standard-4t יש 4 שבבים, מספר הצמתים הוא 2.
    • spot: מאגר הצמתים שישתמש במכונות וירטואליות במודל Spot לצמתים של חלוקת ה-TPU. אי אפשר לשנות את ההגדרה הזו אחרי שיוצרים את מאגר הצמתים. מידע נוסף זמין במאמר בנושא מכונות וירטואליות מסוג Spot.
    • flex_start: מאגר הצמתים שישתמש באפשרות הצריכה flex-start. אי אפשר להגדיר את ההגדרה הזו לערך true אם ההגדרה spot מופעלת.

גרסאות אחרות של TPU

אפשר ליצור מאגר צמתים של פרוסת TPU עם כמה מארחים בגרסאות v3,‏ v4,‏ v5p,‏ v5e ו-Trillium ‏ (v6e) באמצעות Google Cloud CLI,‏ Terraform או Google Cloud המסוף.

gcloud

  gcloud container node-pools create POOL_NAME \
      --location=CONTROL_PLANE_LOCATION \
      --cluster=CLUSTER_NAME \
      --node-locations=NODE_ZONE \
      --machine-type=MACHINE_TYPE \
      --tpu-topology=TPU_TOPOLOGY \
      [--num-nodes=NUM_NODES] \
      [--spot \]
      [--flex-start \]
      [--enable-autoscaling \
        --max-nodes MAX_NODES]
      [--reservation-affinity=specific \
      --reservation=RESERVATION_NAME] \
      [--node-labels cloud.google.com/gke-nodepool-group-name=COLLECTION_NAME,cloud.google.com/gke-workload-type=HIGH_AVAILABILITY]
      [--placement-type=COMPACT]

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

  • POOL_NAME: השם של מאגר הצמתים החדש.
  • CONTROL_PLANE_LOCATION: שם האזור בהתאם לגרסת ה-TPU שרוצים להשתמש בה. כדי לזהות מיקום זמין, אפשר לעיין במאמר זמינות של TPU ב-GKE.
  • CLUSTER_NAME: שם האשכול.
  • NODE_ZONES: רשימה מופרדת בפסיקים של אזור אחד או יותר שבהם GKE יוצר את מאגר הצמתים.

    אופציונלי: אפשר להשתמש באזור AI, כמו us-central1-ai1a. אזורי AI הם מיקומים מיוחדים שעברו אופטימיזציה לעומסי עבודה של AI/ML בתוך אזורים Google Cloud .

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

    מידע נוסף זמין במאמר בנושא טופולוגיה.

    אפשר גם להשתמש בדגלים הבאים:

  • NUM_NODES: מספר הצמתים במאגר הצמתים. הערך צריך להיות אפס או מכפלת הערכים שמוגדרים ב-TPU_TOPOLOGY ({A}x{B}x{C}) חלקי מספר השבבים בכל מכונה וירטואלית. ב-TPU v4 וב-TPU v5e עם כמה מארחים, מספר הצ'יפים בכל מכונה וירטואלית הוא ארבע. לכן, אם TPU_TOPOLOGY הוא 2x4x4 (TPU v4 עם ארבעה שבבים בכל מכונה וירטואלית), אז NUM_NODES הוא 32/4, כלומר 8. אם לא מציינים את הדגל הזה, מספר הצמתים מחושב ומוגדר כברירת מחדל על סמך הטופולוגיה וסוג המכונה.

  • RESERVATION_NAME: השם של ההזמנה ש-GKE משתמש בה כשיוצרים את מאגר הצמתים. אם לא מציינים את הדגל הזה, GKE משתמש במאגרי צמתים של פרוסות TPU שזמינים. מידע נוסף על הזמנות TPU זמין במאמר הזמנת TPU.

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

  • --flex-start: הגדרת מאגר הצמתים לשימוש במכונות וירטואליות מסוג Flex-start. מכונות וירטואליות עם הפעלה גמישה נוצרות באמצעות אפשרות הצריכה flex-start, שנתמכת ב-GKE מגרסה ‎1.33.0-gke.1712000 ואילך.

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

    • MAX_NODES: הגודל המקסימלי של מאגר הצמתים. חובה להשתמש בדגל --max-nodes אם מציינים את --enable-autoscaling, והוא צריך להיות שווה למכפלה של הערכים שמוגדרים ב-TPU_TOPOLOGY ({A}x{B}x{C}) חלקי מספר השבבים בכל מכונה וירטואלית.
  • --node-label=cloud.google.com/gke-nodepool-group-name=COLLECTION_NAME, cloud.google.com/gke-workload-type=HIGH_AVAILABILITY: מציין ל-GKE שמאגר הצמתים של פרוסת ה-TPU עם כמה מארחים הוא אוסף. משתמשים בדגל הזה אם התנאים הבאים מתקיימים:

    • מאגר הצמתים מריץ עומסי עבודה של היקשים.
    • מאגר הצמתים משתמש ב-TPU Trillium.
    • אי אפשר לתזמן איסוף של נתונים מ-VMs במודל Spot.

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

  • --placement-type=COMPACT: יצירת מאגר צמתים עם מיקום קומפקטי מופעל. חובה להשתמש באפשרות הזו עם הדגל --tpu-topology. מידע נוסף זמין במאמרים בנושא יצירת מדיניות מיקום קומפקטית וטופולוגיה של TPU.

Terraform

  1. צריך לוודא שמשתמשים בגרסה 4.84.0 ואילך של ספק google.
  2. מוסיפים את הבלוק הבא להגדרות של Terraform:

    resource "google_container_node_pool" "NODE_POOL_RESOURCE_NAME" {
      provider           = google
      project            = PROJECT_ID
      cluster            = CLUSTER_NAME
      name               = POOL_NAME
      location           = CLUSTER_LOCATION
      node_locations     = [NODE_ZONES]
      initial_node_count = NUM_NODES
    
      autoscaling {
        max_node_count = MAX_NODES
        location_policy      = "ANY"
      }
      node_config {
        machine_type = MACHINE_TYPE
        reservation_affinity {
          consume_reservation_type = "SPECIFIC_RESERVATION"
          key = "compute.googleapis.com/reservation-name"
          values = [RESERVATION_LABEL_VALUES]
        }
        flex_start = false
        spot = true
      }
    
      placement_policy {
        type = "COMPACT"
        tpu_topology = TPU_TOPOLOGY
      }
    }
    

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

    • NODE_POOL_RESOURCE_NAME: השם של משאב מאגר הצמתים בתבנית Terraform.
    • PROJECT_ID: מזהה הפרויקט.
    • CLUSTER_NAME: השם של האשכול הקיים שאליו רוצים להוסיף את מאגר הצמתים.
    • POOL_NAME: השם של מאגר הצמתים שרוצים ליצור.
    • CLUSTER_LOCATION: מיקום המחשוב של האשכול. מומלץ להשתמש באשכול אזורי כדי לשפר את המהימנות של מישור הבקרה של Kubernetes. אפשר גם להשתמש באשכול אזורי. מידע נוסף זמין במאמר בנושא בחירת גרסה וטופולוגיה של TPU.
    • NODE_ZONES: רשימה מופרדת בפסיקים של אזור אחד או יותר שבהם GKE יוצר את מאגר הצמתים.

      אופציונלי: אפשר להשתמש באזור AI, כמו us-central1-ai1a. אזורי AI הם מיקומים מיוחדים שעברו אופטימיזציה לעומסי עבודה של AI/ML בתוך אזורים Google Cloud .

    • NUM_NODES: מספר הצמתים במאגר הצמתים. הערך צריך להיות אפס או מכפלה של מספר שבבי ה-TPU חלקי ארבע, כי בכל צומת של פרוסת TPU מרובת מארחים יש 4 שבבים. לדוגמה, אם TPU_TOPOLOGY הוא 4x8, יש 32 צ'יפים, ולכן NUM_NODES צריך להיות 8. מידע נוסף על טופולוגיות של TPU זמין בטבלה שבמאמר בחירת גרסת ה-TPU.
    • TPU_TOPOLOGY: מציין את הטופולוגיה הפיזית של פרוסת ה-TPU. הפורמט של הטופולוגיה תלוי בגרסת ה-TPU שבה אתם משתמשים. מידע נוסף על טופולוגיות של TPU זמין בטבלה שבקטע בחירת טופולוגיה.

    אפשר גם להשתמש במשתנים הבאים:

    • RESERVATION_NAME: אם משתמשים בהזמנת TPU, זו רשימת התוויות של משאבי ההזמנה שבהן צריך להשתמש כשיוצרים את מאגר הצמתים. מידע נוסף על אכלוס השדה RESERVATION_LABEL_VALUES ב-reservation_affinity זמין במאמר בנושא Terraform Provider.
    • autoscaling: יוצרים מאגר צמתים עם הפעלה של שינוי גודל אוטומטי. כש-GKE מבצע שינוי גודל של מאגר צמתים של פרוסת TPU מרובת-מארחים, הוא מבצע שינוי גודל של מאגר הצמתים מאפס לגודל המקסימלי באופן אטומי.
      • MAX_NODES: הגודל המקסימלי של מאגר הצמתים. הוא צריך להיות שווה למכפלת הערכים שמוגדרים ב-TPU_TOPOLOGY ({A}x{B}x{C}) חלקי מספר השבבים בכל מכונה וירטואלית).
    • spot: מאפשרת למאגר הצמתים להשתמש במכונות וירטואליות במודל Spot עבור צמתי הפרוסה של ה-TPU. אי אפשר לשנות את ההגדרה הזו אחרי שיוצרים את מאגר הצמתים. מידע נוסף זמין במאמר בנושא מכונות וירטואליות מסוג Spot.
    • flex_start: מגדיר את מאגר הצמתים לשימוש באפשרות הצריכה flex-start. אי אפשר להגדיר את הערך true אם האפשרות spot מופעלת.

המסוף

כדי ליצור מאגר צמתים עם מעבדי TPU:

  1. נכנסים לדף Google Kubernetes Engine במסוף Google Cloud .

    מעבר אל Google Kubernetes Engine

  2. ברשימת האשכולות, לוחצים על שם האשכול שרוצים לשנות.

  3. לוחצים על הוספת מאגר צמתים.

  4. בקטע Node pool details (פרטי מאגר הצמתים), מסמנים את התיבה Specify node locations (ציון מיקומי צמתים).

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

  6. בחלונית הניווט, לוחצים על צמתים.

  7. בקטע Machine Configuration (הגדרת המכונה), בוחרים באפשרות TPUs.

  8. בתפריט הנפתח סדרה, בוחרים אחת מהאפשרויות הבאות:

    • CT3: TPU v3, מכשיר עם מארח יחיד
    • CT3P: TPU v3, multi-host pod slice
    • CT4P: TPU v4
    • CT5LP: TPU v5e
    • CT5P: TPU v5p
    • CT6E: TPU Trillium (v6e)
  9. בתפריט הנפתח Machine type (סוג המכונה), בוחרים את שם המכונה שרוצים להשתמש בה עבור הצמתים. בעזרת הטבלה בחירת גרסת ה-TPU אפשר להגדיר את סוג המכונה ואת טופולוגיית ה-TPU שיוצרים מאגר צמתים של פרוסת TPU מרובת מארחים.

  10. בתפריט הנפתח TPU Topology (טופולוגיית TPU), בוחרים את הטופולוגיה הפיזית של פרוסת ה-TPU.

  11. בתיבת הדו-שיח נדרשים שינויים, לוחצים על ביצוע שינויים.

  12. מוודאים שסוג דיסק האתחול הוא דיסק מתמיד סטנדרטי או דיסק מתמיד שמבוסס על SSD.

  13. אפשר גם לסמן את תיבת הסימון Enable nodes on spot VMs כדי להשתמש במכונות וירטואליות מסוג Spot עבור הצמתים במאגר הצמתים.

  14. לוחצים על יצירה.

שימוש בהקצאת צמתים אוטומטית ב-GKE

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

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

      gcloud container clusters update CLUSTER_NAME \
          --location=CONTROL_PLANE_LOCATION \
          --enable-autoprovisioning \
          --min-cpu=MINIMUM_CPU \
          --min-memory=MINIMUM_MEMORY \
          --max-cpu=MAXIMUM_CPU \
          --max-memory=MAXIMUM_MEMORY \
          --min-accelerator=type=TPU_TYPE,count=MINIMUM_TPU_COUNT \
          --max-accelerator=type=TPU_TYPE,count=MAXIMUM_TPU_COUNT
    

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

    • TPU_TYPE: סוג ה-TPU. לדוגמה, משתמשים ב-tpu7x-standard-4t עבור Ironwood‏ (TPU7x).
    • MINIMUM_TPU_COUNT: המספר המינימלי של שבבי TPU מהסוג שצוין שיכולים להיות באשכול. אם הערך שאתם מציינים גדול ממספר שבבי ה-TPU בפלח TPU מרובה מארחים, GKE מסיר את כל הצמתים בפלח. השינוי בגודל של מאגרי צמתים עם כמה מארחים נע בין 0 למספר הצמתים בפרוסה, ללא ערכי ביניים.
    • MAXIMUM_TPU_COUNT: המספר המקסימלי של שבבי TPU מהסוג שצוין שיכולים להיות באשכול. במקרים של חלקי TPU עם כמה מארחים, צריך לציין ערך שגדול ממספר הצ'יפים בכל חלק, כדי ש-GKE יוכל לשנות את גודל החלק באופן אטומי. מספר השבבים בפרוסה הוא תוצאה של טופולוגיית ה-TPU. לדוגמה, אם הטופולוגיה היא 2x2x2, מספר השבבים בפרוסה הוא 8, כלומר הערך של MAXIMUM_TPU_COUNT חייב להיות גדול מ-8.

הגדרת ComputeClasses בהתאמה אישית

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

אפשר לציין אפשרויות הגדרה של TPU במפרט של ComputeClass מותאם אישית. כשעומס עבודה ב-GKE משתמש ב-ComputeClass המותאם אישית הזה, מערכת GKE מנסה להקצות מעבדי TPU שמשתמשים בהגדרה שציינתם כשמתבצעת הגדלה של הקיבולת.

בקטעים הבאים מוסבר איך ליצור ComputeClass בהתאמה אישית ואז ליצור Job שמשתמש ב-TPU שהוגדרו ב-ComputeClass.

יצירת ComputeClass בהתאמה אישית

השלבים ליצירת ComputeClass מותאם אישית בהתאם לכללי TPU משתנים בהתאם לגרסת ה-TPU שבה אתם משתמשים: Ironwood‏ (TPU7x) או גרסה קודמת של TPU.

‫Ironwood (TPU7x)

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

    gcloud compute resource-policies create workload-policy WORKLOAD_POLICY_NAME \
        --type=HIGH_THROUGHPUT \
        --accelerator-topology=TPU_TOPOLOGY \
        --project=PROJECT_ID \
        --region=REGION
    

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

    • WORKLOAD_POLICY_NAME: שם למדיניות של עומס העבודה.
    • TPU_TOPOLOGY: טופולוגיית TPU Ironwood‏ (TPU7x). לדוגמה, משתמשים ב-2x2x2. מידע נוסף על כל הטופולוגיות הנתמכות של Ironwood‏ (TPU7x) זמין בקטע על טופולוגיה.
    • PROJECT_ID: מזהה הפרויקט ב- Google Cloud .
    • REGION: האזור של מדיניות עומס העבודה. מדיניות עומס עבודה היא משאב אזורי, ואפשר להשתמש בה במאגרי צמתים.
  2. שומרים את קובץ המניפסט הבא בשם tpu-compute-class.yaml:

    apiVersion: cloud.google.com/v1
    kind: ComputeClass
    metadata:
      name: tpu-class
    spec:
      priorities:
        - tpu:
            type: tpu7x
            topology: TPU_TOPOLOGY
            count: 4
          placement:
            policyName: WORKLOAD_POLICY_NAME
      nodePoolAutoCreation:
        enabled: true
    
  3. (אופציונלי) אפשר להשתמש בהזמנה ספציפית או בחלק ספציפי של בלוק. לדוגמה, אפשר להוסיף את specs הבא למניפסט ComputeClass:

      reservations:
        affinity: Specific
        specific:
          - name: RESERVATION_NAME
            reservationBlock:
              name: RESERVATION_BLOCK_NAME
              reservationSubBlock:
                name: RESERVATION_SUB_BLOCK_NAME
    

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

    • RESERVATION_NAME: השם של הזמנת הקיבולת ב-Compute Engine.
    • RESERVATION_BLOCK_NAME: השם של בלוק הזמנת הקיבולת ב-Compute Engine.
    • RESERVATION_SUB_BLOCK_NAME: השם של תת-הבלוק של הזמנת הקיבולת ב-Compute Engine.

    מידע נוסף זמין במאמר שימוש במשאבים שמורים בתחום מוגדר.

גרסאות אחרות של TPU

כדי להקצות TPU מדור 3, 4,‏ v5p,‏ v5e או v6e (Trillium) באמצעות ComputeClass מותאם אישית שמוגדר ל-TPU, מבצעים את השלבים הבאים:

  1. שומרים את קובץ המניפסט הבא בשם tpu-compute-class.yaml:

    apiVersion: cloud.google.com/v1
    kind: ComputeClass
    metadata:
      name: tpu-class
    spec:
      priorities:
      - tpu:
          type: TPU_TYPE
          count: NUMBER_OF_CHIPS
          topology: TOPOLOGY
      - spot: true
        tpu:
          type: TPU_TYPE
          count: NUMBER_OF_CHIPS
          topology: TOPOLOGY
      - flexStart:
          enabled: true
        tpu:
          type: TPU_TYPE
          count: NUMBER_OF_CHIPS
          topology: TOPOLOGY
      nodePoolAutoCreation:
        enabled: true
    

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

    • TPU_TYPE: סוג ה-TPU לשימוש, כמו tpu-v4-podslice. הערך חייב להיות ערך שנתמך על ידי GKE.
    • TOPOLOGY: סידור שבבי ה-TPU בפרוסת ה-TPU, כמו 2x2x4. חובה לבחור טופולוגיה נתמכת לסוג ה-TPU שנבחר.
    • NUMBER_OF_CHIPS: מספר שבבי ה-TPU שהקונטיינר ישתמש בהם. הערכים של limits ושל requests חייבים להיות זהים.
  2. פורסים את ComputeClass:

    kubectl apply -f tpu-compute-class.yaml
    

    מידע נוסף על ComputeClasses ו-TPU בהתאמה אישית זמין במאמר הגדרת TPU.

יצירת משימה שצורכת TPU

  1. שומרים את קובץ המניפסט הבא בשם tpu-job.yaml:

    apiVersion: v1
    kind: Service
    metadata:
      name: headless-svc
    spec:
      clusterIP: None
      selector:
        job-name: tpu-job
    ---
    apiVersion: batch/v1
    kind: Job
    metadata:
      name: tpu-job
    spec:
      backoffLimit: 0
      completions: 4
      parallelism: 4
      completionMode: Indexed
      template:
        spec:
          subdomain: headless-svc
          restartPolicy: Never
          nodeSelector:
            cloud.google.com/compute-class: tpu-class
          containers:
          - name: tpu-job
            image: us-docker.pkg.dev/cloud-tpu-images/jax-ai-image/tpu:latest
            ports:
            - containerPort: 8471 # Default port using which TPU VMs communicate
            - containerPort: 8431 # Port to export TPU runtime metrics, if supported.
            command:
            - bash
            - -c
            - |
              python -c 'import jax; print("TPU cores:", jax.device_count())'
            resources:
              requests:
                cpu: 10
                memory: MEMORY_SIZE
                google.com/tpu: NUMBER_OF_CHIPS
              limits:
                cpu: 10
                memory: MEMORY_SIZE
                google.com/tpu: NUMBER_OF_CHIPS
    

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

    • NUMBER_OF_CHIPS: מספר שבבי ה-TPU שהקונטיינר ישתמש בהם. הערך של limits ושל requests חייב להיות זהה, שווה לערך של CHIP_COUNT ב-ComputeClass המותאם אישית שנבחר.
    • MEMORY_SIZE: כמות הזיכרון המקסימלית שבה נעשה שימוש ב-TPU. מגבלות הזיכרון תלויות בגרסת ה-TPU ובטופולוגיה שבהן אתם משתמשים. מידע נוסף על ערכי המינימום והמקסימום של מאיצים
    • NUMBER_OF_CHIPS: מספר שבבי ה-TPU שהקונטיינר ישתמש בהם. הערכים של limits ושל requests חייבים להיות זהים.
  2. פריסת המשרה:

    kubectl create -f tpu-job.yaml
    

    כשיוצרים את ה-Job הזה, מערכת GKE מבצעת באופן אוטומטי את הפעולות הבאות:

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

    מידע נוסף זמין במאמר מידע על ComputeClasses בהתאמה אישית.

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

    kubectl delete -f tpu-job.yaml
    

הכנת עומסי העבודה

עומסי עבודה של TPU מחייבים הכנה מראש.

  1. מסגרות כמו JAX,‏ PyTorch ו-TensorFlow ניגשות ל-TPU VM באמצעות הספרייה המשותפת libtpu. ‫libtpu כולל את מהדר XLA, תוכנת זמן הריצה של TPU ומנהל ההתקן של TPU. כל גרסה של PyTorch ו-JAX דורשת גרסה מסוימת של libtpu.so. כדי למנוע התנגשויות בין גרסאות של חבילות, מומלץ להשתמש בתמונה של AI ב-JAX. כדי להשתמש ב-TPU ב-GKE, צריך לוודא שאתם משתמשים בגרסאות הבאות: ‫tpu7x
    סוג ה-TPU גרסה libtpu.so
    ‫Ironwood‏ (TPU7x) (תצוגה מקדימה)
    ‫TPU Trillium (v6e)
    tpu-v6e-slice
    TPU v5e
    tpu-v5-lite-podslice
    TPU v5p
    tpu-v5p-slice
    • תמונת AI מומלצת של JAX: ‏ jax0.4.35-rev1 ואילך
    • הגרסה המומלצת של jax[tpu]:‏ 0.4.19 ואילך.
    • הגרסה המומלצת של torchxla[tpuvm]: מומלץ להשתמש בגרסת nightly שנבנתה ב-23 באוקטובר 2023.
    ‫TPU v4
    tpu-v4-podslice
    TPU v3
    tpu-v3-slice
    tpu-v3-device
  2. במניפסט של עומס העבודה, מוסיפים בוררי צמתים של Kubernetes כדי לוודא ש-GKE מתזמן את עומס העבודה של ה-TPU בסוג המכונה של ה-TPU ובטופולוגיית ה-TPU שהגדרתם:

      nodeSelector:
        cloud.google.com/gke-tpu-accelerator: TPU_ACCELERATOR
        cloud.google.com/gke-tpu-topology: TPU_TOPOLOGY
        cloud.google.com/placement-policy-name: WORKLOAD_POLICY # Required only for Ironwood (TPU7x)
      

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

    • TPU_ACCELERATOR: השם של מאיץ ה-TPU. לדוגמה, משתמשים ב-tpu7x-standard-4t.
    • TPU_TOPOLOGY: הטופולוגיה הפיזית של פרוסת ה-TPU. הפורמט של הטופולוגיה תלוי בגרסת ה-TPU. לדוגמה, משתמשים ב-2x2x2. מידע נוסף זמין במאמר תכנון השימוש ב-TPU ב-GKE.
    • WORKLOAD_POLICY: השם של מדיניות עומס העבודה שרוצים להשתמש בה כדי למקם את ה-TPU Pods. הצומת הזה נדרש רק ל-Ironwood ‏ (TPU7x).

אחרי שמסיימים להכין את עומס העבודה, אפשר להריץ Job שמשתמש ב-TPU.

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

הרצת עומס העבודה בצמתי TPU slice

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

דוגמה 1: הפעלת פריסה שמבקשת TPU במפרט של ה-Pod

gcloud

‫GKE משתמש בהגדרה ב-Pod או ב-ComputeClass כדי לקבוע את ההגדרה של צמתי ה-TPU. המניפסט הבא הוא דוגמה למפרט פריסה שמבקש TPU במפרט ה-Pod. אם ההגדרה של הקצאת צמתים אוטומטית ברמת האשכול מופעלת, פריסת ה-Deployment הזו מפעילה יצירה אוטומטית של מאגר צמתים. כשיוצרים את פריסת הדוגמה הזו, GKE יוצר מאגר צמתים שמכיל פרוסת TPU v4 עם טופולוגיה של 2x2x2 ושתי מכונות ct4p-hightpu-4t.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: tpu-workload
  labels:
    app: tpu-workload
spec:
  replicas: 2
  template:
    spec:
      nodeSelector:
        cloud.google.com/gke-tpu-accelerator: tpu-v4-podslice
        cloud.google.com/gke-tpu-topology: 2x2x2
      containers:
      - name: tpu-job
        image: us-docker.pkg.dev/cloud-tpu-images/jax-ai-image/tpu:latest
        ports:
        - containerPort: 8431 # Port to export TPU runtime metrics, if supported.
        securityContext:
          privileged: true # Required for GKE versions earlier than 1.28 to access TPUs.
        command:
        - bash
        - -c
        - |
          python -c 'import jax; print("Total TPU chips:", jax.device_count())'
        resources:
          requests:
            google.com/tpu: 4
          limits:
            google.com/tpu: 4
        ports:
        - containerPort: 80

במניפסט הזה, השדות הבאים מגדירים את תצורת ה-TPU:

  • cloud.google.com/gke-tpu-accelerator: הגרסה והסוג של TPU. לדוגמה, משתמשים ב-tpu7x-standard-4t עבור Ironwood (TPU7x).
  • cloud.google.com/gke-tpu-topology: הטופולוגיה עם המספר והסידור הפיזי של שבבי ה-TPU בתוך פרוסת TPU. לדוגמה, משתמשים ב-2x2x2.
  • limits.google.com/tpu: מספר שבבי ה-TPU לכל מכונה וירטואלית. לדוגמה, אם משתמשים ב-tpu7x-standard-4t, מספר שבבי ה-TPU לכל מכונה וירטואלית הוא 4.

xpk

xpk workload create \
  --cluster=$CLUSTER_NAME \
  --project=$PROJECT_ID \
  --zone=$ZONE \
  --tpu-type=$ACCELERATOR_TYPE \
  --num-slices=1 \
  --docker-image=us-docker.pkg.dev/cloud-tpu-images/jax-ai-image/tpu:latest \
  --workload=$WORKLOAD_NAME \
  --command="python -c 'import jax; print(\"TPU cores:\", jax.device_count())'"

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

  • CLUSTER_NAME: שם לאשכול.
  • PROJECT_ID: מזהה הפרויקט ב- Google Cloud .
  • ZONE: שם האזור בהתאם לגרסת ה-TPU שרוצים להשתמש בה. כדי לזהות מיקום זמין, אפשר לעיין במאמר זמינות של TPU ב-GKE. כדי להשתמש בקיבולת שהוזמנה, צריך לוודא שמשתמשים באזור שבו הוזמנה הקיבולת.
  • ACCELERATOR_TYPE: סוג ה-TPU ואחריו הטופולוגיה או מספר הליבות, למשל tpu7x-16.
  • WORKLOAD_NAME: השם של עומס העבודה.

דוגמה 2: הפעלת עומס עבודה שמציג את מספר שבבי ה-TPU הזמינים במאגר צמתים של פרוסת TPU

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

  • גרסת TPU: ‏ TPU v4
  • טופולוגיה: 2x2x4

הבחירה הזו של גרסה וטופולוגיה מובילה לפרוסת רשת מרובת מארחים.

  1. שומרים את קובץ המניפסט הבא בשם available-chips-multihost.yaml:
    apiVersion: v1
    kind: Service
    metadata:
      name: headless-svc
    spec:
      clusterIP: None
      selector:
        job-name: tpu-available-chips
    ---
    apiVersion: batch/v1
    kind: Job
    metadata:
      name: tpu-available-chips
    spec:
      backoffLimit: 0
      completions: 4
      parallelism: 4
      completionMode: Indexed
      template:
        spec:
          subdomain: headless-svc
          restartPolicy: Never
          nodeSelector:
            cloud.google.com/gke-tpu-accelerator: tpu-v4-podslice # Node selector to target TPU v4 slice nodes.
            cloud.google.com/gke-tpu-topology: 2x2x4 # Specifies the physical topology for the TPU slice.
          containers:
          - name: tpu-job
            image: us-docker.pkg.dev/cloud-tpu-images/jax-ai-image/tpu:latest
            ports:
            - containerPort: 8471 # Default port using which TPU VMs communicate
            - containerPort: 8431 # Port to export TPU runtime metrics, if supported.
            securityContext:
              privileged: true # Required for GKE versions earlier than 1.28 to access TPUs.
            command:
            - bash
            - -c
            - |
              python -c 'import jax; print("TPU cores:", jax.device_count())' # Python command to count available TPU chips.
            resources:
              requests:
                cpu: 10
                memory: 407Gi
                google.com/tpu: 4 # Request 4 TPU chips for this workload.
              limits:
                cpu: 10
                memory: 407Gi
                google.com/tpu: 4 # Limit to 4 TPU chips for this workload.
  2. פורסים את המניפסט:
    kubectl create -f available-chips-multihost.yaml
    

    ‫GKE מריץ פרוסת TPU v4 עם ארבע מכונות וירטואליות (פרוסת TPU מרובת-מארחים). לפרוסת ה-TPU יש 16 שבבי TPU שמחוברים ביניהם.

  3. מוודאים שמשימת ה-Job יצרה ארבעה פודים:
    kubectl get pods
    

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

    NAME                       READY   STATUS      RESTARTS   AGE
    tpu-job-podslice-0-5cd8r   0/1     Completed   0          97s
    tpu-job-podslice-1-lqqxt   0/1     Completed   0          97s
    tpu-job-podslice-2-f6kwh   0/1     Completed   0          97s
    tpu-job-podslice-3-m8b5c   0/1     Completed   0          97s
    
  4. מקבלים את היומנים של אחד מ-Pods:
    kubectl logs POD_NAME
    

    מחליפים את POD_NAME בשם של אחד מה-Pods שנוצרו. לדוגמה, tpu-job-podslice-0-5cd8r.

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

    TPU cores: 16
    
  5. אופציונלי: מסירים את עומס העבודה:
    kubectl delete -f available-chips-multihost.yaml
    

דוגמה 3: הפעלת עומס עבודה שמציג את מספר שבבי ה-TPU הזמינים בפרוסת ה-TPU

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

  • גרסת TPU: ‏ TPU v5e
  • טופולוגיה: 2x4

הגרסה והטופולוגיה שנבחרו יוצרות פרוסה של מארח יחיד.

  1. שומרים את קובץ המניפסט הבא בשם available-chips-singlehost.yaml:
    apiVersion: v1
    kind: Pod
    metadata:
      name: tpu-job-jax-v5
    spec:
      restartPolicy: Never
      nodeSelector:
        cloud.google.com/gke-tpu-accelerator: tpu-v5-lite-podslice # Node selector to target TPU v5e slice nodes.
        cloud.google.com/gke-tpu-topology: 2x4 # Specify the physical topology for the TPU slice.
      containers:
      - name: tpu-job
        image: us-docker.pkg.dev/cloud-tpu-images/jax-ai-image/tpu:latest
        ports:
        - containerPort: 8431 # Port to export TPU runtime metrics, if supported.
        securityContext:
          privileged: true # Required for GKE versions earlier than 1.28 to access TPUs.
        command:
        - bash
        - -c
        - |
          python -c 'import jax; print("Total TPU chips:", jax.device_count())'
        resources:
          requests:
            google.com/tpu: 8 # Request 8 TPU chips for this container.
          limits:
            google.com/tpu: 8 # Limit to 8 TPU chips for this container.
  2. פורסים את המניפסט:
    kubectl create -f available-chips-singlehost.yaml
    

    ‫GKE מספק צמתים עם שמונה פרוסות TPU של מארח יחיד שמשתמשות ב-TPU v5e. לכל צומת TPU יש שמונה שבבי TPU (פלח TPU של מארח יחיד).

  3. אחזור היומנים של ה-Pod:
    kubectl logs tpu-job-jax-v5
    

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

    Total TPU chips: 8
    
  4. אופציונלי: מסירים את עומס העבודה:
      kubectl delete -f available-chips-singlehost.yaml
      

דוגמה 4: הפעלת עומס עבודה שמטרגט שני צמתי NUMA

כדי לשפר את ביצועי עומסי העבודה, אפשר לפרוס את עומסי העבודה ב-GKE בהגדרה של כמה קונטיינרים. הפעולה הזו מקשרת כל קונטיינר למשאבי ה-CPU, הזיכרון וה-TPU בתוך צומת NUMA נתון. מידע נוסף על שיוך NUMA זמין במאמר מידע על Ironwood‏ (TPU7x) ב-GKE.

  1. יוצרים קובץ בשם topology-manager-config.yaml עם התוכן הבא:

    kubeletConfig:
      cpuManagerPolicy: static
      topologyManager:
        policy: best-effort
        scope: container
    

    ההגדרה הזו מיישרת את המשאבים שמבוקשים על ידי קונטיינר עם צומת NUMA יחיד. ההגדרה הזו נחוצה כדי ש-GKE יקבל עומסי עבודה של TPU עם כמה קונטיינרים ויקצה להם שבבים בצורה נכונה. אפשרויות נוספות למדיניות מפורטות במאמר מדיניות של Topology Manager.

  2. כדי להחיל את ההגדרה kubelet על מאגר צמתים, יוצרים מאגר צמתים חדש או מעדכנים מאגר קיים. מאגר הצמתים הזה חייב להשתמש בצמתים מסוג Ironwood ‏ (TPU7x), כמו tpu7x-standard-4t סוג המכונה, כדי להתאים לבחירת הצמתים בשלב הבא.

    • כדי ליצור מאגר צמתים חדש עם Topology Manager מופעל:

      gcloud container node-pools create NODE_POOL_NAME \
          --location=LOCATION \
          --cluster=CLUSTER_NAME \
          --node-locations=NODE_ZONES \
          --machine-type=tpu7x-standard-4t \
          --system-config-from-file=topology-manager-config.yaml
      

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

      • NODE_POOL_NAME: השם של מאגר הצמתים החדש.
      • LOCATION: האזור של האשכול.
      • CLUSTER_NAME: שם האשכול.
      • NODE_ZONES: רשימה מופרדת בפסיקים של אזור אחד או יותר למאגר הצמתים.
    • כדי לעדכן מאגר צמתים קיים עם Topology Manager מופעל:

      gcloud container node-pools update NODE_POOL_NAME \
          --location=LOCATION \
          --cluster=CLUSTER_NAME \
          --system-config-from-file=topology-manager-config.yaml
      

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

      • NODE_POOL_NAME: השם של מאגר הצמתים.
      • LOCATION: האזור של האשכול.
      • CLUSTER_NAME: שם האשכול.
  3. יוצרים קובץ בשם tpu-jobset.yaml עם המניפסט הבא:

    apiVersion: jobset.x-k8s.io/v1alpha2
    kind: JobSet
    metadata:
      name: tpu7x-test
    spec:
      failurePolicy:
        maxRestarts: 0
      replicatedJobs:
        - name: tpu7x
          replicas: 1
          template:
            spec:
              parallelism: 2
              completions: 2
              backoffLimit: 0
              template:
                spec:
                  subdomain: test
                  restartPolicy: Never
                  nodeSelector:
                    cloud.google.com/gke-tpu-accelerator: tpu7x
                    cloud.google.com/gke-tpu-topology: 2x2x2
                  containers:
                  - name: jax-tpu-1
                    image: us-docker.pkg.dev/cloud-tpu-images/jax-ai-image/tpu:latest
                    securityContext:
                      privileged: false
                    command:
                    - bash
                    - -c
                    - |
                      set -ex
                      python -c 'import jax; print("local devices:", jax.local_device_count(), "devices:", jax.device_count())'
                    resources:
                      requests:
                        google.com/tpu: 2
                      limits:
                        google.com/tpu: 2
                  - name: jax-tpu-2
                    image: us-docker.pkg.dev/cloud-tpu-images/jax-ai-image/tpu:latest
                    securityContext:
                      privileged: false
                    command:
                    - bash
                    - -c
                    - |
                      set -ex
    
                      python -c 'import jax; print("local devices:", jax.local_device_count(), "devices:", jax.device_count())'
                    resources:
                      requests:
                        google.com/tpu: 2
                      limits:
                        google.com/tpu: 2
    

    המניפסט הזה מגדיר JobSet בשם tpu7x-test, שמפעיל שני מאגרי מידע ראשיים, jax-tpu-1 ו-jax-tpu-2. כל מאגר תגים מבקש שני שבבי google.com/tpu. שני השבבים האלה מגיעים מאותו צומת NUMA. כל קונטיינר מריץ סקריפט Python כדי לאמת את הגישה של JAX ל-TPU.

    ההגדרה הזו של JobSet מראה שכמה קונטיינרים באותו Pod יכולים לגשת לשבבי TPU נפרדים ולהשתמש בהם.

  4. החלת המניפסט:

    kubectl apply -f tpu-jobset.yaml
    

שדרוג מאגרי צמתים באמצעות מאיצים (GPU ו-TPU)

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

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

שימוש בשיטת שדרוג של צומת מחייב את GKE להקצות משאבים נוספים באופן זמני, בהתאם להגדרה. אם ל- Google Cloudיש קיבולת מוגבלת למשאבים של מאגר הצמתים – לדוגמה, אם אתם רואים שגיאות של זמינות משאבים כשאתם מנסים ליצור עוד צמתים עם GPU או TPU – כדאי לעיין במאמר בנושא שדרוג בסביבה עם משאבים מוגבלים.

הסרת המשאבים

כדי להימנע מחיובים בחשבון Google Cloud על המשאבים שבהם נעשה שימוש במדריך הזה, כדאי למחוק את מאגרי הצמתים של פרוסות ה-TPU שאין בהם יותר עומסי עבודה מתוזמנים. אם צריך להפסיק את עומסי העבודה בצורה מסודרת, משתמשים בפקודה kubectl drain כדי לנקות את עומסי העבודה לפני שמוחקים את הצומת.

gcloud

מחיקת מאגר צמתים של פרוסת TPU:

  gcloud container node-pools delete POOL_NAME \
      --location=LOCATION \
      --cluster=CLUSTER_NAME

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

  • POOL_NAME: השם של מאגר הצמתים.
  • LOCATION: מיקום המחשוב של האשכול.
  • CLUSTER_NAME: שם האשכול.

xpk

מוחקים את משאבי ה-XPK שיצרתם:

  xpk cluster delete \
      --project=$PROJECT_ID \
      --zone=$ZONE \
      --cluster=$CLUSTER_NAME

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

  • CLUSTER_NAME: שם לאשכול.
  • PROJECT_ID: מזהה הפרויקט ב- Google Cloud .
  • ZONE: האזור של מאגר הצמתים.

הגדרת הגדרות נוספות

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

שימוש ב-Multislice

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

העברת הזמנת TPU

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

הפעלת רישום ביומן

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

הגדרת תיקון אוטומטי לצמתי פרוסת TPU

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

התנאים שגורמים לצמתים לא תקינים בפרוסת TPU כוללים את התנאים הבאים:

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

אפשר לראות את סטטוס התיקון (כולל הסיבה לכישלון) בהיסטוריית הפעולות. אם הכשל נגרם בגלל מכסה לא מספיקה, צריך לפנות אלGoogle Cloud הנציג שלכם בחשבון כדי להגדיל את המכסה המתאימה.

הגדרת סיום תקין של צמתים של פלח TPU

באשכולות GKE עם מישור הבקרה בגרסה ‎1.29.1-gke.1425000 ואילך, צמתי פרוסת TPU תומכים באותות SIGTERM שמזהירים את הצומת מפני כיבוי קרוב. אפשר להגדיר את ההתראה על כיבוי קרוב של צמתי TPU עד חמש דקות מראש.

כדי להגדיר את GKE כך שיסיים את עומסי העבודה בצורה מסודרת במסגרת הזמן של ההתראה הזו, פועלים לפי השלבים במאמר ניהול שיבושים בצמתי GKE עבור GPU ו-TPU.

הפעלת קונטיינרים ללא מצב הרשאות

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

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

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

  1. עורכים את securityContext כך שיכלול את השדות הבאים:

    securityContext:
      capabilities:
        add: ["SYS_RESOURCE"]
    
  2. כדי להגדיל את הערך של ulimit, מריצים את הפקודה הבאה בתוך הקונטיינר לפני שמגדירים את עומסי העבודה לשימוש במשאבי TPU:

    ulimit -l 68719476736
    

ב-TPU v5e, אפשר להריץ קונטיינרים ללא מצב הרשאות מיוחדות באשכולות בגרסה 1.27.4-gke.900 ואילך.

ניראות ומדדים

מרכז שליטה

האפשרות לראות את נתוני השימוש במאגר הצמתים במסוףGoogle Cloud זמינה לכלל המשתמשים. כדי לראות את הסטטוס של מאגרי הצמתים של TPU מרובי-מארחים ב-GKE, עוברים אל לוח הבקרה GKE TPU Node Pool Status שמופיע ב-Cloud Monitoring:

מעבר אל GKE TPU Node Pool Status

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

בדף Kubernetes Clusters במסוףGoogle Cloud , בכרטיסייה ניראות (observability) מוצגים גם מדדי ניראות (observability) של TPU, כמו השימוש ב-TPU, בקטע Accelerators > TPU. מידע נוסף מופיע במאמר הצגת מדדי יכולת התבוננות.

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

מדדים בזמן ריצה

ב-GKE מגרסה 1.27.4-gke.900 ואילך, עומסי עבודה של TPU שמשתמשים ב-JAX מגרסה 0.4.14 ואילך ומציינים containerPort: 8431 מייצאים מדדי ניצול של TPU בתור מדדי מערכת של GKE. המדדים הבאים זמינים ב-Cloud Monitoring כדי לעקוב אחרי ביצועי זמן הריצה של עומס העבודה ב-TPU:

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

המדדים האלה נמצאים בסכימה של צומת Kubernetes ‏ (k8s_node) וקונטיינר Kubernetes ‏ (k8s_container).

‫Kubernetes container:

  • kubernetes.io/container/accelerator/duty_cycle
  • kubernetes.io/container/accelerator/memory_used
  • kubernetes.io/container/accelerator/memory_total

צומת Kubernetes:

  • kubernetes.io/node/accelerator/duty_cycle
  • kubernetes.io/node/accelerator/memory_used
  • kubernetes.io/node/accelerator/memory_total

מעקב אחרי מדדי הבריאות של צמתי TPU ושל מאגרי צמתים

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

סטטוס הצומת

ב-GKE גרסה ‎1.32.1-gke.1357001 ואילך, מדד המערכת של GKE הבא חושף את מצב הצומת של GKE:

  • kubernetes.io/node/status_condition

בשדה condition מדווחים על התנאים בצומת, כמו Ready, ‏DiskPressure ו-MemoryPressure. בשדה status מוצג הסטטוס המדווח של התנאי, שיכול להיות True,‏ False או Unknown. זהו מדד עם סוג המשאב במעקב k8s_node.

השאילתה הזו ב-PromQL מראה אם צומת מסוים הוא Ready:

kubernetes_io:node_status_condition{
    monitored_resource="k8s_node",
    cluster_name="CLUSTER_NAME",
    node_name="NODE_NAME",
    condition="Ready",
    status="True"}

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

kubernetes_io:node_status_condition{
    monitored_resource="k8s_node",
    cluster_name="CLUSTER_NAME",
    condition!="Ready",
    status="True"}

כדאי לבדוק במיוחד צמתים שלא מסומנים בסימן Ready:

kubernetes_io:node_status_condition{
    monitored_resource="k8s_node",
    cluster_name="CLUSTER_NAME",
    condition="Ready",
    status="False"}

אם אין נתונים, הצמתים מוכנים. תנאי הסטטוס נדגם כל 60 שניות.

אפשר להשתמש בשאילתה הבאה כדי להבין את סטטוס הצומת בכל הצי:

avg by (condition,status)(
  avg_over_time(
    kubernetes_io:node_status_condition{monitored_resource="k8s_node"}[${__interval}]))

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

מדד המערכת הבא של GKE עבור המשאב שבמעקב k8s_node_pool חושף את הסטטוס של מאגר צמתים של GKE:

  • kubernetes.io/node_pool/status

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

בשדה status מופיע הסטטוס של מאגר הצמתים, למשל Provisioning,‏ Running,‏ Error,‏ Reconciling או Stopping. עדכוני הסטטוס מתרחשים אחרי שפעולות GKE API מסתיימות.

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

kubernetes_io:node_pool_status{
    monitored_resource="k8s_node_pool",
    cluster_name="CLUSTER_NAME",
    node_pool_name="NODE_POOL_NAME",
    status="Running"}

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

count by (status)(
  count_over_time(
    kubernetes_io:node_pool_status{monitored_resource="k8s_node_pool"}[${__interval}]))

זמינות של מאגר צמתים

מדד המערכת הבא של GKE מראה אם מאגר צומתי TPU מרובה-מארחים זמין:

  • kubernetes.io/node_pool/multi_host/available

הערך של המדד הוא True אם כל הצמתים במאגר הצמתים זמינים, ו-False אחרת. המדד נדגם כל 60 שניות.

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

avg by (node_pool_name)(
  avg_over_time(
    kubernetes_io:node_pool_multi_host_available{
      monitored_resource="k8s_node_pool",
      cluster_name="CLUSTER_NAME"}[${__interval}]))

מספר ההפרעות בצומת

מדד המערכת הבא של GKE מדווח על מספר ההפרעות בצומת GKE מאז הדגימה האחרונה (המדד נדגם כל 60 שניות):

  • kubernetes.io/node/interruption_count

השדות interruption_type (למשל TerminationEvent, ‏MaintenanceEvent או PreemptionEvent) ו-interruption_reason (למשל HostError, ‏Eviction או AutoRepair) יכולים לעזור להבין למה הייתה הפרעה בצומת.

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

  sum by (interruption_type,interruption_reason)(
    sum_over_time(
      kubernetes_io:node_interruption_count{monitored_resource="k8s_node"}[${__interval}]))

כדי לראות רק את אירועי התחזוקה של המארח, צריך לעדכן את השאילתה כדי לסנן את הערך HW/SW Maintenance בשדה interruption_reason. משתמשים בשאילתת PromQL הבאה:

  sum by (interruption_type,interruption_reason)(
    sum_over_time(
      kubernetes_io:node_interruption_count{monitored_resource="k8s_node", interruption_reason="HW/SW Maintenance"}[${__interval}]))

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

  sum by (node_pool_name,interruption_type,interruption_reason)(
    sum_over_time(
      kubernetes_io:node_pool_interruption_count{monitored_resource="k8s_node_pool", interruption_reason="HW/SW Maintenance", node_pool_name=NODE_POOL_NAME }[${__interval}]))

זמני השחזור (TTR) של מאגרי הצמתים

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

  • kubernetes.io/node_pool/accelerator/times_to_recover

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

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

אפשר להשתמש בשאילתת PromQL הבאה כדי לחשב את הזמן הממוצע לשחזור (MTTR) ב-7 הימים האחרונים באשכול:

sum(sum_over_time(
  kubernetes_io:node_pool_accelerator_times_to_recover_sum{
    monitored_resource="k8s_node_pool", cluster_name="CLUSTER_NAME"}[7d]))
/
sum(sum_over_time(
  kubernetes_io:node_pool_accelerator_times_to_recover_count{
    monitored_resource="k8s_node_pool",cluster_name="CLUSTER_NAME"}[7d]))

זמן בין הפרעות (TBI) במאגר צמתים

הזמן הממוצע בין הפסקות (TBI) של מאגר הצמתים הוא הזמן הממוצע שצמתי ה-TPU שלכם פועלים לפני שיש הפרעה.

שאילתת PromQL הבאה מחשבת את מדד TBI על ידי ספירת המספר הכולל של דגימות זיכרון של 60 שניות מצמתים פועלים. הנוכחות של כל דגימה מציינת שהצומת היה פעיל למשך 60 שניות. ספירת הדגימות האלה לאורך תקופה מסוימת מאפשרת להעריך את זמן הפעולה הכולל של הצמתים בדקות. לדוגמה, 10 דגימות ב-10 דקות אומר שהצומת היה פעיל במשך כ-10 דקות. הספירה הזו משמשת כנתון חלופי לזמן הפעולה של הצומת בדקות.

לאחר מכן, השאילתה מחלקת את המספר הזה במספר ההפרעות בטווח הזמן שנבחר.

בדוגמה הבאה מוצג ממוצע הזמן בין הפרעות (MTBI) ל-7 ימים עבור האשכול הנתון:

sum(count_over_time(
  kubernetes_io:node_memory_total_bytes{
    monitored_resource="k8s_node", node_name=~"gke-tpu.*|gk3-tpu.*", cluster_name="CLUSTER_NAME"}[7d]))
/
sum(sum_over_time(
  kubernetes_io:node_interruption_count{
    monitored_resource="k8s_node", node_name=~"gke-tpu.*|gk3-tpu.*", cluster_name="CLUSTER_NAME"}[7d]))

מדדים של המארח

ב-GKE בגרסה 1.28.1-gke.1066000 ואילך, מכונות וירטואליות בפרוסת TPU מייצאות מדדי ניצול של TPU בתור מדדי מערכת של GKE. המדדים הבאים זמינים ב-Cloud Monitoring כדי לעקוב אחרי הביצועים של מארח ה-TPU:

  • TensorCore utilization: אחוז הניצול הנוכחי של TensorCore. הערך של TensorCore שווה לסכום של יחידות הכפל של המטריצה (MXU) בתוספת יחידת הווקטור. ערך הניצול של TensorCore הוא תוצאת החלוקה של פעולות TensorCore שבוצעו במהלך תקופת הדגימה האחרונה (60 שניות) במספר הפעולות של TensorCore הנתמכות במהלך אותה תקופה. ערך גבוה יותר מצביע על ניצול טוב יותר.
  • Memory bandwidth utilization: האחוז הנוכחי של רוחב הפס של זיכרון המאיץ שנמצא בשימוש. החישוב מתבצע על ידי חלוקת רוחב הפס של הזיכרון שנעשה בו שימוש במהלך תקופת דגימה (60 שניות) ברוחב הפס המקסימלי הנתמך במהלך אותה תקופת דגימה.

המדדים האלה נמצאים בסכימה של צומת Kubernetes ‏ (k8s_node) וקונטיינר Kubernetes ‏ (k8s_container).

‫Kubernetes container:

  • kubernetes.io/container/accelerator/tensorcore_utilization
  • kubernetes.io/container/accelerator/memory_bandwidth_utilization

צומת Kubernetes:

  • kubernetes.io/node/accelerator/tensorcore_utilization
  • kubernetes.io/node/accelerator/memory_bandwidth_utilization

מידע נוסף זמין במאמרים מדדים של Kubernetes ומדדי מערכת של GKE.

ניהול התזמון של האוספים

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

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

  • Multi-host TPU slice: GKE groups multi-host TPU slices to form a collection. כל מאגר צמתים של GKE הוא רפליקה באוסף הזה. כדי להגדיר אוסף, יוצרים פלח TPU מרובה-מארחים ומקצים לאוסף שם ייחודי. כדי להוסיף עוד חלקי TPU לאוסף, יוצרים עוד מאגר צמתים של חלקי TPU מרובי-מארחים עם אותו שם אוסף וסוג עומס עבודה.
  • פרוסת TPU במארח יחיד:‏ GKE מתייחס לכל מאגר הצמתים של פרוסת ה-TPU במארח יחיד כאל אוסף. כדי להוסיף עוד חלקי TPU לאוסף, אפשר לשנות את הגודל של מאגר הצמתים של חלקי ה-TPU במארח יחיד.

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

ניהול תזמון של אוספים במאגרי צמתים של פרוסות TPU עם כמה מארחים

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

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

    gcloud container node-pools describe NODE_POOL_NAME \
        --location LOCATION \
        --cluster CLUSTER_NAME \
        --format="json" | jq -r \
        '"nodepool-group-name: \(.config.labels["cloud.google.com/gke-nodepool-group-name"] // "")\ngke-workload-type: \(.config.labels["cloud.google.com/gke-workload-type"] // "")"'
    

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

    nodepool-group-name: <code><var>NODE_POOL_COLLECTION_NAME</var></code>
    gke-workload-type: HIGH_AVAILABILITY
    

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

    • cloud.google.com/gke-workload-type: HIGH_AVAILABILITY
    • cloud.google.com/gke-nodepool-group-name: <code><var>COLLECTION_NAME</var></code>
  • כדי לקבל את רשימת האוספים באשכול, מריצים את הפקודה הבאה:

    #!/bin/bash
    
    # Replace with your cluster name, project, and location
    CLUSTER_NAME=CLUSTER_NAME
    PROJECT=PROJECT_ID
    LOCATION=LOCATION
    
    declare -A collection_names
    
    node_pools=$(gcloud container node-pools list --cluster "$CLUSTER_NAME" --project "$PROJECT" --location "$LOCATION" --format="value(name)")
    
    # Iterate over each node pool
    for pool in $node_pools; do
        # Describe the node pool and extract labels using jq
        collection_name=$(gcloud container node-pools describe "$pool" \
            --cluster "$CLUSTER_NAME" \
            --project "$PROJECT" \
            --location "$LOCATION" \
            --format="json" | jq -r '.config.labels["cloud.google.com/gke-nodepool-group-name"]')
    
        # Add the collection name to the associative array if it's not empty
        if [[ -n "$collection_name" ]]; then
            collection_names["$collection_name"]=1
        fi
    done
    
    # Print the unique node pool collection names
    echo "Unique cloud.google.com/gke-nodepool-group-name values:"
    for name in "${!collection_names[@]}"; do
        echo "$name"
    done
    

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

    Unique cloud.google.com/gke-nodepool-group-name values: {COLLECTION_NAME_1}, {COLLECTION_NAME_2}, {COLLECTION_NAME_3}
    
  • כדי לקבל רשימה של מאגרי צמתים ששייכים לאוסף, מריצים את הפקודה הבאה:

    #!/bin/bash
    
    TARGET_COLLECTION_NAME=COLLECTION_NAME
    CLUSTER_NAME=CLUSTER_NAME
    PROJECT=PROJECT_ID
    LOCATION=LOCATION
    
    matching_node_pools=()
    
    # Get the list of all node pools in the cluster
    node_pools=$(gcloud container node-pools list --cluster "$CLUSTER_NAME" --project "$PROJECT" --location "$LOCATION" --format="value(name)")
    
    # Iterate over each node pool
    for pool in $node_pools; do
        # Get the value of the cloud.google.com/gke-nodepool-group-name label
        collection_name=$(gcloud container node-pools describe "$pool" \
            --cluster "$CLUSTER_NAME" \
            --project "$PROJECT" \
            --location "$LOCATION" \
            --format="json" | jq -r '.config.labels["cloud.google.com/gke-nodepool-group-name"]')
    
        # Check if the group name matches the target value
        if [[ "$collection_name" == "$TARGET_COLLECTION_NAME" ]]; then
            matching_node_pools+=("$pool")
        fi
    done
    
    # Print the list of matching node pools
    echo "Node pools with collection name '$TARGET_COLLECTION_NAME':"
    for pool in "${matching_node_pools[@]}"; do
        echo "$pool"
    done
    

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

    Node pools with collection name 'COLLECTION_NAME':
    {NODE_POOL_NAME_1}
    {NODE_POOL_NAME_2}
    {NODE_POOL_NAME_3}
    
  • כדי להגדיל את האוסף, יוצרים עוד מאגר צמתים של פרוסת TPU מרובת מארחים ומוסיפים את cloud.google.com/gke-workload-type ו-cloud.google.com/gke-nodepool-group-name. צריך להשתמש באותו שם של אוסף במאפיין cloud.google.com/gke-nodepool-group-name ולהפעיל את אותו סוג של עומס עבודה. אם התכונה הקצאת צמתים אוטומטית (NAP) מופעלת באשכול,‏ GKE יוצר באופן אוטומטי מאגרי צמתים על סמך דרישות עומס העבודה.

  • כדי להקטין את האוסף, מוחקים את מאגר הצמתים.

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

ניהול תזמון של אוספים במאגרי צמתים של פרוסות TPU עם מארח יחיד

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

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

    gcloud container node-pools describe NODE_POOL_NAME \
        --cluster CLUSTER_NAME \
        --project PROJECT_NAME \
        --location LOCATION \
        --format="json" | jq -r '.config.labels["cloud.google.com/gke-workload-type"]'
    

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

    gke-workload-type: HIGH_AVAILABILITY
    

    אם מאגר הפרוסות של TPU במארח יחיד הוא חלק מאוסף, הפלט יכלול את התווית cloud.google.com/gke-workload-type: HIGH_AVAILABILITY.

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

  • כדי להקטין את האוסף, מוחקים את מאגר הצמתים.

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

בעיות מוכרות

  • יכול להיות שהמידרוג האוטומטי של האשכול יחשב באופן שגוי את הקיבולת של צומתי פרוסת TPU חדשים לפני שהצמתים האלה ידווחו על יחידות TPU זמינות. יכול להיות שהמידרוג האוטומטי של האשכול יבצע הרחבה נוספת וכתוצאה מכך ייצור יותר צמתים מהנדרש. המידרוג האוטומטי של האשכול מצמצם את מספר הצמתים הנוספים, אם הם לא נדרשים, אחרי פעולת צמצום רגילה.
  • המידרוג האוטומטי של אשכולות מבטל את הגדלת מספר הצמתים במאגרי צמתים של פרוסות TPU שנשארים במצב המתנה יותר מ-10 שעות. הכלי Cluster Autoscaler מנסה שוב לבצע פעולות כאלה של הגדלת הקיבולת בשלב מאוחר יותר. ההתנהגות הזו עשויה להקטין את הסיכוי של לקוחות שלא משתמשים בהזמנות לקבל TPU.
  • עומסי עבודה שאינם TPU שיש להם טולרנטיות ל-TPU taint יכולים למנוע הקטנה של מאגר הצמתים אם הם נוצרים מחדש במהלך הניקוז של מאגר הצמתים של פרוסת ה-TPU.
  • מדד השימוש ברוחב פס של הזיכרון לא זמין ב-TPU מדגם v5e.

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