בדף הזה מוסבר איך להאיץ עומסי עבודה (workload) של למידת מכונה (ML) באמצעות מאיצי Cloud TPU (TPU) באשכולות Autopilot של Google Kubernetes Engine (GKE). ההנחיות האלה יעזרו לכם לבחור את הספריות הנכונות למסגרות של אפליקציות ללמידת מכונה, להגדיר את עומסי העבודה של TPU כך שיפעלו בצורה אופטימלית ב-GKE ולעקוב אחרי עומסי העבודה אחרי הפריסה.
המאמר הזה מיועד לאדמינים ולמפעילים של פלטפורמות, למומחים בתחום הנתונים וה-AI ולמפתחי אפליקציות שרוצים להכין ולהריץ עומסי עבודה של למידת מכונה ב-TPU. מידע נוסף על התפקידים הנפוצים, האחריות ומשימות לדוגמה שאליהם אנחנו מתייחסים בתוכן של Google Cloud , זמין במאמר תפקידים נפוצים של משתמשים ומשימות ב-GKE.
לפני שקוראים את הדף הזה, חשוב לוודא שאתם מכירים את המקורות הבאים:
איך יחידות TPU פועלות ב-Autopilot
כדי להשתמש ב-TPU בעומסי עבודה של Autopilot, צריך לציין את הפרטים הבאים במניפסט של עומס העבודה:
- גרסת ה-TPU בשדה
spec.nodeSelector. - טופולוגיית ה-TPU בשדה
spec.nodeSelector. הטופולוגיה צריכה להיות נתמכת על ידי גרסת ה-TPU שצוינה. - מספר שבבי ה-TPU בשדות
spec.containers.resources.requestsו-spec.containers.resources.limits.
כשפורסים את עומס העבודה, GKE מקצה צמתים עם תצורת ה-TPU המבוקשת ומתזמן את ה-Pods בצמתים. GKE ממקם כל עומס עבודה בצומת משלו, כך שלכל Pod תהיה גישה למשאבים המלאים של הצומת, עם סיכון מינימלי לשיבוש.
יחידות TPU ב-Autopilot תואמות ליכולות הבאות:
תכנון ההגדרה של TPU
לפני שמשתמשים במדריך הזה כדי לפרוס עומסי עבודה של TPU, צריך לתכנן את ההגדרה של ה-TPU על סמך המודל וכמות הזיכרון שהוא דורש. פרטים נוספים זמינים במאמר תכנון ההגדרה של TPU.
תמחור
למידע על מחירים אפשר לעיין בתמחור של Autopilot.
לפני שמתחילים
לפני שמתחילים, חשוב לוודא שביצעתם את הפעולות הבאות:
- מפעילים את ממשק ה-API של Google Kubernetes Engine. הפעלת Google Kubernetes Engine API
- אם רוצים להשתמש ב-CLI של Google Cloud למשימה הזו, צריך להתקין ואז להפעיל את ה-CLI של gcloud. אם התקנתם בעבר את ה-CLI של gcloud, מריצים את הפקודה
gcloud components updateכדי לקבל את הגרסה העדכנית. יכול להיות שגרסאות קודמות של ה-CLI של gcloud לא יתמכו בהרצת הפקודות שמופיעות במסמך הזה.
- מוודאים שיש לכם אשכול Autopilot שפועלת בו גרסת GKE 1.32.3-gke.1927000 ואילך. הוראות מפורטות מופיעות במאמר בנושא יצירת אשכול Autopilot.
- כדי להשתמש ב-TPU שמורים, צריך לוודא שיש לכם הזמנת קיבולת ספציפית קיימת. הוראות מפורטות מופיעות במאמר בנושא שימוש בהזמנה.
איך מוודאים שיש מכסת שימוש ביחידות TPU ובמשאבי GKE אחרים
בקטעים הבאים מוסבר איך לוודא שיש לכם מספיק מכסות כשמשתמשים ב-TPU ב-GKE. כדי ליצור צמתים של פרוסות TPU, צריך להקצות מכסת TPU, אלא אם משתמשים בהזמנת קיבולת קיימת. אם אתם משתמשים ב-TPU שמורים, דלגו על הקטע הזה.כדי ליצור צמתים של חלקי TPU ב-GKE, צריך מכסה של Compute Engine API (compute.googleapis.com), ולא מכסה של Cloud TPU API (tpu.googleapis.com). השם של המכסה שונה ב-Pods רגילים של Autopilot וב-Pods של Spot.
כדי לבדוק את המגבלה ואת השימוש הנוכחי במכסת Compute Engine API עבור TPU:
נכנסים לדף Quotas במסוף Google Cloud :
בתיבה Filter, מבצעים את הפעולות הבאות:
משתמשים בטבלה הבאה כדי לבחור ולהעתיק את מאפיין המכסה בהתאם לגרסת ה-TPU ולערך בבורר הצמתים
cloud.google.com/gke-tpu-accelerator. לדוגמה, אם אתם מתכננים ליצור צמתי TPU v5e על פי דרישה, שהערך שלהם בבורר הצמתיםcloud.google.com/gke-tpu-acceleratorהואtpu-v5-lite-podslice, צריך להזיןName: TPU v5 Lite PodSlice chips.גרסת TPU, cloud.google.com/gke-tpu-acceleratorהמאפיין והשם של המכסה עבור מופעים על פי דרישה המאפיין והשם של המכסה למכונות Spot2 TPU v3,
tpu-v3-deviceDimensions (e.g. location):
tpu_family:CT3לא רלוונטי TPU v3,
tpu-v3-sliceDimensions (e.g. location):
tpu_family:CT3Pלא רלוונטי TPU v4,
tpu-v4-podsliceName:
TPU v4 PodSlice chipsName:
Preemptible TPU v4 PodSlice chipsTPU v5e,
tpu-v5-lite-podsliceName:
TPU v5 Lite PodSlice chipsName:
Preemptible TPU v5 Lite Podslice
chipsTPU v5p,
tpu-v5p-sliceName:
TPU v5p chipsName:
Preemptible TPU v5p chipsTPU Trillium,
tpu-v6e-sliceDimensions (e.g. location):
tpu_family:CT6EName:
Preemptible TPU slices v6eIronwood (TPU7x) (תצוגה מקדימה),
tpu7xDimensions (e.g. location):
tpu_family:tpu7xName:
Preemptible TPU slices tpu7xבוחרים את המאפיין Dimensions (e.g. locations) (מאפיינים (למשל מיקומים)) ומזינים
region:ואחריו את שם האזור שבו אתם מתכננים ליצור יחידות TPU ב-GKE. לדוגמה, מזיניםregion:us-west4אם מתכננים ליצור צמתים של חלקי TPU באזורus-west4-a. מכסת ה-TPU היא אזורית, ולכן כל האזורים באותו אזור צורכים את אותה מכסת TPU.
אם אין מכסות שתואמות למסנן שהזנתם, סימן שלא הוקצתה לפרויקט אף אחת מהמכסות שצוינו לאזור שאתם צריכים, ועליכם לבקש שינוי במכסת ה-TPU.
כשיוצרים הזמנה של TPU, גם המגבלה וגם ערכי השימוש הנוכחיים של המכסה המתאימה גדלים במספר הצ'יפים בהזמנת ה-TPU. לדוגמה, אם יצרתם הזמנה ל-16 שבבי TPU v5e, והערך שלהם בבורר הצמתים cloud.google.com/gke-tpu-accelerator הוא tpu-v5-lite-podslice, אז גם ההגבלה וגם השימוש הנוכחי במכסת TPU v5 Lite PodSlice chips באזור הרלוונטי יגדלו ב-16.
מכסות למשאבי 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 שאתם מתכננים ליצור.
כדי לבקש הגדלה של המכסה, אפשר לעיין במאמר בנושא איך שולחים בקשה לשינוי המכסות.
הכנת אפליקציית ה-TPU
עומסי עבודה של TPU מחייבים הכנה מראש.
- מסגרות כמו JAX, PyTorch ו-TensorFlow ניגשות ל-TPU VM באמצעות הספרייה המשותפת
libtpu. libtpuכולל את מהדר XLA, תוכנת זמן הריצה של TPU ומנהל ההתקן של TPU. כל גרסה של PyTorch ו-JAX דורשת גרסה מסוימת שלlibtpu.so. כדי למנוע התנגשויות בין גרסאות של חבילות, מומלץ להשתמש בתמונה של AI ב-JAX. כדי להשתמש ב-TPU ב-GKE, צריך לוודא שאתם משתמשים בגרסאות הבאות: tpu7xסוג ה-TPU גרסה libtpu.soIronwood (TPU7x) (תצוגה מקדימה) - תמונה מומלצת של AI ב-JAX: jax0.8.1-rev1 ואילך
- גרסת jax[tpu] מומלצת: v0.8.1
TPU Trillium (v6e)
tpu-v6e-slice
- תמונת AI מומלצת של JAX: jax0.4.35-rev1 ואילך
- גרסת jax[tpu] מומלצת: v0.4.9 ואילך
- הגרסה המומלצת של torchxla[tpuvm]: v2.1.0 ואילך
TPU v5e
tpu-v5-lite-podslice
- תמונת AI מומלצת של JAX: jax0.4.35-rev1 ואילך
- גרסת jax[tpu] מומלצת: v0.4.9 ואילך
- הגרסה המומלצת של torchxla[tpuvm]: v2.1.0 ואילך
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- תמונת AI מומלצת של JAX: jax0.4.35-rev1 ואילך
- מומלצת jax[tpu]: גרסה v0.4.4 ואילך
- מומלץ torchxla[tpuvm]: v2.0.0 ואילך
TPU v3
tpu-v3-slice
tpu-v3-device- תמונת AI מומלצת של JAX: jax0.4.35-rev1 ואילך
- מומלצת jax[tpu]: גרסה v0.4.4 ואילך
- מומלץ torchxla[tpuvm]: v2.0.0 ואילך
- במניפסט של עומס העבודה, מוסיפים בוררי צמתים של 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 ב-GKE
כדי להקצות TPU ב-GKE, יש לכם את אפשרויות ההגדרה הבאות:spec.nodeSelector ואת מספר שבבי ה-TPU בקטע spec.containers.resources. כשפורסים את עומס העבודה, GKE מקצה אוטומטית צמתים עם הגדרת ה-TPU הנכונה וממקם כל עומס עבודה בצומת ייעודי משלו כדי להבטיח גישה מלאה למשאבי הצומת. הוראות מפורטות מופיעות במאמר בנושא בקשת TPU בעומס עבודה.
הקצאת TPU באופן מרכזי באמצעות סוגי מחשוב בהתאמה אישית
בקטעים הבאים מוסבר איך ליצור ComputeClass בהתאמה אישית ואז ליצור Job שמשתמש ב-TPU שהוגדרו ב-ComputeClass.
יצירת ComputeClass בהתאמה אישית
השלבים ליצירת ComputeClass מותאם אישית בהתאם לכללי TPU משתנים בהתאם לגרסת ה-TPU שבה אתם משתמשים: Ironwood (TPU7x) או גרסה קודמת של TPU.
Ironwood (TPU7x)
יוצרים מדיניות של עומס עבודה. השלב הזה נדרש רק אם יוצרים מאגר צמתים עם כמה מארחים, והוא תלוי בטופולוגיה שבוחרים. אם אתם משתמשים במאגר צמתים עם מארח יחיד, דלגו על השלב הזה.
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: האזור של מדיניות עומס העבודה. מדיניות עומס עבודה היא משאב אזורי, ואפשר להשתמש בה במאגרי צמתים.
-
שומרים את קובץ המניפסט הבא בשם
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(אופציונלי) אפשר להשתמש בהזמנה ספציפית או בחלק ספציפי של בלוק. לדוגמה, אפשר להוסיף את
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, מבצעים את השלבים הבאים:
שומרים את קובץ המניפסט הבא בשם
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חייבים להיות זהים.
-
פורסים את ComputeClass:
kubectl apply -f tpu-compute-class.yamlמידע נוסף על ComputeClasses ו-TPU בהתאמה אישית זמין במאמר הגדרת TPU.
יצירת משימה שצורכת TPU
שומרים את קובץ המניפסט הבא בשם
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חייבים להיות זהים.
-
פריסת המשרה:
kubectl create -f tpu-job.yamlכשיוצרים את ה-Job הזה, מערכת GKE מבצעת באופן אוטומטי את הפעולות הבאות:
- הקצאת צמתים להרצת ה-Pods. בהתאם לסוג ה-TPU, לטופולוגיה ולבקשות המשאבים שציינתם, הצמתים האלה הם פרוסות של מארח יחיד או פרוסות של כמה מארחים. בהתאם לזמינות של משאבי TPU בעדיפות הגבוהה ביותר, יכול להיות ש-GKE יחזור לעדיפויות נמוכות יותר כדי למקסם את הסיכוי לקבלת משאבים.
- הוספת taints ל-Pods ו-tolerations לצמתים כדי למנוע הפעלה של עומסי עבודה אחרים באותם צמתים שבהם מופעלים עומסי עבודה של TPU.
מידע נוסף זמין במאמר מידע על ComputeClasses בהתאמה אישית.
כדי להימנע מחיובים נוספים אחרי שסיימתם את הקטע הזה, תוכלו למחוק את המשאבים שיצרתם:
kubectl delete -f tpu-job.yaml
בקשת TPU בעומס עבודה
בקטע הזה מוסבר איך ליצור משימה שמבקשת TPU ב-Autopilot. בכל עומס עבודה שנדרשים בו TPU, צריך לציין את הפרטים הבאים:
- בוררי צמתים לגרסה ולטופולוגיה של TPU
- מספר שבבי ה-TPU של קונטיינר בעומס העבודה
רשימה של גרסאות וטופולוגיות נתמכות של TPU, ומספר השבבים והצמתים של TPU בפלח, זמינה במאמר בחירת גרסת ה-TPU.
שיקולים לגבי בקשות TPU בעומסי עבודה
רק מאגר אחד ב-Pod יכול להשתמש ב-TPU. מספר שבבי ה-TPU שמבקש קונטיינר צריך להיות שווה למספר שבבי ה-TPU שמחוברים לצומת בפרוסת ה-TPU.
לדוגמה, אם מבקשים TPU v5e (tpu-v5-lite-podslice) עם טופולוגיה של 2x4, אפשר לבקש כל אחת מהאפשרויות הבאות:
- TPU, שיוצר שני צמתים מרובי-מארחים עם 4 שבבי TPU כל אחד
4 -
8chips, which creates one single-host node with 8 TPU chips
כדי למקסם את היעילות של העלויות, מומלץ תמיד להשתמש בכל ה-TPU בפרוסת ה-TPU שאתם מבקשים. אם מבקשים פלח של שני צמתים עם 4 שבבי TPU כל אחד, צריך לפרוס עומס עבודה שפועל בשני הצמתים ומשתמש בכל 8 שבבי ה-TPU בפלח.
יצירת עומס עבודה שמבקש TPU
הפעולות הבאות יוצרות משימה שמבקשת TPU. אם יש לכם עומסי עבודה שפועלים על פרוסות TPU מרובות מארחים, אתם צריכים גם ליצור שירות ללא ראש שבוחר את עומס העבודה לפי שם. שירות זה מאפשר ל-Pods בצמתים שונים בפרוסת המארחים המרובים לתקשר ביניהם על ידי עדכון תצורת ה-DNS של Kubernetes כך שתצביע על ה-Pods בעומס העבודה.
שומרים את קובץ המניפסט הבא בשם
tpu-autopilot.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 parallelism: NUM_OF_VMS completions: NUM_OF_VMS completionMode: Indexed template: spec: # Optional: Run in GKE Sandbox # runtimeClassName: gvisor subdomain: headless-svc restartPolicy: Never nodeSelector: cloud.google.com/gke-tpu-accelerator: TPU_TYPE cloud.google.com/gke-tpu-topology: TPU_TOPOLOGY topology.kubernetes.io/zone: LOCATION 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מחליפים את הערכים הבאים בסדר הזה:
-
TPU_TYPE: בוחרים את גרסת ה-TPU שבה רוצים להשתמש, כמוtpu-v5-lite-podslice. הערך חייב להיות נתמך על ידי GKE. -
LOCATION: אימות האזור שבו GKE ממקם את מכונות ה-TPU הווירטואליות.אופציונלי: אפשר להשתמש באזור AI, כמו
us-central1-ai1a. אזורי AI הם מיקומים מיוחדים שעברו אופטימיזציה לעומסי עבודה של AI/ML בתוך אזורים Google Cloud . -
TPU_TOPOLOGY: בוחרים את הסידור של שבבי ה-TPU בפרוסת ה-TPU, כמו4x4. הטופולוגיה צריכה להיות נתמכת בסוג ה-TPU שנבחר. - מחפשים את
TPU_TYPEוTPU_TOPOLOGYשנבחרו בטבלה שבקטע בחירת טופולוגיה:-
NUM_OF_VMS: משתמשים בערך מהעמודה 'מספר מכונות וירטואליות' בעמודה 'מפרט טכני'. מגדירים את הערך הזה בשדותparallelismו-completionsבמפרט המשרה. -
NUMBER_OF_CHIPS: מזינים את מספר השבבים לכל מכונה וירטואלית. כדי לחשב את המדד הזה, מחלקים את הערך בעמודה 'מספר שבבי TPU לטופולוגיה' בערך בעמודה 'מספר מכונות וירטואליות' בשורה שנבחרה. מגדירים את הערך הזה לבקשת המשאבgoogle.com/tpu.
-
-
MEMORY_SIZE: כמות הזיכרון המקסימלית שבה נעשה שימוש ב-TPU. מגבלות הזיכרון תלויות בגרסת ה-TPU ובטופולוגיה שבהן אתם משתמשים. מידע נוסף זמין במאמר בנושא ערכי מינימום ומקסימום למאיצים.
אפשר גם לשנות את השדות הבאים:
-
image: הגדרה של תמונת ה-AI של JAX שבה רוצים להשתמש. בקובץ המניפסט לדוגמה, השדה הזה מוגדר לתמונה העדכנית ביותר של JAX AI. כדי להגדיר גרסה אחרת, אפשר לעיין ברשימה של תמונות AI עדכניות של JAX. -
runtimeClassname: gvisor: משתמשים בדגל הזה כדי להריץ את ה-Pod הזה ב-GKE Sandbox. כדי להשתמש, מבטלים את ההערה בשורה הזו. GKE Sandbox תומך ב-TPU מגרסה v4 ואילך. מידע נוסף זמין במאמר בנושא GKE Sandbox.
לדוגמה, נניח שיש לכם
tpu-v5-lite-podsliceעם טופולוגיה של4x4. ההגדרה הזו אומרת:- בטופולוגיה יש 16 צ'יפים בסך הכול (
4*4=16). -
tpu-v5-lite-podsliceנפרס ב-ct5lp-hightpu-4tמכונות וירטואליות עם ארבעה שבבים לכל מכונה וירטואלית. המשמעות היא שכדי לקבל טופולוגיה של4x4, צריך ארבע מכונות וירטואליות (16/4=4). לכן, צריך להגדיר את השדותparallelismו-completionsלערך4. - כל קונטיינר ב-Pod מבקש ארבעה שבבי TPU, שזהה למספר השבבים לכל מכונה וירטואלית. המניפסט
מציין את זה בשורה
google.com/tpu: 4.
-
פריסת המשרה:
kubectl create -f tpu-autopilot.yamlכשיוצרים את ה-Job הזה, מערכת GKE מבצעת באופן אוטומטי את הפעולות הבאות:
- הקצאת צמתים להרצת ה-Pods. בהתאם לסוג ה-TPU, לטופולוגיה ולבקשות המשאבים שציינתם, הצמתים האלה הם פרוסות של מארח יחיד או פרוסות של כמה מארחים.
- הוספת taints ל-Pods ו-tolerations לצמתים כדי למנוע הפעלה של עומסי עבודה אחרים באותם צמתים שבהם מופעלים עומסי עבודה של TPU.
כדי להימנע מחיובים נוספים אחרי שסיימתם את הקטע הזה, תוכלו למחוק את עומס העבודה שיצרתם:
kubectl delete -f tpu-autopilot.yaml
יצירת עומס עבודה שמבקש TPU ותזמון איסוף
ב-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 מרובות מארחים זמין באשכולות Autopilot בגרסה 1.31.2-gke.1537000 ואילך. צומתי TPU slice עם כמה מארחים עם טופולוגיה של 2x4 נתמכים רק בגרסה 1.31.2-gke.1115000 ואילך. כדי ליצור צמתים של פרוסות TPU מרובות-מארחים ולקבץ אותם כאוסף, מוסיפים את התוויות הבאות של Kubernetes למפרט עומס העבודה:
-
cloud.google.com/gke-nodepool-group-name: לכל אוסף צריך להיות שם ייחודי ברמת האשכול. הערך בתוויתcloud.google.com/gke-nodepool-group-nameצריך לעמוד בדרישות של תוויות אשכול. cloud.google.com/gke-workload-type: HIGH_AVAILABILITYלדוגמה, בלוק הקוד הבא מגדיר אוסף עם חלוקת TPU מרובת-מארחים:
nodeSelector: cloud.google.com/gke-nodepool-group-name: ${COLLECTION_NAME} cloud.google.com/gke-workload-type: HIGH_AVAILABILITY cloud.google.com/gke-tpu-accelerator: tpu-v6e-slice cloud.google.com/gke-tpu-topology: 4x4 ...
שימוש בפרוסת TPU עם מארח יחיד
תזמון איסוף ב-TPU slice nodes עם מארח יחיד זמין באשכולות Autopilot בגרסה 1.31.2-gke.1088000 ואילך. כדי ליצור צמתים של פרוסות TPU במארח יחיד ולקבץ אותם כאוסף, מוסיפים את התווית cloud.google.com/gke-workload-type:HIGH_AVAILABILITY למפרט של עומס העבודה.
לדוגמה, בלוק הקוד הבא מגדיר אוסף עם פרוסת TPU של מארח יחיד:
nodeSelector:
cloud.google.com/gke-tpu-accelerator: tpu-v6e-slice
cloud.google.com/gke-tpu-topology: 2x2
cloud.google.com/gke-workload-type: HIGH_AVAILABILITY
...
שימוש במחלקות מחשוב מותאמות אישית לפריסת אוסף
מידע נוסף על פריסת עומס עבודה שמבקש תזמון של עומס עבודה ואיסוף של TPU באמצעות מחלקות מחשוב בהתאמה אישית זמין במאמרים איסוף נתונים מ-TPU בכמה מארחים והגדרת סוג עומס עבודה עבור יעד רמת השירות של TPU.
דוגמה: הצגת מספר שבבי ה-TPU הכולל בפלח עם כמה מארחים
עומס העבודה הבא מחזיר את מספר שבבי ה-TPU בכל הצמתים בפרוסת TPU מרובת מארחים. כדי ליצור פלח מרובה מארחים, עומדים לרשות עומס העבודה הפרמטרים הבאים:
- גרסת TPU: TPU v4
- טופולוגיה: 2x2x4
הבחירה הזו של גרסה וטופולוגיה מובילה לפרוסת רשת מרובת מארחים.
- שומרים את קובץ המניפסט הבא בשם
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. 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.
- פורסים את המניפסט:
kubectl create -f available-chips-multihost.yaml
GKE מריץ פרוסת TPU v4 עם ארבע מכונות וירטואליות (פרוסת TPU מרובת-מארחים). לפרוסת ה-TPU יש 16 שבבי TPU שמחוברים ביניהם.
- מוודאים שמשימת ה-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
- מקבלים את היומנים של אחד מ-Pods:
kubectl logs POD_NAME
מחליפים את
POD_NAMEבשם של אחד מה-Pods שנוצרו. לדוגמה,tpu-job-podslice-0-5cd8r.הפלט אמור להיראות כך:
TPU cores: 16
- אופציונלי: מסירים את עומס העבודה:
kubectl delete -f available-chips-multihost.yaml
דוגמה: הצגת שבבי TPU בצומת יחיד
עומס העבודה הבא הוא Pod סטטי שמציג את מספר שבבי ה-TPU שמצורפים לצומת ספציפי. כדי ליצור צומת עם מארח יחיד, עומס העבודה צריך לכלול את הפרמטרים הבאים:
- גרסת TPU: TPU v5e
- טופולוגיה: 2x4
הגרסה והטופולוגיה שנבחרו יוצרות פרוסה של מארח יחיד.
- שומרים את קובץ המניפסט הבא בשם
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. 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.
- פורסים את המניפסט:
kubectl create -f available-chips-singlehost.yaml
GKE מספק צמתים עם שמונה פרוסות TPU של מארח יחיד שמשתמשות ב-TPU v5e. לכל צומת TPU יש שמונה שבבי TPU (פלח TPU של מארח יחיד).
- אחזור היומנים של ה-Pod:
kubectl logs tpu-job-jax-v5
הפלט אמור להיראות כך:
Total TPU chips: 8
- אופציונלי: מסירים את עומס העבודה:
kubectl delete -f available-chips-singlehost.yaml
התבוננות במעבדי TPU ומעקב אחריהם
מרכז שליטה
האפשרות לראות את נתוני השימוש במאגר הצמתים במסוף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_cyclekubernetes.io/container/accelerator/memory_usedkubernetes.io/container/accelerator/memory_total
צומת Kubernetes:
kubernetes.io/node/accelerator/duty_cyclekubernetes.io/node/accelerator/memory_usedkubernetes.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_utilizationkubernetes.io/container/accelerator/memory_bandwidth_utilization
צומת Kubernetes:
kubernetes.io/node/accelerator/tensorcore_utilizationkubernetes.io/node/accelerator/memory_bandwidth_utilization
מידע נוסף זמין במאמרים מדדים של Kubernetes ומדדי מערכת של GKE.
רישום ביומן
היומנים שנוצרים על ידי קונטיינרים שפועלים בצמתי GKE, כולל מכונות וירטואליות של TPU, נאספים על ידי סוכן הרישום ביומן של GKE, נשלחים ל-Logging ומוצגים ב-Logging.
המלצות לגבי עומסי עבודה של TPU ב-Autopilot
ההמלצות הבאות עשויות לשפר את היעילות של עומסי העבודה ב-TPU:
- אפשר להשתמש בתאי Pod עם זמן ריצה ממושך כדי לקבל תקופת חסד של עד שבעה ימים לפני ש-GKE מפסיק את הפעולה של תאי ה-Pod שלכם לצורך הקטנת קנה מידה או שדרוג צמתים. כדי לדחות עוד יותר את השדרוגים האוטומטיים של הצמתים, אפשר להשתמש בחלונות תחזוקה ובהחרגות עם Pods של זמן ריצה מורחב.
- כדי לוודא שעומסי העבודה שלכם יקבלו את יחידות ה-TPU שנדרשות להם בלי להיכנס לתור להמתנה לזמינות, אתם יכולים להשתמש בהזמנות של קיבולת.
כדי ללמוד איך להגדיר Cloud TPU ב-GKE, אפשר לעיין במקורות המידע הבאים: Google Cloud
- כדי להתחיל בהגדרת TPU, אפשר לתכנן את השימוש ב-TPU ב-GKE.
- פריסת עומסי עבודה של TPU ב-GKE Autopilot
- פריסת עומסי עבודה של TPU ב-GKE Standard
- שיטות מומלצות לשימוש ב-Cloud TPU למשימות של למידת מכונה.
- סרטון: בניית למידת מכונה בקנה מידה גדול ב-Cloud TPU באמצעות GKE
- הפעלת מודלים גדולים של שפה (LLM) באמצעות KubeRay ב-TPU
- מידע על הרצת עומסי עבודה של GPU בארגז חול (sandboxing) עם GKE Sandbox