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

StableHLO là một ứng dụng điện toán máy tính 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à phạm vi đảm bảo khả năng tương thích mà StableHLO cung cấp, dựa trên quy trình được 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 hiện tại của StableHLO trong Version.h.

Trong chuỗi phiên bản 0.x.x, phiên bản nhỏ sẽ tăng lên mỗi khi 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á sẽ được cải tiến mỗi khi chúng tôi tích hợp StableHLO ở hạ nguồn, chẳng hạn như vào kho lưu trữ Openxla/xla.

Đảm bảo

Khả năng tương thích ngược trong 6 tháng: 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ó cùng ngữ nghĩa* khi giải tuần tự bằng một 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 6 tháng.

Khả năng tương thích chuyển tiếp trong 1 tháng: 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 sẽ có cùng ngữ nghĩa* khi giải tuần tự bằng một phiên bản libStablehlo cũ nếu các phiên bản này được tạo từ các cam kết Openxla/stablehlo cách nhau chưa đến 1 tháng, trừ phi chương trình đang 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 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 các API C++ hoặc Python. Quá trình chuyển đổi tuần tự cần 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 cho phiên bản hiện tại). Quá trình huỷ chuyển đổi tuần tự sử dụng phiên bản StableHLO hiện tại để đọc một 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 làm việc có lập trình, StableHLO cung cấp các API 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);

Hãy xem stablehlo/api/PortableApi.hstablehlo/dialect/Serialization.h để biết 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ụ 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ộ công cụ tương thích trong các hoạt động ổn định/kiểm thử, 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 mọi phiên bản StableHLO được hỗ trợ. Đối với mọi yêu cầu kéo, chúng tôi sẽ kiểm thử cả khả năng tương thích ngược và xuôi – tức là bộ ứng dụng có thể nhắm mục tiêu giải tuần tự HEAD (khả năng tương thích ngược), bản tóm tắt có thể nhắm mục tiêu theo 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 với các chương trình StableHLO gốc.

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

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

Sử dụng cách triển khai tham chiếu: Hiện tại, hoạt động kiểm thử khả năng tương thích bao gồm giải trình 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 việc huỷ chuyển đổi tuần tự sẽ tạo ra các chương trình giống nhau về cú pháp. Chúng tôi cũng dự định sử dụng phương thức triển khai tham chiếu trong các kiểm thử này, giảm bớt yêu cầu quá mức về nhận dạng cú pháp, đồng thời kiểm thử toàn diện cách triển khai tham chiếu (#1245).

Ngoài phạm vi hỗ trợ

Cấu phần phần mềm không di động được: Chúng tôi chỉ đưa ra đả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à bản trình bày mã byte của phương ngữ StableHLO, không đả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 cho các tính năng được hỗ trợ trước đây trong các chương trình StableHLO nhưng chưa thuộc thông số kỹ thuật của StableHLO, chẳng hạn như chúng tôi không đưa ra sự đả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 lỗi: Chúng tôi có thể thực hiện các thay đổi không tương thích nếu quy trình 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 một đị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 theo số: StableHLO có nhiều hoạt động với độ chính xác do việc triển khai xác định giữa các đối tượng tiêu dùng và thậm chí trong cùng một người tiêu dùng trên nhiều phiên bản. Do đó, StableHLO không đảm bảo về độ chính xác số lượng, 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 các 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 để chúng ta có thể thảo luận về việc hỗ trợ tính năng này (#1247).