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