ภาษา VHLO

ภาษาถิ่น VHLO คืออะไร

ภาษา VHLO (Versioned 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 จะมี Ops เวอร์ชันล่าสุดเท่านั้น ในตัวอย่างที่ใช้อยู่ ภาษา StableHLO ที่ v0.11.0 จะมี StableHLO_MyOp ที่มี operand และ attr เท่านั้น ในขณะที่ VHLO จะเก็บข้อมูลแต่ละเฟสของวิวัฒนาการของการดำเนินการ

ทำไม VHLO จึงมีประโยชน์

ภาษาถิ่นที่มีเวอร์ชันจะช่วยให้เรากำหนดเป้าหมายตัวเลือก StableHLO เวอร์ชันก่อนหน้าได้ ซึ่งจะสรุปความเข้ากันได้แบบไปข้างหน้าและย้อนหลังใน Conversion ระหว่างการดำเนินการในภาษา VHLO

การส่งต่อความเข้ากันได้: ความเข้ากันได้แบบส่งต่อมาจากการแปลงเป็น VHLO และดาวน์เกรดการดำเนินการเป็นเวอร์ชันเป้าหมาย หากดาวน์เกรด op/type/attr ทั้งหมดในโปรแกรม VHLO เป็นเวอร์ชันเป้าหมายได้ ก็รับประกันได้ว่าเวอร์ชันดังกล่าวเป็น "ถอดรหัส" และแปลงเป็น StableHLO ได้ในผู้บริโภคที่ใช้เวอร์ชันมากกว่าหรือเท่ากับเวอร์ชันเป้าหมาย เนื่องจาก VHLO มีสแนปชอตของเวอร์ชันนั้นในช่วงเวลานั้น

ส่งต่อรูปภาพความเข้ากันได้

การแปลงการดาวน์เกรดนี้จะล้มเหลวหากใช้การดำเนินการหรือฟีเจอร์ที่ไม่มีอยู่ในเวอร์ชันก่อนหน้านี้ของเวอร์ชัน ซึ่งหมายความว่าระบบจะพบความเข้ากันได้ของการส่งต่อ ในผู้ผลิต ไม่ใช่ที่รันไทม์

ความเข้ากันได้แบบย้อนหลัง: ความเข้ากันได้แบบย้อนหลังจะได้ด้วยการอัปเกรดปฏิบัติการ VHLO เป็นเวอร์ชันล่าสุด (หากจำเป็น) จากนั้นจึงแปลงการทดสอบกลับไปเป็น SttableHLO โปรแกรม VHLO ทั้งหมดภายในกรอบเวลาความเข้ากันได้จะอัปเกรดเป็น StableHLO ได้ ซึ่งหมายความว่าผู้บริโภคแต่ละเวอร์ชันสามารถดีซีเรียลไลซ์เพย์โหลด VHLO เดียวกันจากเวอร์ชันก่อนหน้าได้

รูปภาพความเข้ากันได้แบบย้อนหลัง

ที่สำคัญกว่านั้นคือ VHLO มีกระบวนการที่ทำให้เป็นอนุกรม ซึ่งหมายความว่าเฟรมเวิร์ก ML (ผู้ผลิต) ต้องกำหนดเป้าหมายการดำเนินการของ StableHLO เท่านั้น และแบ็กเอนด์ของคอมไพเลอร์ (ผู้บริโภค) จะต้องรองรับเวอร์ชันล่าสุดซึ่งเป็นชุด op ของ StableHLO เท่านั้น Conversion ไปและกลับจาก VHLO ได้รับการจัดการโดยใช้เครื่องจักรที่เก็บรักษาไว้ในที่เก็บของ StableHLO

เวอร์ชันรูปแบบไบต์โค้ดของ MLIR

เวอร์ชัน StableHLO จะมีเวอร์ชัน MLIR Bytecode Format ที่เชื่อมโยงเพื่อรักษาความเข้ากันได้ในอนาคต นอกจากนี้ StableHLO เวอร์ชันล่าสุดจะใช้รูปแบบ MLIR Bytecode เวอร์ชันล่าสุดด้วย เมื่อมีการเพิ่มเวอร์ชันรูปแบบ MLIR Bytecode Format เวอร์ชันถัดไปของ StableHLO จะเพิ่มเวอร์ชันย่อยและอัปเดต Version.cpp เพื่อใช้เวอร์ชันล่าสุดของรูปแบบ MLIR Bytecode

ดูรายละเอียดเกี่ยวกับรูปแบบ MLIR Bytecode และเหตุผลในการใช้ใน StableHLO ได้ที่ bytecode.md

การเปลี่ยนแปลงที่ใช้งานร่วมกันไม่ได้

การเปลี่ยนแปลงทั้งหมดที่เกี่ยวข้องกับความเข้ากันได้จะต้องผ่านกระบวนการ RFC ซึ่งรวมถึงการเพิ่ม การเลิกใช้งาน หรือการเปลี่ยนชื่อฟีเจอร์ เมื่อ RFC ได้รับการอนุมัติแล้ว หลักเกณฑ์การสนับสนุนบางประการมีดังนี้

หากต้องการเพิ่มหมายเลขเวอร์ชันใน Version.h

ก่อนที่จะอัปเดตการดำเนินการ แอตทริบิวต์ ประเภท หรือ Conversion ของ VHLO ให้เพิ่มหมายเลขเวอร์ชันย่อยใน Version.h ฟีเจอร์ใหม่ของ VHLO ที่เพิ่มเข้ามาจะใช้เวอร์ชันที่ซ้อนทับนี้ เช่น หลังจากการชน 0.10.0 --> 0.11.0 การดำเนินการใหม่ใน VhloOps.td จะใช้

VHLO_Op<"abs_v2", "0.11.0", "current">

เพิ่มการใช้งานและ Conversion ของ VHLO ที่จําเป็น

โค้ดที่ต้องใช้ในการผสานรวมฟีเจอร์ใหม่จะแตกต่างกันไป แต่ส่วนใหญ่แล้วจะต้องเปลี่ยนดังนี้

  • การเปลี่ยนแปลงทั้งหมดจะมีผลดังนี้
    • อัปเดตบันทึกเวอร์ชันใน VhloDialect.td
  • สำหรับการดำเนินการใหม่
  • สำหรับเวอร์ชันใหม่ของการดำเนินการที่มีอยู่ ให้ทำดังนี้
    • เพิ่มการดำเนินการใน VhloOps.td
    • อัปเดต StableHLO เป็นการแมป VHLO ใน MapStablehloToVhlo.h
    • เพิ่ม Conversion ระหว่างเวอร์ชันใหม่และเวอร์ชันเดิมใน VhloToVersion.cpp
  • สำหรับประเภทหรือแอตทริบิวต์ใหม่ ให้ทำดังนี้

ตัวอย่างล่าสุดของการส่งที่เกี่ยวข้องกับความเข้ากันได้ ได้แก่ การเพิ่ม FP8 2 ประเภท รวมถึงการใช้งานใน VHLO ใน #1379

เพิ่ม / อัปเดตการทดสอบหน่วย

ผู้จัดทำการเปลี่ยนแปลงที่ใช้ร่วมกันไม่ได้จะต้องรับผิดชอบต่อทั้งการทดสอบหน่วยบวกและผลลบของฟีเจอร์ รวมถึงการทดสอบหน่วยความเข้ากันได้

การทดสอบหน่วยความเข้ากันได้ประกอบด้วยการอัปเดต stablehlo_legalize_to_vhlo.mlir เพื่อให้ StableHLO ส่งไปกลับกับ VHLO เวอร์ชันล่าสุด รวมถึงต้องทำการทดสอบความเข้ากันได้แบบไปข้างหน้าหรือย้อนกลับเพิ่มเติม

ตัวอย่างเช่น

เพิ่มการทดสอบการทำให้เป็นอนุกรมที่มีเวอร์ชัน

หลังจากเพิ่มจุดทดสอบไปยัง stablehlo_legalize_to_vhlo.mlir แล้ว ให้สร้างสำเนาเวอร์ชันของไฟล์ชื่อ stablehlo_legalize_to_vhlo.0_X_0.mlir ดังนี้ พร้อมกับเวอร์ชันไบต์โค้ดของไฟล์นั้นที่มีส่วนขยาย .0_X_0.mlir.bc เพิ่มบรรทัด FileCheck ที่ถูกต้อง สำหรับการทดสอบความเข้ากันได้แบบไปข้างหน้าและย้อนหลัง

$ export TARGET_VERSION=0.X.0
$ export TARGET_FILENAME=${TARGET_VERSION//./_}
$ cp stablehlo/tests/stablehlo_legalize_to_vhlo.mlir stablehlo/tests/stablehlo_legalize_to_vhlo.$TARGET_FILENAME.mlir
$ build/bin/stablehlo-translate --serialize --target=$TARGET_VERSION --strip-debuginfo stablehlo/tests/stablehlo_legalize_to_vhlo.$TARGET_FILENAME.mlir > stablehlo/tests/stablehlo_legalize_to_vhlo.$TARGET_FILENAME.mlir.bc

# Replace RUN commands in stablehlo/tests/stablehlo_legalize_to_vhlo.0_X_0.mlir with the following for 0.X.0:
// RUN: stablehlo-opt --mlir-print-op-generic %s.bc | FileCheck %s
// RUN: stablehlo-translate --deserialize %s.bc | stablehlo-translate --serialize --target=0.X.0 | stablehlo-opt --mlir-print-op-generic | FileCheck %s
// RUN: diff <(stablehlo-translate --deserialize %s.bc | stablehlo-opt) <(stablehlo-opt --strip-debuginfo %s)
// RUN: diff %s.bc <(stablehlo-translate --serialize --target=0.X.0 --strip-debuginfo %s)

ตัวอย่างการทดสอบที่มีเวอร์ชันใน #1430