קטגוריה: זמן הידור: חוסר התאמה בפלט של העברת עומס המארח
השגיאה הזו מתרחשת כשערך טנסור שמועבר באופן מפורש לזיכרון המארח מוחזר כפלט של התוכנית, אבל חתימת הפלט של התוכנית לא מוגדרת לצפות לזיכרון המארח.
הודעות שגיאה לדוגמה:
INVALID_ARGUMENT: Tensor which is moved to host (starting from tuple.64) is returned from the entry computation but the layout for this output is not set to host memory.
XLA Backends: TPU, GPU
סקירה כללית
כשהקומפיילר נתקל באנוטציה להפחתת עומס של טנסור למארח (CPU), הוא עוקב אחרי המיקום של הטנסור דרך גרף החישוב עד שאחד משלושת האירועים הבאים מתרחש:
- Move to Device: הערה תואמת מעבירה את הטנסור בחזרה למאיץ.
- חישוב במארח: הטנזור נצרך על ידי פעולה בצד המארח.
- סוף התוכנית: הטנסור מגיע לסוף התוכנית והופך לפלט.
השגיאה הזו מופעלת בתרחיש מס' 3. הטנסור ממוקם פיזית בזיכרון המארח בסוף ההרצה, אבל חתימת החישוב של תוכנית XLA מגדירה את הפלט הספציפי הזה כפלט ששייך ל-Device Memory. הקומפיילר לא יכול לשנות באופן מרומז את הממשק של חישוב הרשומה, ולכן הוא מעלה שגיאה.
ניפוי באגים
כדי לפתור את השגיאה הזו, צריך לקבוע אם הטנזור הזה אמור להיות פלט במארח או אם הוא היה צריך לחזור למכשיר לפני ההחזרה.
הערך שיוחזר במארח: אם רוצים שהטנסור הזה יוחזר בזיכרון המארח (כדי להימנע מהעברה חזרה למכשיר), צריך להגדיר באופן מפורש את מרחב הזיכרון של הפלט של חישוב הרשומה כזיכרון המארח עבור הפלט הספציפי הזה.
הטנסור אמור לחזור למכשיר: אם הטנסור אמור להישאר במכשיר או לחזור אליו לפני שהתוכנית מסתיימת, כנראה פספסתם הערה. מוסיפים הערה תואמת כדי להעביר את הטנסור בחזרה למכשיר.
אם המקור של טנסור שהועבר לא ברור, או אם לא הצלחתם למצוא איפה חסרה ההערה 'העברה למכשיר', תוכלו להשתמש ברישום ביומן של XLA כדי לעקוב אחרי ההוראות.
- הפעלת רישום ביומן: אם אתם משתמשים ב-Google Cloud TPU, מריצים מחדש את התוכנית עם הדגל הבא:
--vmodule=host_offloader=1. - ניתוח יומנים: מחפשים את הפלט של 'trace' ביומנים. כאן יוצג הנתיב של הטנסור החל מההוראה להפחתת עומס. אפשר להשתמש בזה כדי לזהות בדיוק איפה הטנסור מגיע לגבול התוכנית בלי להעביר אותו בחזרה למכשיר.