-mpmd-copy-topology-from-main
מעתין את הטופולוגיה מהפונקציה הראשית לפונקציות שאליהן מתייחס mpmd.call.
מעתיקה את מאפיין הטופולוגיה מהפונקציה הראשית לכל פונקציה שאליה מתייחס mpmd.call. היא גם מגדירה את הנמען של mpmd.call כפרטי, כדי שלא יחשבו בטעות שמדובר בפונקציית נקודת כניסה.
-mpmd-enforce-input-output-equisharding
אוכפת מגבלות של חלוקה שווה לפונקציות MPMD.
כדי לאכוף את ההגבלות על חלוקת נתונים שווה בפונקציות MPMD, המערכת מציגה TransferOps כשצריך.
אפשרויות
-constraints : A list of constraint, each enforcing that an input and output should be assigned to the same mesh.
-mpmd-generate-sdy-meshes-from-topology
יוצרת רשתות שבריריות על סמך טופולוגיית ה-MPMD.
המעבר הזה יוצר הסרה של פעולות קיימות של רשתות שרדיות ומחליף אותן בפעולות שמבוססות על טופולוגיית MPMD. בנוסף, הוא מעדכן את חלוקת הטנסורים כדי להתייחס לפעולות החדשות של הרשת.
-mpmd-infer-mesh-assign-mesh-func-leaves
_Assigns a mesh to each unused computation, function output, and function input using the use_set and srcset analysis.
השלב הזה מקצה רשתות לעלים של גוף הפונקציה (כלומר, התוצאות של חישובים שלא נעשה בהם שימוש, ארגומנטים של פונקציות שלא נעשה בהם שימוש ופלט של פונקציות) על ידי יצירת AssignOps או שינוי הסוג, באמצעות המידע use_set ו-src_set.
אנחנו גם מתייחסים לערכי ביניים מסוימים כאל עלים, לצורך ניתוח. כלומר: האופרנדים של mpmd.reduce ו-mpmd.broadcast נחשבים לעלים וייווצר להם זוג של הקצאה וביטול הקצאה.
ההקצאה הזו תנקה את use_set של כל הפעולות שאינן עלים, כי השימושים שסומנו קודם יהיו לא רלוונטיים מאחר שהסקת פעולות צמצום תשנה את use_set של חלק מהערכים: ההפצה הראשונית של use_set לא מודעת לפעולות צמצום, אבל עכשיו, אחרי שהסקנו פעולות צמצום, ההפצה תהיה שונה.
המעבר הזה ייכשל ויפיק שגיאות אם לא יאוכלסו בצורה נכונה ערכי use- ו-src-sets עבור פעולות עלים.
תנאי מוקדם: לכל פעולה יש src-set לא ריק, או שאנחנו מסיקים העברות.
אפשרויות
-infer-transfers : Whether to create transfers when needed, instead of erroring.
-error-limit : The number of errors to emit. Set to -1 to emit all errors. Cannot be 0.
-mpmd-infer-mesh-assign-using-input-output-constraints
משייכת רשת לקלטים ולפלטים בהתאם למגבלות השיוך של קלט-פלט.
הכרטיס הזה משתמש באילוצי הקצאה שווים של קלט-פלט כדי להקצות גם את הקלט וגם את הפלט לאותה רשת.
שימו לב: הפעולה הזו מבטיחה שהקלט יהיה באותה רשת, גם אם הוא יועבר בהמשך לרשתות אחרות. אבל זה אומר שאסור להריץ את populate-src-set אחרי המעבר הזה.
נדרש:
- לכל קלט
iשל פונקציית נקודת הכניסה שעשוי להיות חלק מאילוץ של הקצאה שווה:iיש MeshTensorType, או שיש לו קבוצת שימוש מוגדרת היטב. - לכל פלט
oשל פונקציית נקודת הכניסה שעשוי להיות חלק מאילוץ של הקצאה שווה:oהוא מסוג MeshTensorType, או שיש לו קבוצות src ו-use מוגדרות היטב.
אם קבוצת השימוש המוגדרת היטב של ערך מסוים כוללת את כל הרשתות שהערך מוקצה להן (באופן טרנזיטיבי) באמצעות פעולות mpmd.assign ולא רשתות אחרות. קבוצת מקורות מוגדרת היטב כוללת את כל הרשתות שבהן הטנזור יכול להתקיים, ולא רשתות אחרות.
למרות שהיא פועלת רק בפונקציות של נקודת כניסה, אנחנו הופכים אותה למעבר של פעולת מודול כי היא דורשת שכל המעברים בפונקציות הקיימות יושלמו לפני שהיא תפעל. לדוגמה, אם נגדיר את זה כ-EntryPointFunctionPass, יכול להיות שמנהל הכרטיסים יפעיל את הכרטיס הזה לפני שהאימות יושלם בפונקציות שאינן נקודות כניסה.
אפשרויות
-verbose-logging : Whether to enable verbose logging
-constraints : A list of constraint, each enforcing that an input and output should be assigned to the same mesh.
-mpmd-infer-mesh-convert-reduce-ops
ממירה פעולות reduce עם הערות לפעולות mpmd.reduce ומשטחת שרשראות של פעולות reduce.
ממיר את פעולות ה-reduce עם ההערות לפעולות mpmd.reduce, וגם משטח שרשראות של פעולות ה-reduce האלה.
בסמלים:
x = add(w0, w1) {mpmd.reduce = #mpmd.reduce
אפשרויות
-infer-cross-mesh-reductions : Whether to infer cross-mesh reductions. Will be enabled by default once stable.
-mpmd-infer-mesh-finalize
מבצע ניקוי סופי אחרי הסקת מסקנות לגבי התאמת דפוסים.
אפשרויות
-infer-transfers : Whether to create transfers when needed, instead of erroring.
-mpmd-infer-mesh-populate-src-set
_Initializes the src_set for UnassignOps and func args and propagates the srcset.
במעבר הזה מתבצעת הפעלה של src_set והפצה שלו, ואכלוס של הגרף בפרטים של src_set.
תנאי מוקדם: כדי שארגומנטים של פונקציות יכללו src_sets, צריך למלא את use_set.
אתחול: המאפיין src_set של UnassignOp מוגדר לרשת שהוא מקצה. ה-src_set של ארגומנט של פונקציה מוגדר ל-use_set שלו.
הפצה: ערכי src_sets מופצים קדימה מאופרנדים אל האופרטור עצמו, ומתבצעת פעולת חיתוך של האופרנדים. פרטים נוספים מופיעים בכתובת PropagateSrcSet.
-mpmd-infer-mesh-populate-use-set
_Initializes the use_set for AssignOps and propagates the useset.
המעבר הזה מאתחל את use_set ומפיץ אותו אחורה, ומאכלס את הגרף בפרטים של use_set.
הפעלה: קבוצת השימוש של AssignOp מוגדרת לרשת שאליה היא משויכת.
הפצה: הערך של use_sets מופץ לאחור מהמשתמשים אל הפעולה עצמה, ומתבצע איחוד של המשתמשים. השימוש של פעולה מסוימת הוא איחוד של השימוש של המשתמשים שלה, כי השימוש הוא קבוצת השימושים הטרנזיטיביים.
-mpmd-infer-mesh-rewrite-using-analysis
_Rewrites ops according to the useset.
בשלב הזה מוקצים אופרטורים ללא רשת על ידי עטיפתם בשברים, באמצעות ניתוחי use_set ו-src_set.
בנוסף, המערכת מסירה את המאפיינים use_set ו-src_set כחלק מהניקוי, כי כבר אין צורך בניתוחים אחרי הפעולה הזו.
תנאי מוקדם: לכל פעולה יש use_set, כלומר הניתוח הושלם. תנאי מוקדם: כל ארגומנט של פונקציה שאינה נקודת כניסה משמש לפחות על ידי אופרטור שאינו מסוג terminator.
TODO: jupvfranco - consider renaming this pass given that it doesn't depend on the analysis so much anymore.
אפשרויות
-max-clones : How many copies of a meshless operation we allow. Setting it to 1 means we never clone the op.
-mpmd-infer-mesh-validate-no-additional-transfers-needed
מוודא שלא נדרשות העברות נוספות להקצאת רשת מש.
הכרטיס הזה מאמת שאפשר להקצות רשת לכל הפעולות ללא רשת, בלי להוסיף העברות נוספות.
לפעולות ללא רשת שלא מוגדרות כפעולות פונקציונליות, תופיע שגיאה במקרים הבאים:
- הערך use_set לא נכלל ב-src_set עבור פעולה נתונה, כלומר נדרשת העברה.
במקרה של פעולות func, מספיק לבדוק את התנאים שלמעלה לגבי הארגומנטים של func, כי הפונקציה מחזירה פעולות ללא רשת או ארגומנטים של בלוק.
אפשרויות
-error-limit : The number of errors to emit. Set to -1 to emit all errors. Cannot be 0.
-mpmd-infer-mesh-validate-src-set-not-empty
_Validates that every meshless op has a non-empty srcset.
המעבר הזה מאמת את כל הפעולות ללא רשת, ובודק שאפשר להקצות את הפעולה איפשהו. כלומר, עבור פעולות ללא רשת שלא מוגדרות כפעולות func, תוחזר שגיאה אם src_set ריק בפעולה או אם ההפחתה נחשבת להפחתה חוצת-רשת אבל היא לא מומרת. זוהי דרישה מקדימה להקצאת חופשות פונקציונליות.
במקרה של פעולות func, מספיק לבדוק את התנאים שלמעלה לגבי הארגומנטים של func, כי הפונקציה מחזירה פעולות ללא רשת או ארגומנטים של בלוק.
הבדיקה הזו צריכה להתבצע ברמת המודול, כי במקרה של שגיאה ב-callee, אנחנו רוצים להדפיס את ה-callers.
תנאי מוקדם: צריך להמיר את ההפחתות בין רשתות כדי להפחית את מספר הפעולות לפני שמריצים את השלב הזה.
אפשרויות
-error-limit : The number of errors to emit. Set to -1 to emit all errors. Cannot be 0.
-mpmd-inline-nested-user-exposed-ops
_Inlines any user-exposed mpmd op nested in a namedcomputation.
הפונקציה מחליפה כל named_computation, named_tensor, broadcast ו-reduce op שמוטמעים ב-named_computation, ובודקת שההקצאה שלהם לרשת (כשהיא מוגדרת) תואמת להקצאה של רכיב האב.
אפשרויות
-assignment : Mapping between names (of computations and tensors) and mesh names, and optionally stage ids. E.g., 'n0@m0,n1@m1' defines that names n0 and n1 will be assigned to meshes m0 and m1, respectively. Alternatively 'n0@m0/0,n1@m1/1' means that these names are also assigned to the stages 0 and 1.
-mpmd-insert-nameless-clone-of-negligible-ops
שיבוטים של פעולות זניחות מחוץ לחישובים עם שמות.
משכפל פעולות זניחות, כלומר פעולות עם תוצאה אחת, פעולות עם אפס אופרנדים, מחוץ לחישובים עם שמות בכל פעם שהן נמצאות בפעולת ההחזרה של החישוב, ומחליף את התוצאה של named_computation בשיבוט. הסיבה לכך היא שאם תוצאות כאלה ישמשו לחישובים עם שמות שהוקצו לרשתות שונות, עלול להיווצר ניגוד בהסקת המסקנות לגבי הרשת. החלת הכרטיס הזה מאפשרת להסיק מסקנות לגבי רשתות כדי לשכפל את הפעולות הזניחות האלה.
הכרטיס הזה לא משנה את החישוב שנקרא בשם.
-mpmd-introduce-transfers
יוצר העברות נתונים על סמך הקצאות של משתמשים לרשת.
יוצר כרטיס שמתאר פעולות העברה על סמך הקצאות של רשת משתמשים. למשל:
- Push in UnassignOp to mpmd calls if the result of UnassignOp is later assigned in the callee.
- הפונקציה מחליפה את AssignOp של UnassignOp ב-TransferOp.
- להקצות את התוספת לרשת שצורכת את הנתונים ולהוסיף העברה אם יש תוספת ללא רשת בין הפרגמנטים.
-mpmd-map-input-output-to-mesh
הקצאת רשתות לקלטים ולפלט של הפונקציה.
יוצר מעבר שממפה את הקלט והפלט של הפונקציה לרשתות, בהינתן הקצאת רשת שהוגדרה על ידי המשתמש.
במקרה של ארגומנטים של קלט, הכרטיס הזה:
- מבצע המרה של טנסורים של קלט שצריך להציב על רשת לטנסור של רשת.
- מעדכנים את חתימת הפונקציה.
- הפונקציה מוסיפה mpmd.unassign לפני השימוש בטנסור.
במקרה של ארגומנטים של פלט, ההעברה הזו מוסיפה mpmd.assign לפני שהטנסור מוחזר ומעדכנת את חתימת הפונקציה.
דרישות: כל אינדקס קלט/פלט תקין וכל רשת ממופה היא רשת תקינה בטופולוגיה.
אפשרויות
-input-assignment : Mapping between function input indices and assigned mesh names.E.g., '0@m0,1@m1' defines that input with index 0 will be assigned to mesh m0 and input with index 1 will be assigned to mesh m1.
-output-assignment : Mapping between function output indices and assigned mesh names.E.g., '0@m0,1@m1' defines that output with index 0 will be assigned to mesh m0 and output with index 1 will be assigned to mesh m1.
-mpmd-map-named-ops-to-mpmd-ops
הקצאת רשתות לפעולות שהוגדרו על ידי המשתמש.
יוצר מעבר, ומקצה באופן אופציונלי את mpmd.named_tensor ל-Assign(Unassign(%v)) (תלוי אם יש רשומה ב-assignment), וממפה כל named_computation לרשת, באמצעות מיפוי שמוגדר על ידי המשתמש בין named_computations לבין שמות רשתות. כלומר, צריך להחליף כל named_computation ב-Fragment וליצור AssignOps לאופרנדים ו-UnassignOps לתוצאות של ה-Fragments האלה. התבנית Assign(Unassign(%v)) שנוספה עכשיו נכתבת מחדש כ-Transfer(%v).
אחרי השלב הזה לא יהיו יותר פעולות named_computation/named_tensor.
נדרש: כל named_computations ו-named_tensors צריכים להיות ברמה העליונה של הפונקציה.
אפשרויות
-assignment : Mapping between names (of computations and tensors) and mesh names, and optionally stage ids. E.g., 'n0@m0,n1@m1' defines that names n0 and n1 will be assigned to meshes m0 and m1, respectively. Alternatively 'n0@m0/0,n1@m1/1' means that these names are also assigned to the stages 0 and 1.
-mpmd-simplify-named-computations
מפשטת את הקלט והפלט של פעולות חישוב עם שם.
מפשט כל חישוב בעל שם בנפרד. באופן ספציפי, הוא:
- מסירה כפילויות מהתוצאות ומערכי ההחזרה התואמים שלהן.
- מסיר כפילויות של אופרנדים ושל הארגומנטים התואמים שלהם בבלוק;
- מסירה תוצאות שאופרנד ההחזרה התואם שלהן הוא ארגומנט של בלוק של הפעולה;
- מסיר אופרנדים שאין יותר שימוש בארגומנטים של הבלוקים התואמים שלהם (או שלא היה בהם שימוש מלכתחילה); ו
- מסיר תוצאות שלא נעשה בהן שימוש.
- מחליף את התבנית
arg -> stablehlo.optimization_barrier -> returnבחישוב בשם בתבניתarg -> return, ומאפשר פישוט נוסף.
-mpmd-validate-named-ops-in-mpmd-func
בודק שפונקציות אופרטור בעלות שם מוטמעות רק בפונקציות mpmd.
הפונקציה מאמתת ש-NamedComputationOp ו-NamedTensorOp מוטמעות רק בפונקציות mpmd, כלומר בפונקציות עם מאפיין טופולוגיה.