‫'mpmd' Dialect

תפעול

mpmd.assign (mpmd::AssignOp)

פעולת הקצאה

תחביר:

operation ::= `mpmd.assign` attr-dict $tensor `:` functional-type(operands, results)

הפונקציה מקצה טנסור מקומי לרשת כטנסור משוכפל באופן מלא בתוך הרשת.

זוהי פעולה זמנית שמוצגת כשמורידים את רמת הפעולות של jax, כדי לעבור מסוגים מקומיים לסוגים של רשת. הפעולות האלה יבוטלו במהלך הייבוא, כשהקלט והתוצאות של פעולת func הופכים לטנסורים של רשת.

שם ה-mesh של סוג התוצאה צריך להתאים ל-mesh בטופולוגיה, והסוג הגלובלי שלו צריך להיות זהה לסוג האופרנד.

המקור של פעולת ההקצאה הוא המקור של הרשת, למשל named_computation,‏ mesh inference וכו'.

מאפיינים: AlwaysSpeculatableImplTrait, ‏ HasParent<::mlir::func::FuncOp, ForOp>

ממשקים: ConditionallySpeculatable, ‏ NoMemoryEffect (MemoryEffectOpInterface)

השפעות: MemoryEffects::Effect{}

מאפיינים:

מאפייןסוג MLIRתיאור
origin::mlir::StringAttrמאפיין מחרוזת

אופרנדים:

אופרנד תיאור
tensor טנזור של ערכים מכל סוג שאינו סוג של טוקן

תוצאות:

תוצאה תיאור
result סוג טנזור של רשת

mpmd.broadcast (mpmd::BroadcastOp)

פעולת שידור

תחביר:

operation ::= `mpmd.broadcast` attr-dict $tensor `:` type($tensor)

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

מאפיינים: AlwaysSpeculatableImplTrait, ‏ SameOperandsAndResultType

ממשקים: ConditionallySpeculatable, InferTypeOpInterface, NoMemoryEffect (MemoryEffectOpInterface)

השפעות: MemoryEffects::Effect{}

אופרנדים:

אופרנד תיאור
tensor טנזור של ערכים מכל סוג שאינו סוג של טוקן

תוצאות:

תוצאה תיאור
result טנזור של ערכים מכל סוג שאינו סוג של טוקן

mpmd.call (mpmd::CallOp)

פונקציית התקשרות ספציפית ל-MPMD

תחביר:

operation ::= `mpmd.call` $callee `(` $tensors `)` attr-dict `:` functional-type(operands, results)

פעולה של בקשה להפעלת פונקציה. לדוגמה, אפשר להשתמש בו כדי להקיף את גוף הלולאות בהצהרות של פונקציות כדי להקטין את גודל הקוד.

ממשקים: ArgAndResultAttrsOpInterface, CallOpInterface, SymbolUserOpInterface

מאפיינים:

מאפייןסוג MLIRתיאור
callee::mlir::FlatSymbolRefAttrמאפיין קובץ העזר של סמל שטוח

אופרנדים:

אופרנד תיאור
tensors משתנה ארגומנטים של טנסור עם ערכים מכל סוג שהוא שאינו סוג טוקן, או סוג טנסור של רשת

תוצאות:

תוצאה תיאור
«ללא שם» משתנה ארגומנטים של טנסור עם ערכים מכל סוג שהוא שאינו סוג טוקן, או סוג טנסור של רשת

mpmd.for (mpmd::ForOp)

למפעילים

הפונקציה מחזירה את התוצאה של הפעלת פונקציית גוף למספר קבוע של איטרציות, כאשר אינדקס האיטרציה זמין בגוף.

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

אופרטור for יכול לקבל ולהחזיר כל סוג, אבל ה-TypeID של הסוגים האלה חייב להיות זהה – למשל, כל סוגי הטנסור או כל סוגי ה-MPMD mesh וכו'. כך אפשר להשתמש באופרטור ברמות שונות, ולשתף את ההטמעה והטרנספורמציות.

