ความเข้ากันได้กับ StableHLO

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)