המדריך הזה מיועד למהנדסי מערכות שרוצים להפיק פלט של תוכנות שמטרגטות את החומרה שלהם ביעילות. המדריך לא מפורט ומתבסס על ידע ב-LLVM, ב-Bazel וב-XA.
XLA הוא ממשק מופשט שאפשר להטמיע באמצעות ארכיטקטורה חדשה או מאיץ חדש כדי ליצור קצה עורפי להפעלת פלט של תוכניות למידת מכונה באמצעות XLA. טירגוט מחדש של XLA צריך להיות פשוט יותר באופן משמעותי וניתן להתאמה יותר מהטמעה של כל פעולה קיימת מ-framework של ממשק קצה, כמו PyTorch או TensorFlow לחומרה חדשה.
רוב ההטמעות ישויכו לאחד מהתרחישים הבאים:
- ארכיטקטורת המעבד (CPU) הקיימת עדיין לא נתמכת באופן רשמי על ידי XLA, עם או בלי קצה עורפי קיים של LLVM.
- חומרה שאינה דמוית מעבד (CPU) עם קצה עורפי של LLVM.
- חומרה שאינה דמוית מעבד (CPU) ללא קצה עורפי של LLVM.
תרחיש 1: ארכיטקטורת מעבד (CPU) קיימת עדיין לא נתמכת באופן רשמי על ידי XLA
בתרחיש הזה, מתחילים בבדיקת הקצה העורפי של XLA CPU הקיים. XLA מאפשר לטרגט בקלות מעבדים שונים באמצעות LLVM, כי ההבדל העיקרי בין קצוות עורפיים של XLA למעבדים (CPU) הוא הקוד שנוצר על ידי LLVM.
אם לספק החומרה יש קצה עורפי של LLVM לחומרה, אפשר לקשר בקלות את הקצה העורפי ל-LLVM שנוצר באמצעות XLA. במצב JIT, הקצה העורפי XLA CPU פולט קוד של המעבד (CPU). לצורך הידור מראש, xla::AotCompilationOptions
יכול לספק משולש LLVM כדי להגדיר את ארכיטקטורת היעד.
אם אין קצה עורפי של LLVM אבל קיים סוג אחר של מחולל קוד, אמורה להיות אפשרות להשתמש שוב ברוב הקצה העורפי של המעבד (CPU) הקיים.
תרחיש 2: חומרה שאינה דמוית-מעבד (CPU) עם קצה עורפי קיים של LLVM
אפשר ליצור מודל של הטמעה חדשה של xla::Compiler
במחלקות הקיימות xla::CPUCompiler
ו-xla::GPUCompiler
, כי הן כבר פולטות IRVM. בהתאם לאופי החומרה, ייתכן שיהיה צורך לשנות היבטים רבים ביצירת ה-IR של LLVM, אבל הרבה קוד יכול להיות משותף עם הקצוות העורפיים הקיימים.
דוגמה טובה לכך היא הקצה העורפי של GPU של XLA. הקצה העורפי של ה-GPU מטרגט ISA שלא דומה למעבד (CPU), ולכן חלק מההיבטים של יצירת הקוד שלו ייחודיים לדומיין של ה-GPU. סוגי חומרה אחרים, כמו מעבדי DSP כמו משושה (עם קצה עורפי של LLVM במעלה הזרם), יכולים לעשות שימוש חוזר בחלקים מלוגיקת הפליטה של LLVM IR, אבל חלקים אחרים יהיו ייחודיים.
תרחיש 3: חומרה שאינה דמוית-מעבד (CPU) ללא קצה עורפי של LLVM
אם לא ניתן להשתמש ב-LLVM, האפשרות הטובה ביותר היא להטמיע קצה עורפי חדש עבור XLA לחומרה הרצויה. באפשרות הזו נדרש מאמץ רב ביותר. המחלקות שצריך להטמיע הן:
StreamExecutor
: במכשירים רבים, לא כל השיטות שלStreamExecutor
נדרשות. לפרטים נוספים, יש לעיין בהטמעות הקיימות שלStreamExecutor
.xla::Compiler
: השיעור הזה כולל את הידור של חישוב HLO ב-xla::Executable
.xla::Executable
: המחלקה הזו משמשת להשקת חישוב הידור בפלטפורמה.xla::TransferManager
: המחלקה הזו מאפשרת לקצה העורפי לספק מנגנונים ספציפיים לפלטפורמה לבניית נתונים ליטרליים XLA מנקודות אחיזה נתונים של זיכרון המכשיר. במילים אחרות, זה עוזר בתהליכי העברת הנתונים מהמארח אל המכשיר ובחזרה.