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

StableHLO เป็น Opset สำหรับการประมวลผล ML ที่เข้ากันได้แบบย้อนหลัง ซึ่งได้แรงบันดาลใจมาจาก HLO/MHLO เอกสารนี้จะอธิบายถึงประเภทและขอบเขตการรับประกันความเข้ากันได้ที่ StableHLO มีให้ โดยอิงตามกระบวนการที่ระบุไว้ใน RFC ความเข้ากันได้

ฉบับ

ดูเวอร์ชันปัจจุบันของ StableHLO ได้ใน Version.h

ในซีรีส์ 0.x.x เวอร์ชันย่อยจะสั่นทุกครั้งที่มีการเปลี่ยนแปลงกับเวอร์ชัน StableHLO หรือรูปแบบการทำให้เป็นอนุกรมของ StableHLO และเวอร์ชันแพตช์จะเกิดขึ้นทุกครั้งที่เราผสานรวมดาวน์สตรีมของ StableHLO นั่นคือ ในที่เก็บ openxla/xla

การรับประกันความถูกต้อง

ความเข้ากันได้แบบย้อนหลังเป็นเวลา 6 เดือน: อาร์ติแฟกต์แบบพกพาที่ต่อด้วย libStablehlo เวอร์ชันเก่ามีความหมายเดียวกัน* เมื่อดีซีเรียลโดย libStablehlo เวอร์ชันใหม่หากเวอร์ชันเหล่านี้สร้างจาก openxla/stablehlo ซึ่งห่างกันน้อยกว่า 6 เดือน

ความเข้ากันได้ในอนาคต 1 เดือน: อาร์ติแฟกต์แบบพกพาที่ทำให้เป็นซีรีส์ของ libStablehlo เวอร์ชันใหม่มีความหมายเดียวกัน* เมื่อดีซีเรียลโดย libStablehlo เวอร์ชันเก่า หากเวอร์ชันเหล่านี้สร้างจาก openxla/stablehlo ซึ่งห่างกันน้อยกว่า 1 เดือน เว้นแต่โปรแกรมจะใช้ฟีเจอร์ใหม่ๆ ตั้งแต่เวอร์ชันเก่า

* โปรแกรม StableHLO จะแปลงเป็น/จากอาร์ติแฟกต์แบบพกพาผ่าน API ความเข้ากันได้ และความหมายของโปรแกรมเหล่านี้กำหนดโดยข้อกำหนด StableHLO โปรดดูส่วน "ไม่อยู่ในขอบเขต" เพื่อดูตัวอย่างของสิ่งที่ไม่ได้ครอบคลุมตามคำจำกัดความของความเข้ากันได้นี้

API

คุณสร้างอาร์ติแฟกต์แบบพกพาได้โดยใช้เครื่องมือ stablehlo-translate หรือสร้างใน C++ หรือ Python API โดยตรง การทำให้เป็นอนุกรมต้องใช้ StableHLO เวอร์ชันเป้าหมายของเพื่อเขียนอาร์ติแฟกต์ที่เขียนในรูปแบบ #.#.# (ดู Version.h สำหรับเวอร์ชันปัจจุบัน) การแยกส่วนจะใช้ 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 ที่เรียงลำดับสำหรับเวอร์ชัน StableHLO ทั้งหมดที่รองรับ สำหรับการดึงทุกคำขอ เราจะทดสอบความเข้ากันได้แบบย้อนหลังและไปข้างหน้า นั่นคือชุดนี้สามารถทำการดีซีเรียลไลซ์การกำหนดเป้าหมาย HEAD (ความเข้ากันได้แบบย้อนหลัง) ซึ่งบทสรุปสามารถทำให้การกำหนดเป้าหมายแบบต่อเนื่องในเวอร์ชัน StableHLO ที่รองรับทั้งหมดได้ (ความเข้ากันได้แบบย้อนหลัง) และผลลัพธ์จะเหมือนกับโปรแกรม StableHLO เวอร์ชันเดิมอย่างมีไวยากรณ์

งานในอนาคต

สร้างชุดความเข้ากันได้ในอัปสตรีมของ MLIR: เราวางแผนจะใส่ชุดความเข้ากันได้กับอัปสตรีมของ MLIR ด้วยสิ่งที่ได้เรียนรู้จากการสร้างและรักษาการรับประกันของ StableHLO (#1632)

ใช้การใช้งานข้อมูลอ้างอิง: ในขณะนี้ การทดสอบความเข้ากันได้ประกอบด้วยการทำดีซีเรียลชุดโปรแกรมความเข้ากันได้ที่ทำให้เป็นอนุกรมโดย libStablehlo เวอร์ชันเก่า และตรวจสอบว่าการแยกซีเรียลไลซ์นั้นสร้างโปรแกรมที่เหมือนกันทุกประการ เรายังวางแผนที่จะใช้ข้อมูลอ้างอิงในการทดสอบเหล่านี้ด้วย เพื่อผ่อนปรนข้อกำหนดของอัตลักษณ์ทางไวยากรณ์ที่มากเกินไป และทดสอบการใช้ข้อมูลอ้างอิงอย่างครอบคลุม (#1245)

ไม่อยู่ในขอบเขตงาน

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

ฟีเจอร์ที่ไม่ตรงตามข้อกำหนด: เราอาจทำการเปลี่ยนแปลงที่เข้ากันไม่ได้กับฟีเจอร์ซึ่งโปรแกรม StableHLO รองรับก่อนหน้านี้ แต่ยังไม่ได้เป็นส่วนหนึ่งของข้อกำหนดของ StableHLO เช่น เราไม่มีการรับประกันความเข้ากันได้สำหรับแอตทริบิวต์ที่ไม่ได้ลงทะเบียน

ความเข้ากันได้กับข้อบกพร่อง: เราอาจทำการเปลี่ยนแปลงที่เข้ากันไม่ได้หากการติดตั้งใช้งานใน libStablehlo ขัดแย้งกับข้อกำหนดจำเพาะของ StableHLO เช่น กรณีที่คำจำกัดความในภาษา VHLO ไม่ถูกต้อง หรือหากเครื่องมือยืนยันในภาษาของ StableHLO ไม่ตรงกับข้อกำหนด

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

ความเข้ากันได้ของแหล่งที่มาสำหรับ C, C++ และ Python API ภายใน libStablehlo คือเป้าหมายที่เราต้องการ ขณะนี้ เราไม่มีการรับประกันเรื่องความเข้ากันได้ของแหล่งที่มา แต่โปรดแจ้งให้เราทราบหากกรณีการใช้งานนี้เป็นกรณีที่สำคัญสำหรับคุณ และเราจะปรึกษาหารือเกี่ยวกับการรองรับอุปกรณ์ดังกล่าว (#1247)