קומפילציה עם XLA יכולה לשפר מאוד את הביצועים של התוכניות שלך, אבל ל-TensorFlow interop יש מספר פינות חדות ידועות.
tf.Variable
במכשיר אחר
הודעת שגיאה : INVALID_ARGUMENT: Trying to access resource <Variable> (defined @ <Loc>) located in device CPU:0 from device GPU:0
אשכול XLA פועל בדיוק על מכשיר אחד, והוא לא יכול לקרוא או לכתוב ל- tf.Variable
הממוקם במכשיר אחר. בדרך כלל הודעת שגיאה זו מציינת שהמשתנה לא הוצב במכשיר הנכון מלכתחילה. הודעת השגיאה צריכה לציין במדויק את מיקומו של המשתנה הפוגע.
המרת TensorArray TF/XLA אינה נתמכת
הודעת שגיאה : Support for TensorList crossing the XLA/TF boundary is not implemented
.
XLA תומך ב- tf.TensorArray
. עם זאת, ההמרה ההדדית בין ייצוגי TF ו-XLA אינה מיושמת עדיין. שגיאה זו מתעוררת לעתים קרובות כאשר נעשה שימוש ב- TensorArray
בתוך הבלוק המהידור, אך הנגזרת נלקחת החוצה.
פתרון לעקיפת הבעיה : הרכיב את ההיקף החיצוני ביותר שלוקח את הנגזרת.
TensorFlow בעוד לולאות צריכות להיות מוגבלות (או שהתמיכה האחורית תהיה מושבתת)
הודעת שגיאה : XLA compilation requires a fixed tensor list size. Set the max number of elements. This could also happen if you're using a TensorArray in a while loop that does not have its maximum_iteration set, you can fix this by setting maximum_iteration to a suitable value
.
לולאות TF while שנוצרו באמצעות tf.while_loop
תומכות בהפצה לאחור על ידי צבירת כל תוצאות הביניים ב- TensorArray
, אך XLA תומך רק ב- TensorArray
s bounded.
פתרון לעקיפת הבעיה : לכל לולאות קומפילציה בעוד צריך להגדיר פרמטר maximum_iterations
לערך קבוע הידוע בזמן ההידור, או שההפצה לאחור מושבתת באמצעות back_prop=False
.
Dynamic tf.TensorArray
אינו נתמך
כתיבה לתוך tf.TensorArray(..., dynamic_size=True)
אינה ניתנת להידור עם XLA, מכיוון שכתיבת כתיבה כזו דורשת מספר לא ידוע של הקצאות מחדש כאשר המערך חורג מהגבול המקורי.
פתרון לעקיפת הבעיה : ספק חיבור ידוע סטטי למערכים שלך.
יצירת מספרים אקראית מתעלמת מ-TF seed
XLA מתעלם כרגע מזרעי TF לפעולות אקראיות. זה משפיע על פעולות אקראיות של מצב TF, כגון tf.random.normal
, או tf.nn.dropout
. XLA יתנהג כאילו הקומפילציה זרעה עם סיד ייחודי חדש בכל הפעלה בתוך אותו תהליך (הריצה הראשונה של התהליך תמיד תניב את אותה תוצאה).
פתרון : השתמש ב-RNGs המומלצים כגון tf.random.stateless_uniform
או tf.random.Generator
ישירות.
אין תמיכה בכניסות חייבות להיות קבועות שהן פונקציות של משתני אינדוקציה
הודעת שגיאה : XLA compilation requires that operator arguments that represent shapes or dimensions be evaluated to concrete values at compile time. This error means that a shape or dimension argument could not be evaluated at compile time, usually because the value of the argument depends on a parameter to the computation, on a variable, or on a stateful operation such as a random number generator
.
XLA דורש שערכים מסוימים יהיו ידועים בזמן ההידור, כגון ציר הפחתה של פעולת צמצום, או ממדי טרנספוזיציה. שקול את המקרה שבו למשל, ציר ההפחתה מוגדר כפונקציה של משתנה אינדוקציה של tf.range
: פתרון זה באופן סטטי אינו אפשרי ללא פתיחת הלולאה כולה, מה שאולי לא ירצה המשתמש.
פתרון עוקף: פתח לולאות, למשל על ידי המרת tf.range
range
Python.