מאפיינים: HLO_PairwiseSameOperandAndResultType, ‏ RecursiveMemoryEffects, ‏ RecursivelySpeculatableImplTrait, ‏ SingleBlockImplicitTerminator<ReturnOp>, ‏ SingleBlock

ממשקי API: ConditionallySpeculatable, LoopLikeOpInterface, OpAsmOpInterface, ShardableDataFlowOpInterface

מאפיינים:

מאפייןסוג MLIRתיאור
iterations::mlir::IntegerAttrמאפיין של מספר שלם לא מסומן ב-32 ביט
unroll_factor::mlir::IntegerAttrמאפיין של מספר שלם לא מסומן ב-32 ביט

אופרנדים:

אופרנד תיאור
tensors משתנה באורך משתנה מכל סוג שאינו טוקן

תוצאות:

תוצאה תיאור
results משתנה באורך משתנה מכל סוג שאינו טוקן

mpmd.fragment (mpmd::FragmentOp)

פעולת קטע

הפונקציה מקצה חישוב, כלומר בלוק של פעולות, לרשת ספציפית בטופולוגיית MPMD, שמיועדת להרצה כקטע תוכנית SPMD נפרד.

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

שם הרשת של הפריט צריך להיות זהה לשם של רשת בטופולוגיה.

הפרגמנט כולל רשימה של מקורות, כלומר מטא-נתונים עם מידע על חישובים מקוריים בשם named_computations שיצרו את הפרגמנט הזה, ו-staged_id שמוגדר iff אם זה פרגמנט שהוגדר על ידי משתמש, כלומר יש לו רשימה לא ריקה של מקורות. הפרמטר האופציונלי in_shardings מציין את הפיצול של ארגומנטים של בלוקים של פרגמנט, שתואמים לאופרנדים. הפרמטר האופציונלי out_shardings מציין את החלוקה של התוצאות.

באזור של הפרגמנט לא יכולים להיות משתנים חופשיים, והסוג של כל ארגומנט של בלוק ושל ערכים מוחזרים באזור הוא סוג הטנזור הגלובלי של טנזור הרשת התואם.

מאפיינים: HasParent<::mlir::func::FuncOp, ForOp>, IsolatedFromAbove, RecursiveMemoryEffects, RecursivelySpeculatableImplTrait, SingleBlockImplicitTerminator<ReturnOp>, SingleBlock

ממשקים: ConditionallySpeculatable, ‏ ShardableDataFlowOpInterface

מאפיינים:

מאפייןסוג MLIRתיאור
origin::mlir::ArrayAttrמערך של פרטי מקור
mesh_name::mlir::StringAttrמאפיין מחרוזת
stage_id::mlir::IntegerAttrמאפיין של מספר שלם לא מסומן ב-64 ביט
in_shardings::mlir::sdy::TensorShardingPerValueAttrחלוקת טנסורים לפי אופרנד/תוצאה של פעולה
out_shardings::mlir::sdy::TensorShardingPerValueAttrחלוקת טנסורים לפי אופרנד/תוצאה של פעולה

אופרנדים:

אופרנד תיאור
inputs משתנה של סוג טנסור של רשת או אסימון

תוצאות:

תוצאה תיאור
results משתנה של סוג טנסור של רשת או אסימון

mpmd.fragment_call (mpmd::FragmentCallOp)

פעולת קריאה של קטע

מייצג קריאה לפונקציה שמכילה גוף של מקטע MPMD, כלומר חישוב שמוקצה לרשת ספציפית בטופולוגיה של MPMD, שמיועד לביצוע כמקטע תוכנית SPMD נפרד.

שם הרשת של הפרגמנט צריך להתאים לרשת בטופולוגיה של הפונקציה המקיפה, וצורת הרשת הזו צריכה להיות זהה לזו של הפונקציה שנקראת.

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

סוגי הקלט והתוצאה של הפונקציה שנקראת צריכים להיות סוגי הטנסור המקומיים של הטנסורים התואמים ברשת של האופרנדים והתוצאות של הפעולה הזו, בהתאמה.

דוגמה:

