-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
- לכל חלוקה פנימית/חיצונית שלא צוינה בה ציר ידני, צריך להוסיף את הציר הידני הזה ל-replicated_axes. כך אפשר לוודא שהצירים הידניים תמיד מצוינים במלואם.
- מיון הצירים הידניים לפי סדר ההצהרה על צירי רשת.
-sdy-sharding-group-import
השלבים של יצירת גרסת קנוניקל ואימות עוברים בקבוצות של חלוקה לפלחים.
החלת קנוניזציה ותיקוף על קבוצות של חלוקה לקטעים (sharding) במהלך הייבוא. אלה הם:
איחוד קבוצות של חלוקה לקטעים
שילוב של קבוצות חלוקה באמצעות המאפיין המעבר של חברות בקבוצה. בכל פעם שמערך T נמצא בקבוצת חלוקה G1 וגם בקבוצת חלוקה G2, אפשר להסיק שצריך לפצל את כל המשתתפים ב-G1 וב-G2 באותו אופן. כך אפשר לשלב את G1 ו-G2 לקבוצה אחת. קבוצת מזהי הקבוצות הקנוניות לאחר המיזוג תהיה 0,1,…N-1 עבור קבוצת הקבוצות המינימלית.
אימות קבוצת חלוקה
אימות שהקבוצות של חלוקת המשנה (sharding) תקינות ותואמות להנחות בהטמעה. נכון לעכשיו, ההצהרה הזו קובעת שאם קבוצת חלוקה מכילה
Valueשמוגדר בתוך הבלוק שלManualComputationOp, כל הערכים האחרים בקבוצה הזו חייבים להיות באותו בלוק.