-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

הפעולה מעבירה MeshAttrs מוטמעים בחלוקות (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, כל הערכים האחרים בקבוצה הזו חייבים להיות באותו בלוק.