%2 = mpmd.fragment_call<mesh="m1",> origin=[] @my_fragment(%0, %1) :
  (m<esh>_tensor..., m<esh>_te>nsor...) - m<esh>_tensor...

מאפיינים: HasParent<::mlir::func::FuncOp>, ‏ MemRefsNormalizable

ממשקים: ArgAndResultAttrsOpInterface, CallOpInterface, SymbolUserOpInterface

מאפיינים:

מאפייןסוג MLIRתיאור
origin::mlir::ArrayAttrמערך של פרטי מקור
mesh_name::mlir::StringAttrמאפיין מחרוזת
callee::mlir::FlatSymbolRefAttrמאפיין קובץ העזר של סמל שטוח

אופרנדים:

אופרנד תיאור
tensors variadic of mesh tensor type

תוצאות:

תוצאה תיאור
«ללא שם» variadic of mesh tensor type

mpmd.named_computation (mpmd::NamedComputationOp)

פעולה בהיקף בעל שם

מקבץ חישוב, כלומר בלוק של פעולות, ונותן לו שם ומספר טרנספוזיציות באמצעות המאפיין UserOrigin. אפשר להשתמש ב-NamedComputation כדי להקצות רשת לחישוב ב-MPMD או לאופטימיזציות.

המספר של פעולות הטרנספוזיציה (ברירת מחדל=0) מציין אם החישוב שצוין נוצר על ידי מספר מסוים של טרנספורמציות של טרנספוזיציה של JAX AD.

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

מאפיינים: IsolatedFromAbove, ‏ RecursiveMemoryEffects, ‏ RecursivelySpeculatableImplTrait, ‏ SingleBlockImplicitTerminator<ReturnOp>, ‏ SingleBlock

ממשקים: ConditionallySpeculatable

מאפיינים:

מאפייןסוג MLIRתיאור
origin::mlir::mpmd::UserOriginAttrהמקור של החישוב שצוין על ידי המשתמש.

אופרנדים:

אופרנד תיאור
tensors ארגומנטים משתנים של טנזור מדורג של מספרים ממשיים או בוליאניים בגודל 4/6/8/16/32/64 ביט, או מספרים שלמים בגודל 2/4/8/16/32/64 ביט, או מספרים מרוכבים עם רכיבים ממשיים בגודל 32/64 ביט, או ערכים שלמים שעברו קוונטיזציה ברמת הטנזור, או טוקן

תוצאות:

תוצאה תיאור
results ארגומנטים משתנים של טנזור מדורג מסוג float או bool או מספר שלם או מרוכב עם רכיבי float או ערכים שלמים שעברו קוונטיזציה או טוקן, בגודל 4/6/8/16/32/64 ביט

mpmd.named_tensor (mpmd::NamedTensorOp)

הקצאת טנסור לרשת

תחביר:

operation ::= `mpmd.named_tensor` $tensor `name````=```$name attr-dict `:` type($result)

פעולת זהות שמשייכת את התוצאה של הטנזור לשם נתון. אפשר להשתמש ב-NamedTensor הזה כדי להקצות רשת לטנזור ב-MPMD.

מאפיינים: AlwaysSpeculatableImplTrait, ‏ SameOperandsAndResultType

ממשקים: ConditionallySpeculatable, InferTypeOpInterface, NoMemoryEffect (MemoryEffectOpInterface)

השפעות: MemoryEffects::Effect{}

מאפיינים:

מאפייןסוג MLIRתיאור
name::mlir::StringAttrמאפיין מחרוזת

אופרנדים:

אופרנד תיאור
tensor טנזור של ערכים מכל סוג שאינו סוג של טוקן

תוצאות:

תוצאה תיאור
result טנזור של ערכים מכל סוג שאינו סוג של טוקן

mpmd.reduce (mpmd::ReduceOp)

פעולת צמצום בין רשתות

תחביר:

operation ::= `mpmd.reduce` `` $reduction attr-dict $tensors `:` functional-type(operands, results)

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

מאפיינים: AlwaysSpeculatableImplTrait, ‏ SameOperandsAndResultType

