אם נתקלתם בבעיות בהרצת עבודת Dataflow עם TPU, תוכלו להיעזר בשלבים הבאים לפתרון בעיות כדי לפתור את הבעיה.
פתרון בעיות בקובץ אימג' של קונטיינר
יכול להיות שיהיה לכם שימושי לבצע ניפוי באגים בתוכנת ה-TPU ובקונטיינר ב-VM עצמאי. אפשר לבצע ניפוי באגים באמצעות VM שנוצרה על ידי מאגר צמתים של GKE, או לבצע ניפוי באגים ב-worker VM של Dataflow שפועלת.
ניפוי באגים באמצעות מכונה וירטואלית עצמאית
כדי לנפות באגים במאגר התגים ב-VM עצמאי, אפשר ליצור מאגר צמתים של GKE שמשתמש באותו TPU VM לניסויים מקומיים.
לדוגמה, יצירת מאגר צמתים ב-GKE עם מכשיר TPU V5 Lite אחד ב-us-west1-c תיראה כך:
יוצרים אשכול GKE.
gcloud container clusters create TPU_CLUSTER_NAME \ --project PROJECT_ID \ --release-channel=stable \ --scopes=cloud-platform \ --enable-ip-alias \ --location us-west1-cיוצרים מאגר צמתים של GKE.
gcloud container node-pools create TPU_NODE_POOL_NAME \ --project PROJECT_ID \ --location=us-west1-c \ --cluster=TPU_CLUSTER_NAME \ --node-locations=us-west1-c \ --machine-type=ct5lp-hightpu-1t \ --num-nodes=1 \ [ --reservation RESERVATION_NAME \ --reservation-affinity=specific ]מוצאים את שם המכונה הווירטואלית של צומת ה-TPU במאגר הצמתים בממשק המשתמש של GKE או באמצעות הפקודה הבאה.
gcloud compute instances list --filter='metadata.kube-labels:"cloud.google.com/gke-nodepool=TPU_NODEPOOL_NAME"'כדי להתחבר ל-VM שנוצרה על ידי מאגר הצמתים של GKE באמצעות SSH:
gcloud compute ssh --zone "us-west1-c" "VM_NAME" --project PROJECT_IDאחרי שמתחברים למכונה וירטואלית באמצעות SSH, צריך להגדיר את Docker עבור Artifact Registry שבו אתם משתמשים.
docker-credential-gcr configure-docker --registries=us-west1-docker.pkg.devלאחר מכן, מפעילים קונטיינר מהתמונה שבה משתמשים.
docker run --privileged --network=host -it --rm --entrypoint=/bin/bash IMAGE_NAMEבתוך מאגר התגים, בודקים שאפשר לגשת ל-TPU.
לדוגמה, אם יש לכם תמונה שמשתמשת ב-PyTorch כדי להשתמש ב-TPU, פותחים רכיב תרגום של Python:
python3לאחר מכן, מבצעים חישוב במכשיר TPU:
import torch import torch_xla.core.xla_model as xm dev = xm.xla_device() t1 = torch.randn(3,3,device=dev) t2 = torch.randn(3,3,device=dev) print(t1 + t2)פלט לדוגמה:
>>> tensor([[ 0.3355, -1.4628, -3.2610], >>> [-1.4656, 0.3196, -2.8766], >>> [ 0.8667, -1.5060, 0.7125]], device='xla:0')אם החישוב נכשל, יכול להיות שהתמונה לא מוגדרת בצורה תקינה.
לדוגמה, יכול להיות שתצטרכו להגדיר את משתני הסביבה הנדרשים בקובץ Dockerfile של האימג'. כדי לוודא, מנסים שוב את החישוב אחרי שמגדירים את משתני הסביבה באופן ידני, באופן הבא:
export TPU_SKIP_MDS_QUERY=1 # Don't query metadata export TPU_HOST_BOUNDS=1,1,1 # There's only one host export TPU_CHIPS_PER_HOST_BOUNDS=1,1,1 # 1 chips per host export TPU_WORKER_HOSTNAMES=localhost export TPU_WORKER_ID=0 # Always 0 for single-host TPUs export TPU_ACCELERATOR_TYPE=v5litepod-1 # Since we use v5e 1x1 accelerator.אם חסרים יחסי תלות של PyTorch או LibTPU, אפשר לנסות שוב את החישוב אחרי שמתקינים אותם באמצעות הפקודה הבאה:
# Install PyTorch with TPU support pip install torch torch_xla[tpu] torchvision -f https://storage.googleapis.com/libtpu-releases/index.html
ניפוי באגים באמצעות מכונת וירטואלית של Dataflow
לחלופין, אתם יכולים להתחבר למופע של worker VM של Dataflow באמצעות SSH בזמן שהמשימה פועלת. מכיוון שמכונות וירטואליות של Dataflow worker מושבתות אחרי השלמת צינור הנתונים, יכול להיות שתצטרכו להאריך את זמן הריצה באופן מלאכותי על ידי ביצוע חישוב שממתין למשך זמן ממושך.
מכיוון שאי אפשר לשתף מכשיר TPU בין כמה תהליכים, יכול להיות שתצטרכו להריץ צינור שלא מבצע חישובים ב-TPU.
כדי למצוא מכונה וירטואלית בשביל משימת TPU שפועלת, מחפשים את מזהה משימת Dataflow ב Google Cloud סרגל החיפוש במסוף או מריצים את הפקודה הבאה של
gcloud:gcloud compute instances list --project PROJECT_ID --filter "STATUS='RUNNING' AND description ~ 'Created for Dataflow job: JOB_ID'"אחרי שמתחברים למכונה וירטואלית עם TPU באמצעות SSH, מפעילים קונטיינר מהתמונה שבה משתמשים. דוגמה מופיעה במאמר ניפוי באגים באמצעות מכונת VM עצמאית.
בתוך הקונטיינר, מגדירים מחדש את הגדרות ה-TPU ומתקינים את הספריות הנדרשות כדי לבדוק את ההגדרה. דוגמה מופיעה במאמר ניפוי באגים באמצעות מכונה וירטואלית עצמאית.
העובדים לא מתחילים
לפני שמתחילים לפתור בעיות, צריך לוודא שההגדרות של אפשרויות הצינור הבאות מוגדרות בצורה נכונה:
- אפשרות
--dataflow_service_option=worker_accelerator - אפשרות
--worker_zone - אפשרות
--machine_type
בודקים אם ברישומי המסוף מופיע שהעובדים מתחילים, אבל העבודה נכשלת עם הודעה שדומה להודעה הבאה:
Workflow failed. Causes: The Dataflow job appears to be stuck because no worker
activity has been seen in the last 25m.
יכול להיות שהבעיות האלה קשורות לקיבולת או לבעיות בהפעלת העובדים.
קיבולת: אם אתם משתמשים בקיבולת TPU על פי דרישה או בהזמנה שהסתיימה, יכול להיות שצינורות חדשים לא יתחילו לפעול עד שתהיה קיבולת זמינה. אם אתם משתמשים בהזמנה, אתם יכולים לבדוק את הקיבולת שנותרה בה בדף Compute Reservations במסוףGoogle Cloud או באמצעות הפקודה הבאה:
gcloud compute reservations describe RESERVATION_NAME --zone ZONEבודקים אם העבודה התחילה להפעיל מכונות וירטואליות של עובדים. כשעובד מתחיל את העבודה, בדרך כלל מתקבל פלט מרושמי יומנים כמו
worker,worker_startup,kubeletואחרים. בנוסף, בדף מדדי משימות במסוף Google Cloud , מספר העובדים הנוכחי צריך להיות גדול מאפס.הפעלה של Worker: בודקים את היומנים
job-messageו-launcher. אם צינור הנתונים מפעיל עובדים אבל הם לא מצליחים לבצע אתחול, יכול להיות שיש שגיאות במאגר התגים המותאם אישית.מקום בדיסק: מוודאים שיש מספיק מקום בדיסק בשביל העבודה. כדי להגדיל את נפח האחסון, משתמשים באפשרות
--disk_size_gb.
המשימה נכשלת עם שגיאה
אם העבודה נכשלת עם שגיאה, אפשר להיעזר בטיפים הבאים לפתרון בעיות.
ההפעלה של מאגר העובדים נכשלה
אם השגיאה הבאה מופיעה, צריך לוודא שצוין בצינור --worker_zone ושהאזור תואם לאזור של ההזמנה.
JOB_MESSAGE_ERROR: Startup of the worker pool in zone ZONE failed to
bring up any of the desired 1 workers. [...] INVALID_FIELD_VALUE:
Instance 'INSTANCE_NAME' creation failed: Invalid value for field
'resource.reservationAffinity': '{ "consumeReservationType":
"SPECIFIC_ALLOCATION", "key":
"compute.googleapis.com/RESERVATION_NAME...'. Specified reservations
[RESERVATION_NAME] do not exist.
קבוצות מופעי מכונה מנוהלות לא תומכות ב-Cloud TPU
אם מוצגת לכם השגיאה הבאה, פנו אל צוות החשבון כדי לוודא שהפרויקט שלכם רשום לשימוש ב-TPU, או דווחו על באג באמצעות הכלי של Google למעקב אחר בעיות.
apache_beam.runners.dataflow.dataflow_runner.DataflowRuntimeException: Dataflow pipeline failed. State: FAILED, Error: Workflow failed. Causes: One or more operations had an error [...]: [INVALID_FIELD_VALUE] 'Invalid value for field 'resource.instanceTemplate': Managed Instance Groups do not support Cloud TPUs. '.
ערך לא חוקי בשדה
אם השגיאה הבאה מופיעה, צריך לוודא שהפעלת צינור עיבוד הנתונים מגדירה את האפשרות worker_accelerator של שירות Dataflow.
JOB_MESSAGE_ERROR: Workflow failed. Causes: One or more operations had an error: 'operation-[...]': [INVALID_FIELD_VALUE] 'Invalid value for field 'resource.instanceTemplate': 'projects/[...]-harness'. Regional Managed Instance Groups do not support Cloud TPUs.'
המכשיר או המשאב תפוסים
אם השגיאה הבאה מופיעה, סביר להניח שעובד Dataflow שמבצע עיבוד של צינור הנתונים מריץ יותר מתהליך אחד שפונה אל TPU בו-זמנית. האפשרות הזו לא נתמכת. מידע נוסף זמין במאמר בנושא TPU ומקביליות של עובדים.
RuntimeError: TPU initialization failed: open(/dev/vfio/0): Device or resource busy: Device or resource busy; Couldn't open iommu group /dev/vfio/0
אם השגיאה שלמעלה מוצגת לכם בזמן ניפוי הבאגים של צינור העיבוד במכונה וירטואלית, תוכלו לבדוק את התהליך שמעכב את ה-TPU ולהפסיק אותו באמצעות הפקודות הבאות:
apt update ; apt install lsof
lsof -w /dev/vfio/0
kill -9 PROCESS_ID # to terminate the process.
אין תמיכה במיגרציה פעילה של מופעים עם מאיצי אורחים
אם מופיעה השגיאה הבאה, סביר להניח שהצינור הושק עם סוג מכונה שהוגדר במפורש עם מאיצים, אבל לא צוינה הגדרת מאיץ בצורה נכונה. מוודאים שהפעלת צינור הנתונים מגדירה את worker_accelerator האפשרות של שירות Dataflow, ומוודאים שאין שגיאות הקלדה בשם האפשרות.
JOB_MESSAGE_ERROR: Startup of the worker pool in zone ZONE failed to bring up any of the desired 1 workers. [...] UNSUPPORTED_OPERATION: Instance INSTANCE_ID creation failed: Instances with guest accelerators do not support live migration.
תהליך העבודה נדחה אוטומטית על ידי השירות
יכול להיות שיופיעו גם השגיאות הבאות אם חלק מאפשרויות החובה של צינור העברת הנתונים חסרות או שגויות:
The workflow was automatically rejected by the service. The requested accelerator type tpu-v5-lite-podslice;topology:1x1 requires setting the worker machine type to ct5lp-hightpu-1t. Learn more at: https://cloud.google.com/dataflow/docs/guides/configure-worker-vm
תם פרק הזמן שהוקצב להמתנה לעדכון מהעובד
כשמפעילים צינורות עיבוד ב-TPU VM עם הרבה vCPU, יכול להיות שהעבודה תיתקל בשגיאות כמו הבאות:
Workflow failed. Causes WORK_ITEM failed. The job failed because a work item has failed 4 times. Root cause: Timed out waiting for an update from the worker.
אם השגיאה הזו מופיעה, כדאי לנסות לצמצם את מספר השרשורים.
לדוגמה, אפשר להגדיר: --number_of_worker_harness_threads=50.
אין שימוש ב-TPU
אם צינור הנתונים פועל בהצלחה אבל מכשירי TPU לא נמצאים בשימוש או שאין אליהם גישה, צריך לוודא שהמסגרות שבהן אתם משתמשים, כמו JAX או PyTorch, יכולות לגשת למכשירים המצורפים. כדי לפתור בעיות בקובץ האימג' של הקונטיינר במכונה וירטואלית יחידה, אפשר לעיין במאמר ניפוי באגים באמצעות מכונה וירטואלית עצמאית.