-sdy-add-data-flow-edges
הטמעת DataFlowEdgeOp
לכל קצוות זרימת הנתונים.
הוספת DataFlowEdgeOp
לכל ערך שהוא הבעלים של קצוות של זרימת נתונים, כלומר כל הערכים שמוחזרים על ידי getDataFlowEdgeOwners
בכל פעולה במודול.
אם היעד של הבעלים קיים, ה-DataFlowEdgeOp
שיוכנס יקבל את חלוקת המשנה הקיימת שלו.
TODO(b/330339693): update this doc when getDataFlowEdgeOwners
is removed.
-sdy-apply-sharding-constraints
מחילים אילוצים שמכתיבים את הפיצול של הקלט שלהם.
הפונקציה מעתיקה את חלוקת המשנה של ShardingConstraintOp
לקלט שלה אם היא עומדת בכל התנאים הבאים:
- לא קיים חלוקה לפלחים (sharding) של הקלט.
- הקלט לא נוצר על ידי
DataFlowEdgeOp
, שמכיל את חלוקת הנתונים לכל היעדים של הקצה. - הפיצול של
ShardingConstraintOp
סגור לגמרי. - בקלט אין משתמשים אחרים מסוג
ShardingConstraintOp
אוManualComputationOp
עם פיצול אחר.
המשמעות היא שה-ShardingConstraintOp
קובע את חלוקת הקלט שלו.
חשוב לזכור שהחלוקה לפלחים של ShardingConstraintOp
תופץ לקלט או למשתמשים שלו במהלך ההעברה, ללא קשר למעבר הזה. עם זאת, מכיוון שהמאפיין closed של המאפיין לא מופץ, חשוב להעתיק את החלוקה לפלחים כדי לפעול בהתאם למגבלה במלואה במקרים שלמעלה.
בנוסף, אם נעשה שימוש בטנזור (tensor) באמצעות שרשרת של ShardingConstraintOp
שעונים על כל הקריטריונים הבאים:
- הטנזור לא נוצר על ידי
ShardingConstraintOp
ואין לו משתמשים אחרים מסוגShardingConstraintOp
אוManualComputationOp
. - לאף אחד מה-
ShardingConstraintOp
בשרשרת אין יותר משימוש אחד מלבד השימוש האחרון. - ל-
ShardingConstraintOp
האחרון בשרשרת אין משתמשים מסוגShardingConstraintOp
אוManualComputationOp
(אחרת הוא לא האחרון בשרשרת).
אז הכרטיס הזה מחליף את כל שאר השימושים בקלט של השרשרת, שמוגדרים אחרי ShardingConstraintOp
האחרון בשרשרת (ובאותו בלוק), בתוצאה של השרשרת, כי היא אמורה לקבוע את חלוקת השטחים (sharding) של השימושים האלה.
-sdy-constant-splitter
מפצלת חישובי משנה קבועים כך שלכל אחת מהם יהיה שימוש אחד.
מחלקת חישובי משנה קבועים כך שיהיה להם משתמש יחיד.
כך מוודאים שחלוקה לפלחים לא תופץ בין שימושים שונים של חישוב משנה קבוע, כי זה נחשב לקשר תלוי שגוי (לא צריך לפצל את השימושים של קבוע באותו אופן רק בגלל שהם משתמשים באותו קבוע). למעשה, לכל שימוש יכול להיות חיתוך שונה שיכול להתחלק בנפרד לעותק משלו של חישוב המשנה הקבוע.
חישוב משנה קבוע הוא:
- אופרטור קבוע או אופרטור iota (ללא אופרנדים)
- שידור, פלח או פעולה לחלוטין ברמת היסוד, שהאופרנדים שלה מוגדרים כולם על ידי חישובי משנה קבועים (באופן רקורסיבי), יחד עם כל חישובים המשנה שמגדירים את האופרנדים שלה.
חשוב לזכור שבתוך חישוב משנה קבוע, לאותו ערך יכולים להיות כמה שימושים באותו חישוב משנה.
-sdy-lift-inlined-meshes
הפעולה מעבירה MeshAttr
s מוטמעים בחלוקות (shards) כסמלים MeshOp
.
הפונקציה מחליפה כל MeshAttr
מוטמע ב-TensorShardingAttr
בשם של סמל רשת, שמתייחס ל-MeshOp
קיים או חדש במודול, כך שלא יהיו שני MeshOp
עם MeshAttr
זהה (גם MeshOp
קיימים מוחקים כפילויות).
השם של כל MeshOp
חדש יהיה:
maximal_mesh_{device-id}
, למערך משוער מקסימלי (כלומר, רשימת צירים ריקה ומזהה מכשיר יחיד).- השם הראשון שזמין ברשימה [
mesh
,mesh_0
,mesh_1
, ...], אחרת. ###-sdy-manual-axes-cleanup
ניקוי השימוש בצירים ידניים ב-ManualComputationOp
1) לכל חלוקה לפלחים (in/out) שלא צוינה בה ציר ידני, מוסיפים את הציר הידני הזה ל-replicated_axes. כך אפשר לוודא שהצירים הידניים תמיד יצוינו במלואם.
2) מיון הצירים הידניים לפי סדר ההצהרה של ציר הרשת.
-sdy-sharding-group-import
השלבים של יצירת גרסת קנוניקל ואימות עוברים בקבוצות של חלוקה לפלחים.
החלת קנוניזציה ואימות על קבוצות לפיצול במהלך הייבוא. אלה הם:
1) איחוד קבוצות של חלוקה לקטעים – משלבת קבוצות של חלוקה לקטעים באמצעות המאפיין המעברי של חברות בקבוצה. בכל פעם שמערך T נמצא בקבוצת חלוקה G1 וגם בקבוצת חלוקה G2, אפשר להסיק שצריך לפצל את כל המשתתפים ב-G1 וב-G2 באותו אופן. כך אנחנו יכולים לשלב את G1 ו-G2 בקבוצה אחת. קבוצת מזהי הקבוצות הקנוניות לאחר המיזוג תהיה 0,1,…N-1 עבור קבוצת הקבוצות המינימלית.
2) אימות קבוצות חלוקה (Sharding)
אימות שקבוצות החלוקה (Sharding) תקינות ותואמות להנחות
בהטמעה. נכון לעכשיו, ההצהרה הזו קובעת שאם קבוצת חלוקה לפלחים מכילה Value
שמוגדר בתוך הבלוק של ManualComputationOp
, כל הערכים האחרים בקבוצה הזו חייבים להיות באותו בלוק.