-sdy-add-data-flow-edges

הטמעת DataFlowEdgeOp לכל קצוות זרימת הנתונים.

הוספת DataFlowEdgeOp לכל ערך שהוא הבעלים של קצוות של זרימת נתונים, כלומר כל הערכים שמוחזרים על ידי getDataFlowEdgeOwners בכל פעולה במודול.

אם היעד של הבעלים כבר מחולק למקטעים, ה-DataFlowEdgeOp שיוכנס יקבל את החלוקה הקיימת למקטעים.

-sdy-apply-sharding-constraints

מחילים אילוצים שמכתיבים את חלוקת הקלט שלהם למקטעים.

הפונקציה מעתיקה את חלוקת המשנה של ShardingConstraintOp לקלט שלה, אם היא עומדת בכל התנאים הבאים:

  • לא קיים חלוקה לפלחים (sharding) של הקלט.
  • חלוקת המשנה של ShardingConstraintOp סגורה לחלוטין.
  • בקלט אין משתמשים אחרים מסוג ShardingConstraintOp או ManualComputationOp עם חלוקה שונה.

התנאים האלה מציינים שה-ShardingConstraintOp קובע את חלוקת הקלט שלו.

אם הקלט נוצר על ידי DataFlowEdgeOp, במקום להגדיר את הפיצול של הפעולה, מחליפים את כל השימושים ב-input ב-ShardingConstraintOp כדי להימנע מהגבלת הפיצול של כל היעדים של הקצה.

חשוב לזכור שהחלוקה לפלחים של ShardingConstraintOp תופץ אל הקלט או המשתמשים שלה במהלך ההעברה, ללא קשר למעבר הזה. עם זאת, מכיוון שהמאפיין הסגור של המאפיין לא מופץ, חשוב להעתיק את החלוקה לפלחים כדי לפעול בהתאם למגבלה במקרים שלמעלה.

בנוסף, אם שרשור של ShardingConstraintOps שמקיימים את כל התנאים הבאים משתמש בטנסור:

  • הטנזור לא נוצר על ידי ShardingConstraintOp ואין לו משתמשים אחרים מסוג ShardingConstraintOp או ManualComputationOp.
  • לאף אחד מה-ShardingConstraintOp ברשת אין יותר משימוש אחד, מלבד ה-ShardingConstraintOp האחרון.
  • ל-ShardingConstraintOp האחרון בשרשרת אין משתמשים מסוג ShardingConstraintOp או ManualComputationOp (אחרת הוא לא האחרון בשרשרת).

אז הכרטיס הזה מחליף את כל שאר השימושים בקלט של השרשרת, שמוגדרים אחרי ShardingConstraintOp האחרון בשרשרת (ובאותו בלוק), בתוצאה של השרשרת, כי היא אמורה לקבוע את חלוקת השטחים (sharding) של השימושים האלה.

-sdy-constant-splitter

פיצול של חישובי משנה קבועים כך שלכל אחד מהם יהיה שימוש יחיד.

פיצול של חישובי משנה קבועים כך שיהיה להם משתמש יחיד.

כך מוודאים שחלוקה לפלחים לא תופץ בין שימושים שונים של חישוב משנה קבוע, כי זה נחשב לקשר תלוי שגוי (לא צריך לפצל את השימושים של קבוע באותו אופן רק בגלל שהם משתמשים באותו קבוע). למעשה, לכל שימוש יכול להיות פיצול שונה שיכול להתפשט בנפרד לעתק משלו של החישוב המשני הקבוע.

חישוב משנה קבוע הוא:

  • אופרטור קבוע או אופרטור iota (ללא אופרנדים)
  • אופרטור של שידור (broadcast), חיתוך (slice) או פעולה טהורה לפי רכיבים, שכל אופרטנדיו מוגדרים על ידי חישובי משנה קבועים (באופן רספונסיבי), יחד עם כל חישובי המשנה שמגדירים את האופרטנדים שלו.

חשוב לזכור שבתוך חישוב משנה קבוע, לאותו ערך יכולים להיות כמה שימושים באותו חישוב משנה.

-sdy-lift-inlined-meshes

הפעולה מעבירה MeshAttrs מוטמעים בחלוקות (shards) כסמלים MeshOp.

הפונקציה מחליפה כל MeshAttr שמוטמע ב-TensorShardingAttr בשם של סמל רשת, שמתייחס ל-MeshOp קיים או חדש במודול, כך שאין לשני MeshOpים MeshAttr זהה (גם MeshOps קיימים מוחקים כפילויות).

השם של כל MeshOp חדש יהיה:

  • maximal_mesh_{device-id}, למערך תלת-ממדי מקסימלי (כלומר, רשימת צירים ריקה ומזהה מכשיר יחיד), או
  • השם הראשון שזמין ברשימה [mesh, mesh_0, mesh_1, ...].

-sdy-manual-axes-cleanup

ניקוי השימוש בצירים ידניים ב-ManualComputationOp

  1. לכל חלוקה פנימית/חיצונית שלא צוינה בה ציר ידני, צריך להוסיף את הציר הידני הזה ל-replicated_axes. כך אפשר לוודא שהצירים הידניים תמיד מצוינים במלואם.
  2. מיון הצירים הידניים לפי סדר ההצהרה על צירי רשת.

-sdy-sharding-group-import

השלבים של יצירת גרסת קנוניקל ואימות עוברים בקבוצות של חלוקה לפלחים.

החלת קנוניזציה ותיקוף על קבוצות של חלוקה לקטעים (sharding) במהלך הייבוא. אלה הם:

  1. איחוד קבוצות של חלוקה לקטעים

    שילוב של קבוצות חלוקה באמצעות המאפיין המעבר של חברות בקבוצה. בכל פעם שמערך T נמצא בקבוצת חלוקה G1 וגם בקבוצת חלוקה G2, אפשר להסיק שצריך לפצל את כל המשתתפים ב-G1 וב-G2 באותו אופן. כך אפשר לשלב את G1 ו-G2 לקבוצה אחת. קבוצת מזהי הקבוצות הקנוניות לאחר המיזוג תהיה 0,1,…N-1 עבור קבוצת הקבוצות המינימלית.

  2. אימות קבוצת חלוקה

    אימות שהקבוצות של חלוקת המשנה (sharding) תקינות ותואמות להנחות בהטמעה. נכון לעכשיו, ההצהרה הזו קובעת שאם קבוצת חלוקה מכילה Value שמוגדר בתוך הבלוק של ManualComputationOp, כל הערכים האחרים בקבוצה הזו חייבים להיות באותו בלוק.