ממשקים: ConditionallySpeculatable, ‏ NoMemoryEffect (MemoryEffectOpInterface)

השפעות: MemoryEffects::Effect{}

מאפיינים:

מאפייןסוג MLIRתיאור
reduction::mlir::mpmd::ReductionAttrמציין ירידה.

אופרנדים:

אופרנד תיאור
tensors variadic of tensor of any non-token type values

תוצאות:

תוצאה תיאור
result טנזור של ערכים מכל סוג שאינו סוג של טוקן

mpmd.return (mpmd::ReturnOp)

הפעולה mpmd.return מסיימת את האזורים שמצורפים לפעולות מבוססות אזור של mpmd. היא מקבלת מספר משתנה של ארגומנטים: רשימה של ערכים שהסוגים שלהם יכולים להיות כל סוג (אבל מאותו סוג, למשל AnyTensor) ולכן אפשר לעשות בה שימוש חוזר ברמות שונות של מחסנית ה-IR של MPMD.

תחביר:

operation ::= `mpmd.return` attr-dict $results (`:` type($results)^)?

מאפיינים: AlwaysSpeculatableImplTrait, ‏ Terminator

ממשקים: ConditionallySpeculatable, ‏ NoMemoryEffect (MemoryEffectOpInterface)

השפעות: MemoryEffects::Effect{}

אופרנדים:

אופרנד תיאור
results משתנה באורך משתנה מכל סוג שאינו טוקן

mpmd.transfer (mpmd::TransferOp)

פעולת העברה

תחביר:

operation ::= `mpmd.transfer` attr-dict $tensor `:` functional-type(operands, results)

העברה של טנסור מבוזר מרשת אחת לרשת אחרת.

השמות של ה-mesh של האופרנד וסוגי התוצאות צריכים להתאים ל-mesh בטופולוגיה, והסוגים הגלובליים שלהם צריכים להיות זהים.

מאפיינים: AlwaysSpeculatableImplTrait, ‏ HasParent<::mlir::func::FuncOp>

ממשקים: ConditionallySpeculatable, NoMemoryEffect (MemoryEffectOpInterface), ShardingRuleOpInterface

השפעות: MemoryEffects::Effect{}

אופרנדים:

אופרנד תיאור
tensor סוג טנזור של רשת

תוצאות:

תוצאה תיאור
result סוג טנזור של רשת

mpmd.unassign (mpmd::UnassignOp)

פעולת ביטול ההקצאה

תחביר:

operation ::= `mpmd.unassign` attr-dict $tensor `:` functional-type(operands, results)

הפונקציה מבטלת את ההקצאה של טנסור משוכפל באופן מלא מרשת.

זוהי פעולה זמנית שמוצגת כשמורידים את רמת הפעולות של jax, כדי לעבור מסוגים מקומיים לסוגים של רשת. הפעולות האלה יבוטלו במהלך הייבוא, כשהקלט והתוצאות של פעולת func הופכים לטנסורים של רשת.

שם הרשת של סוג האופרנד צריך להתאים לרשת בטופולוגיה, והסוג הגלובלי שלו צריך להיות זהה לסוג התוצאה.

מאפיינים: AlwaysSpeculatableImplTrait, ‏ HasParent<::mlir::func::FuncOp, ForOp>, ‏ InferTensorType

ממשקי API: ConditionallySpeculatable, InferShapedTypeOpInterface, InferTypeOpInterface, NoMemoryEffect (MemoryEffectOpInterface)

השפעות: MemoryEffects::Effect{}

מאפיינים:

מאפייןסוג MLIRתיאור
origin::mlir::StringAttrמאפיין מחרוזת

אופרנדים:

אופרנד תיאור
tensor סוג טנזור של רשת

תוצאות:

תוצאה תיאור
result טנזור של ערכים מכל סוג שאינו סוג של טוקן

מאפיינים

MeshWithOriginsAttr

התאימו את התוכן למקורות שלו.

תחביר:

