StableHLO เป็นอุปกรณ์ประมวลผล ML ที่เข้ากันได้แบบย้อนหลัง โดยได้รับแรงบันดาลใจมาจาก HLO/MHLO เอกสารนี้จะอธิบายประเภทและขอบเขตของการรับประกันความเข้ากันได้ที่ StableHLO มีให้ โดยอิงตามกระบวนการที่กำหนดไว้ใน RFC ความเข้ากันได้
ฉบับ
ดูเวอร์ชันปัจจุบันของ StableHLO ได้ใน Version.h
เวอร์ชันย่อยจะขัดข้องทุกครั้งที่มีการเปลี่ยนแปลงของเวอร์ชัน StableHLO หรือรูปแบบการทำให้เป็นอนุกรมของ StableHLO และเวอร์ชันแพตช์จะชนกันทุกครั้งที่เราผสานรวมดาวน์สตรีมของ StableHLO เช่น ในที่เก็บ openxla/xla
การรับประกันความถูกต้อง
ตาม RFC ความเข้ากันได้กับ StableHLO v1.0 หน้าต่างความเข้ากันได้ประกอบด้วยข้อมูลต่อไปนี้
ความเข้ากันได้แบบย้อนหลัง 5 ปี: สิ่งประดิษฐ์แบบพกพาที่ต่อเนื่องโดย libStablehlo เวอร์ชันเก่าจะมีความหมายเดียวกัน* เมื่อดีซีเรียลโดย libStablehlo เวอร์ชันใหม่หากเวอร์ชันเหล่านี้สร้างจาก Openxla/stablehlo ที่คอมมิตห่างกันน้อยกว่า 5 ปี
รองรับการใช้งานได้นาน 2 ปี: อาร์ติแฟกต์แบบพกพาที่ต่อเนื่องกันโดย libStablehlo เวอร์ชันใหม่จะมีความหมายเดียวกัน* เมื่อดีซีเรียลโดย libStablehlo เวอร์ชันเก่าหากเวอร์ชันเหล่านี้สร้างขึ้นจากคำสั่ง openxla/stablehlo ซึ่งห่างกันน้อยกว่า 2 ปี เว้นแต่โปรแกรมนั้นจะใช้ฟีเจอร์ใหม่ที่แนะนำมาตั้งแต่เวอร์ชันเก่า
* โปรแกรม StableHLO จะแปลงเป็น/จากอาร์ติแฟกต์แบบพกพาผ่าน API ความเข้ากันได้ และความหมายของโปรแกรมเหล่านี้จะกำหนดโดยข้อกำหนด StableHLO โปรดดูส่วน "ไม่อยู่ในขอบเขต" เพื่อดูตัวอย่างสิ่งที่คำจำกัดความของความเข้ากันได้นี้ไม่ครอบคลุม
API
คุณสร้างอาร์ติแฟกต์แบบพกพาได้โดยใช้เครื่องมือ stablehlo-translate
หรือสร้างใน C++ หรือ Python API โดยตรง การเรียงอันดับต้องใช้ StableHLO เวอร์ชันเป้าหมายของเพื่อเขียนอาร์ติแฟกต์ที่เขียนในรูปแบบ #.#.#
(ดูเวอร์ชันปัจจุบันใน Version.h) เนื่องจากเวอร์ชันแพตช์ไม่ส่งผลต่อความเข้ากันได้ เป้าหมายที่มีเวอร์ชันแพตช์ที่ไม่ใช่ 0 จะมีค่าเริ่มต้นเป็น 0 ระหว่างการเรียงลำดับ
การแปลงข้อมูลเป็นอนุกรมใช้ StableHLO เวอร์ชันปัจจุบันเพื่ออ่านอาร์ติแฟกต์
stablehlo-translate
วิธีนี้เป็นวิธีที่ง่ายที่สุดในการสร้างและอ่านอาร์ติแฟกต์แบบพกพา
# Write a StableHLO program to a portable artifact
$ stablehlo-translate --serialize file.mlir --target=0.9.0 > portable_artifact.mlir.bc
# Read StableHLO portable artifact
$ stablehlo-translate --deserialize portable_artifact.mlir.bc
C++
สำหรับเวิร์กโฟลว์แบบเป็นโปรแกรม StableHLO มี API ความเข้ากันได้ดังต่อไปนี้
// From: #include "stablehlo/api/PortableApi.h"
// Get the current StableHLO version.
//
// This value can be used as the `targetVersion` argument to
// `serializePortableArtifact`.
std::string getCurrentVersion();
// Get the minimum supported StableHLO version.
//
// This value can be used as the `targetVersion` argument to
// `serializePortableArtifact`.
std::string getMinimumVersion();
// From: #include "stablehlo/dialect/Serialization.h"
// Write a StableHLO program to a portable artifact
// Writes a stable payload for `module` to `os`. If compatibility with a
// previous version of StableHLO is required, provide the required version
// string `#.#.#` for `targetVersion`.
//
// Can fail if `module` cannot be expressed in the `targetVersion` version of
// StableHLO, e.g. if it's using new or removed features, or if it involves
// unsupported dialects.
LogicalResult serializePortableArtifact(ModuleOp module,
StringRef targetVersion,
raw_ostream& os);
// Read StableHLO portable artifact
//
// Can fail if `sourceStr` cannot be expressed in the current version of
// StableHLO, e.g. if it's using incompatible features. Returns nullptr if
// `sourceStr` is invalid or fails to deserialize.
OwningOpRef<ModuleOp> deserializePortableArtifact(StringRef sourceStr,
MLIRContext* context);
โปรดดู API เต็มรูปแบบใน stablehlo/api/PortableApi.h
และ stablehlo/dialect/Serialization.h
ดูตัวอย่างการใช้งาน API เหล่านี้ใน StablehloTranslateMain.cpp
Python
StableHLO ยังมีการเชื่อมโยง Python กับ API ความเข้ากันได้ของ C++ ด้วย ดังนี้
def get_current_version() -> str: ...
def get_minimum_version() -> str: ...
def serialize_portable_artifact(module: ir.Module, target_version: str) -> bytes: ...
def serialize_portable_artifact(module: str, target_version: str) -> bytes: ...
def deserialize_portable_artifact(context: ir.Context, artifact: bytes) -> ir.Module: ...
def deserialize_portable_artifact(artifact: bytes) -> str: ...
โปรดดู StablehloModule.cpp
สำหรับ Python API เต็มรูปแบบ
ดูตัวอย่างการใช้ Python Serialization API แบบไปกลับที่ stablehlo.py > test_serialization_apis
การทดสอบ
เรามีชุดโปรแกรมความเข้ากันได้ใน stablehlo/tests/vhlo ซึ่งเกี่ยวข้องกับบทสรุปที่ครอบคลุมของ Ops ของ StableHLO ที่ทำการอนุกรมสำหรับเวอร์ชัน StableHLO ทั้งหมดที่รองรับ สำหรับพุลคำขอทั้งหมด เรากำลังทดสอบความเข้ากันได้ทั้งแบบย้อนหลังและไปข้างหน้า นั่นคือ ชุดนี้สามารถดีซีเรียลการกำหนดเป้าหมาย HEAD (ความเข้ากันได้แบบย้อนหลัง) ซึ่งบทสรุปสามารถกำหนดเป้าหมายเป็นอนุกรมสำหรับเวอร์ชัน StableHLO ที่รองรับทั้งหมด (ความเข้ากันได้ในอนาคต) และผลลัพธ์จะเหมือนกับโปรแกรม StableHLO เดิมทุกประการ
งานในอนาคต
สร้างชุดโปรแกรมความเข้ากันได้ต้นทางของ MLIR: วางแผนสร้างชุดโปรแกรมความเข้ากันได้กับอัปสตรีมของ MLIR เพื่อตรวจจับข้อบกพร่องของความเข้ากันได้โดยไม่ตั้งใจในโครงสร้างพื้นฐานของไบต์โค้ด MLIR โดยใช้ความรู้ที่ได้จากการสร้างและการรักษาการรับประกันของ StableHLO (#1632)
ใช้การใช้งานข้อมูลอ้างอิง: ขณะนี้การทดสอบความเข้ากันได้ประกอบด้วยการดีซีเรียลชุดความเข้ากันได้ที่อนุกรมโดย libStablehlo เวอร์ชันเก่า และตรวจสอบว่าการดีซีเรียลไลซ์จะทำให้ได้โปรแกรมที่เหมือนกันทุกประการ เรายังวางแผนที่จะใช้ข้อมูลอ้างอิงในการทดสอบเหล่านี้ด้วย เพื่อผ่อนปรนข้อกำหนดที่มากเกินไปเกี่ยวกับอัตลักษณ์ทางไวยากรณ์ และทดสอบการใช้ข้อมูลอ้างอิงอย่างครอบคลุม (#1245)
ไม่อยู่ในขอบเขตงาน
อาร์ติแฟกต์ที่ไม่ใช่แบบพกพา: การรับประกันความเข้ากันได้จะมีให้สำหรับอาร์ติแฟกต์แบบพกพาที่สร้างขึ้นด้วยวิธีที่เฉพาะเจาะจงมากเท่านั้น ส่วนอาร์ติแฟกต์ประเภทอื่นๆ เช่น การจำลองภาษาถิ่น StableHLO หรือแม้แต่การแสดงไบต์โค้ดภาษา StableHLO ก็ไม่มีการรับประกันความเข้ากันได้
ฟีเจอร์ที่ไม่ตรงตามข้อกำหนด: เราอาจทำการเปลี่ยนแปลงที่ใช้ร่วมกันกับฟีเจอร์ซึ่งโปรแกรม StableHLO เคยรองรับก่อนหน้านี้ แต่ยังไม่ได้เป็นส่วนหนึ่งของข้อกำหนดของ StableHLO เช่น เราไม่มีการรับประกันความเข้ากันได้สำหรับแอตทริบิวต์ที่ไม่ได้ลงทะเบียน
ความเข้ากันได้ของข้อบกพร่อง: เราอาจทำการเปลี่ยนแปลงที่เข้ากันไม่ได้หากการติดตั้งใช้งานใน libStablehlo ไม่เป็นไปตามข้อกำหนดของ StableHLO เช่น หากคำจำกัดความในภาษา VHLO ไม่ถูกต้อง หรือหากเครื่องมือยืนยันในภาษาของ StableHLO ไม่ตรงกับข้อกำหนด
ความแม่นยำเชิงตัวเลข: StableHLO มีระบบการทำงานหลายอย่างที่มีความแม่นยำตามการใช้งานจริงสำหรับผู้บริโภค รวมถึงภายในผู้บริโภครายเดียวกันในเวอร์ชันต่างๆ ด้วยเหตุนี้ StableHLO จึงไม่มีเป้าหมายที่จะรับประกันความถูกต้องของตัวเลข แต่อาจมีการเปลี่ยนแปลงในอนาคต (#1156)
ความเข้ากันได้ของแหล่งที่มาสำหรับ C, C++ และ Python API ภายใน libStablehlo คือเป้าหมายที่เราปรารถนา ในขณะนี้เราไม่มีการรับประกันความเข้ากันได้กับแหล่งข้อมูล แต่โปรดแจ้งให้เราทราบหากกรณีการใช้งานนี้เป็นไปให้คุณที่สำคัญ เพื่อที่เราจะได้หารือเกี่ยวกับการรองรับการใช้งานดังกล่าว (#1247)