Khả năng tương thích với StableHLO

StableHLO là một opset tính toán ML có khả năng tương thích ngược lấy cảm hứng từ HLO/MHLO. Tài liệu này giải thích loại và mức độ đảm bảo khả năng tương thích mà StableHLO cung cấp, dựa trên quy trình thiết lập trong RFC tương thích.

Phiên bản

Bạn có thể tìm thấy phiên bản StableHLO hiện tại trong Version.h.

Phiên bản nhỏ sẽ được phát hành mỗi khi có thay đổi đối với opset StableHLO hoặc định dạng chuyển đổi tuần tự StableHLO và phiên bản bản vá được tăng lên mỗi khi chúng tôi tích hợp StableHLO ở hạ nguồn, tức là vào kho lưu trữ OpenGLa/xla.

Đảm bảo

Theo RFC tương thích với StableHLO phiên bản 1.0, cửa sổ tương thích bao gồm:

Khả năng tương thích ngược trong 5 năm: Các cấu phần phần mềm di động được chuyển đổi tuần tự bằng một phiên bản libStablehlo cũ có ngữ nghĩa* tương tự khi giải trình tự bằng phiên bản libStablehlo mới nếu các phiên bản này được tạo từ các cam kết openxla/stablehlo cách nhau dưới 5 năm.

Khả năng tương thích chuyển tiếp trong 2 năm: Các cấu phần phần mềm di động được chuyển đổi tuần tự bằng phiên bản libStablehlo mới có cùng ngữ nghĩa* khi giải trình tự bằng phiên bản libStablehlo cũ nếu các phiên bản này được xây dựng từ các cam kết openxla/stablehlo cách nhau chưa đến 2 năm, trừ phi chương trình này sử dụng các tính năng mới được giới thiệu từ phiên bản cũ.

* Các chương trình StableHLO được chuyển đổi sang/từ các cấu phần phần mềm di động thông qua API có khả năng tương thích. và ngữ nghĩa của các chương trình này được xác định theo thông số kỹ thuật của StableHLO. Hãy tham khảo phần "Ngoài phạm vi" để xem các ví dụ về những nội dung không được đề cập trong định nghĩa về khả năng tương thích.

API

Bạn có thể tạo các cấu phần phần mềm di động bằng công cụ stablehlo-translate hoặc trực tiếp trong API C++ hoặc Python. Quá trình chuyển đổi tuần tự cần có một phiên bản mục tiêu của StableHLO để ghi một cấu phần phần mềm được viết ở định dạng #.#.# (Xem Version.h để biết phiên bản hiện tại). Vì các phiên bản bản vá không ảnh hưởng đến khả năng tương thích, nên mọi mục tiêu có phiên bản bản vá khác 0 sẽ mặc định là 0 trong quá trình chuyển đổi tuần tự. Quá trình huỷ chuyển đổi tuần tự sử dụng phiên bản StableHLO hiện tại để đọc cấu phần phần mềm.

stablehlo-translate

Đây là cách dễ nhất để tạo và đọc cấu phần phần mềm di động.

# 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++

Đối với quy trình công việc có lập trình, StableHLO cung cấp các API có khả năng tương thích sau đây:

// 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);

Xem stablehlo/api/PortableApi.hstablehlo/dialect/Serialization.h để biết các API đầy đủ.

Hãy xem StablehloTranslateMain.cpp để biết ví dụ về cách sử dụng các API này.

Python

StableHLO cũng cung cấp các liên kết Python cho các API tương thích 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: ...

Hãy xem StablehloModule.cpp để biết các API Python đầy đủ.

Hãy xem stablehlo.py > test_serialization_apis để biết ví dụ khứ hồi về cách sử dụng API chuyển đổi tuần tự Python.

Kiểm thử

Chúng tôi có một bộ tương thích trong stablehlo/tests/vhlo bao gồm một bản tóm tắt toàn diện các hoạt động StableHLO được chuyển đổi tuần tự cho tất cả các phiên bản StableHLO được hỗ trợ. Đối với mọi yêu cầu kéo (pull request), chúng tôi sẽ kiểm tra cả khả năng tương thích ngược và xuôi – tức là bộ công cụ này có thể được giải trình tự nhắm mục tiêu HEAD (khả năng tương thích ngược), bản tóm tắt có thể được nhắm mục tiêu tuần tự tất cả các phiên bản StableHLO được hỗ trợ (khả năng tương thích chuyển tiếp) và kết quả có cú pháp giống hệt với chương trình StableHLO gốc.

Công việc trong tương lai

Tạo một bộ tương thích trong luồng MLIR ngược dòng: Dựa trên thông tin tìm hiểu được từ việc thiết lập và duy trì các đảm bảo của StableHLO, chúng tôi dự định đóng góp một bộ tương thích cho MLIR ngược dòng để phát hiện sớm các sự cố về khả năng tương thích ngẫu nhiên trong cơ sở hạ tầng mã byte MLIR (#1632).

Sử dụng cách triển khai tệp đối chiếu: Hiện tại, quy trình kiểm thử khả năng tương thích bao gồm việc giải tuần tự bộ tương thích được chuyển đổi tuần tự theo các phiên bản cũ của libStablehlo và đảm bảo rằng quá trình huỷ chuyển đổi tuần tự sẽ tạo ra các chương trình giống hệt nhau về cú pháp. Chúng tôi cũng dự định sử dụng cách triển khai tệp tham chiếu trong các kiểm thử này, nới lỏng yêu cầu quá nghiêm ngặt về nhận dạng cú pháp và kiểm thử toàn diện việc triển khai tham chiếu (#1245).

Ngoài phạm vi

Cấu phần phần mềm không di động được: Bạn chỉ được đảm bảo về khả năng tương thích cho các cấu phần phần mềm di động được tạo một cách rất cụ thể. Các loại cấu phần phần mềm khác, chẳng hạn như bản trình bày đẹp mắt của phương ngữ StableHLO hoặc thậm chí là nội dung biểu diễn mã byte của phương ngữ StableHLO sẽ không được đảm bảo về khả năng tương thích.

Các tính năng chưa được chỉ định: Chúng tôi có thể thực hiện những thay đổi không tương thích với các tính năng từng được hỗ trợ trong các chương trình StableHLO nhưng chưa nằm trong quy cách của StableHLO, ví dụ: chúng tôi không đảm bảo về khả năng tương thích cho các thuộc tính chưa đăng ký.

Khả năng tương thích với lỗi: Chúng tôi có thể thực hiện các thay đổi không tương thích nếu phương thức triển khai trong libStablehlo mâu thuẫn với thông số kỹ thuật của StableHLO, chẳng hạn như nếu định nghĩa trong phương ngữ VHLO không chính xác hoặc nếu trình xác minh trong phương ngữ StableHLO không khớp với thông số kỹ thuật.

Độ chính xác số học: StableHLO có nhiều hoạt động có độ chính xác do phương thức triển khai xác định đối với người tiêu dùng và thậm chí trong cùng một đối tượng tiêu dùng trên các phiên bản. Do đó, StableHLO không nhằm mục đích đảm bảo về độ chính xác về số liệu, mặc dù điều này có thể thay đổi trong tương lai (#1156).

Khả năng tương thích nguồn cho API C, C++ và Python trong libStablehlo là một mục tiêu kỳ vọng. Hiện tại, chúng tôi chưa đảm bảo khả năng tương thích với nguồn, nhưng vui lòng cho chúng tôi biết nếu đây là trường hợp sử dụng quan trọng đối với bạn và chúng ta có thể thảo luận về việc hỗ trợ khả năng này (#1247).