#mpmd.mesh_with_origins<
  ::llvm::StringRef,   # mesh_name
  ::llvm::ArrayRef<OriginAttr>   # origins
>

פרמטרים:

פרמטר סוג C++‎ תיאור
mesh_name ::llvm::StringRef mesh_name
origins ::llvm::ArrayRef<OriginAttr> origins

MeshesWithOriginsAttr

רשימה של רשתות עם המקורות שלהן.

תחביר:

#mpmd.meshes_with_origins<
  ::llvm::ArrayRef<MeshWithOriginsAttr>   # value
>

פרמטרים:

פרמטר סוג C++‎ תיאור
ערך ::llvm::ArrayRef<MeshWithOriginsAttr>

NamedMeshAttr

זוג עם שם ורשת.

תחביר:

#mpmd.named_mesh<
  ::llvm::StringRef,   # name
  sdy::MeshAttr   # mesh
>

פרמטרים:

פרמטר סוג C++‎ תיאור
שם ::llvm::StringRef שם
רשת sdy::MeshAttr רשת

OriginAttr

מקור הקצאת הרשת.

תחביר:

#mpmd.origin<
  ::llvm::StringRef   # origin_label
>

המקור של הקצאת רשת.

origin_label היא תווית קריאה (לבני אדם) למקור. הוא מיועד לשימוש לצורך ניפוי באגים.

פרמטרים:

פרמטר סוג C++‎ תיאור
origin_label ::llvm::StringRef origin_label

ReductionAttr

מציין ירידה.

תחביר:

#mpmd.reduction<
  `none` | `add` | `max` | `min` | `mul` | `or` | `and`   # reduction_type
>

פרמטרים:

פרמטר סוג C++‎ תיאור
reduction_type ::mlir::mpmd::ReductionType enum מסוג ReductionType

TopologyAttr

טופולוגיה של רשתות עם שמות.

תחביר:

#mpmd.topology<
  ::llvm::ArrayRef<NamedMeshAttr>   # meshes
>

פרמטרים:

פרמטר סוג C++‎ תיאור
רשתות ::llvm::ArrayRef<NamedMeshAttr> רשתות טופולוגיות

UserOriginAttr

מקור החישוב שצוין על ידי המשתמש.

תחביר:

#mpmd.user_origin<
  ::mlir::StringAttr,   # userName
  int64_t   # transposeCount
>

פרמטרים:

פרמטר סוג C++‎ תיאור
userName ::mlir::StringAttr
transposeCount int64_t

סוגים

MeshTensorType

סוג טנסור של רשת

הפונקציה מקצה RankedTensorType לרשת SPMD ספציפית בטופולוגיה של רשתות MPMD בתוכנית. הסוג מכיל חלוקה אופציונלית שקובעת איך הטנזור מחולק ביחס לרשת SPMD. אם ה-sharding לא קיים, הטנזור משוכפל באופן מלא.

פרמטרים:

פרמטר סוג C++‎ תיאור
mesh_name ::llvm::StringRef שם הרשת
ranked_tensor_type ::mlir::RankedTensorType ranked tensor type
פיצול (sharding) ::mlir::sdy::TensorShardingAttr
memory_kind ::mlir::StringAttr

טיפוסים בני מנייה (enum)

ReductionType

מאפיין סוג ההפחתה

מקרים:

סמל ערך מחרוזת
kNone 0 אין
kAdd 1 הוספה
kMax 2 מקסימלי
kMin 3 דק'
kMul 4 mul
kOr 5 או
kAnd 6 וגם

EdgeNodeType

Edge node type enum

מקרים:

סמל ערך מחרוזת
OPERAND 0 אופרנד
תוצאה 1 תוצאה

PropagationDirection

ספירה (enum) של כיוון ההפצה

מקרים:

סמל ערך מחרוזת
ללא 0 ללא
העברה 1 העברה
אחורה 2 אחורה
BOTH 3 BOTH

ReductionOp

Enum של פעולת צמצום

מקרים:

סמל ערך מחרוזת
SUM 0 סכום
מקסימום 1 מקסימלי
דק‘ 2 דק'