ניב VHLO

ב-vhlo_checklist.md אפשר למצוא הנחיות לביצוע ב-VHLO.

מהו ניב VHLO?

הדיאלקט של VHLO (גרסה StableHLO) משמש לעריכה טורית וליציבות. הוא מספק תמונת מצב של הניב StableHLO בנקודת זמן נתונה על ידי לנהל גרסאות של רכיבים בודדים בתוכנית.

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

כל שינוי בתפעול, בסוג או במאפיין מחייב הוספת גרסה חדשה את הניב. לדוגמה, אם my_op היפותטי נוסף ל-StableHLO ב- 0.9.0, אבל השתנה ב-0.11.0, היה לנו את הערך הבא ב-VHLO:

// This represents the StableHLO version of the op from 0.9.0 -> 0.10.0
// Both the lower and the upper bound of versions are inclusive
def VHLO_MyOpV1 : VHLO_Op<"my_op_v1", "0.9.0", "0.10.0"> {
  let arguments = (ins
    VHLO_AnyType:$operand
  );
  let results = (outs VHLO_AnyType:$result);
}

// This represents the StableHLO version of the op from 0.11.0 -> current
def VHLO_MyOpV2 : VHLO_Op<"my_op_v2", "0.11.0", "current"> {
  let arguments = (ins
    VHLO_AnyType:$operand,
    VHLO_AnyAttr:$attr  // New attribute added to StableHLO in 0.11.0
  );
  let results = (outs VHLO_AnyType:$result);
}

לדיאלקט StableHLO יש רק את הגרסה העדכנית ביותר של הפעולות. בריצה לדוגמה, לדיאלקט StableHLO בגרסה v0.11.0 יהיה רק StableHLO_MyOp שכולל את operand ו-attr, בעוד ש-VHLO מתעד כל שלב את האבולוציה.

למה VHLO מועיל?

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

תאימות להעברה: תאימות קדימה מסופקת על ידי המרה ל-VHLO ושדרוג לאחור של פעולות לגרסת יעד. אם כל פעולה/סוג/מאפיין ניתן לשדרג לאחור את תוכנית VHLO לגרסת היעד, ניתן ל-deserialable ולהמרה ל-StableHLO אצל צרכן שמפעיל גרסה שווה לגרסת היעד או שווה לה, מכיוון של-VHLO יש תמונת מצב של באותו זמן.

תמונה של תאימות להעברה

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

תאימות לאחור: תאימות לאחור מסופקת על ידי שדרוג VHLO פועל לגרסה העדכנית ביותר שלו (במקרה הצורך), ולאחר מכן ממיר פעולה חזרה StableHLO. ניתן לשדרג את כל תוכניות VHLO שמוצגות בחלון התאימות ל-StableHLO, כלומר גרסאות שונות של צרכנים יכולות לבצע פעולת deserialize מטען ייעודי (payload) של VHLO מגרסה קודמת.

תמונה של תאימות לאחור

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

גרסאות של פורמט MLIR בייטים

כדי לשמור על תאימות קדימה, לגרסאות StableHLO יש של הגרסה המשויכת של פורמט MLIR בייטקוד. בנוסף, הגרסה העדכנית של StableHLO תשתמש בגרסה העדכנית ביותר של פורמט MLIR Bytecode בפורמט הזה. כאשר גרסת MLIR Bytecode Format עולה, הגרסה הבאה של StableHLO משדרגים את הגרסה המשנית ומעדכנים את Version.cpp כדי להשתמש בגרסה העדכנית ביותר של MLIR Bytecode Format.

לפרטים על הפורמט MLIR Bytecode לפי שימוש בפורמט הזה ב-StableHLO: ראו bytecode.md.