Phương ngữ VHLO

Phương ngữ VHLO là gì?

Phương ngữ VHLO (StableHLO) được dùng để chuyển đổi tuần tự và độ ổn định. Công cụ này cung cấp thông tin tổng quan nhanh về phương ngữ StableHLO tại một thời điểm nhất định bằng cách tạo phiên bản cho từng phần tử chương trình.

VHLO là một phương ngữ chỉ bổ sunghoạt động, loại và thuộc tính được tạo phiên bản, có nghĩa là sau khi thêm một tính năng vào phương ngữ, bạn không thể sửa đổi tính năng đó theo bất kỳ cách nào ảnh hưởng đến ngữ nghĩa.

Mọi thay đổi đối với hoạt động, loại hoặc thuộc tính đều yêu cầu thêm phiên bản mới vào phương ngữ. Ví dụ: nếu một my_op giả định được thêm vào StableHLO trong 0.9.0, nhưng đã được thay đổi trong 0.11.0, thì chúng ta sẽ có đoạn mã sau trong VHLO:

// This represents the StableHLO version of the op from 0.9.0 -> 0.10.0
// Both the lower and the upper bound of versions are inclusive
def VHLO_MyOpV1 : VHLO_Op<"my_op_v1", "0.9.0", "0.10.0"> {
  let arguments = (ins
    VHLO_AnyType:$operand
  );
  let results = (outs VHLO_AnyType:$result);
}

// This represents the StableHLO version of the op from 0.11.0 -> current
def VHLO_MyOpV2 : VHLO_Op<"my_op_v2", "0.11.0", "current"> {
  let arguments = (ins
    VHLO_AnyType:$operand,
    VHLO_AnyAttr:$attr  // New attribute added to StableHLO in 0.11.0
  );
  let results = (outs VHLO_AnyType:$result);
}

Phương ngữ StableHLO chỉ có phiên bản mới nhất của hoạt động. Trong ví dụ đang chạy, phương ngữ StableHLO tại phiên bản 0.11.0 sẽ chỉ có StableHLO_MyOpoperandattr, trong khi VHLO ghi lại từng giai đoạn phát triển của op.

Tại sao VHLO lại hữu ích?

Việc sử dụng một phương ngữ được tạo phiên bản cho phép chúng ta nhắm đến các phiên bản trước của nhóm áp dụng StableHLO. Điều này đóng gói khả năng tương thích xuôi và ngược trong các lượt chuyển đổi giữa các hoạt động trong phương ngữ VHLO.

Khả năng tương thích chuyển tiếp: Khả năng tương thích chuyển tiếp được cung cấp bằng cách chuyển đổi sang VHLO và hạ cấp hoạt động xuống một phiên bản mục tiêu. Nếu bạn có thể hạ cấp mọi op/type/attr trong chương trình VHLO xuống phiên bản mục tiêu thì đảm bảo sẽ có thể loại bỏ và chuyển đổi sang StableHLO trên một người dùng thông thường chạy phiên bản lớn hơn hoặc bằng phiên bản mục tiêu, vì VHLO có tổng quan nhanh của các đối tượng đó tại thời điểm đó.

Hình ảnh về khả năng tương thích chuyển tiếp

Quá trình chuyển đổi hạ cấp này sẽ không thành công nếu các hoạt động hoặc tính năng không có trong phiên bản trước đó của ứng dụng web được sử dụng. Điều này có nghĩa là khả năng tương thích chuyển tiếp được phát hiện trên trình sản xuất, thay vì trong thời gian chạy.

Khả năng tương thích ngược: Khả năng tương thích ngược được cung cấp bằng cách nâng cấp các hoạt động VHLO lên phiên bản mới nhất (nếu cần), sau đó chuyển đổi một hoạt động trở lại thành StableHLO. Tất cả chương trình VHLO trong cửa sổ tương thích đều có thể nâng cấp lên StableHLO, nghĩa là các phiên bản khác nhau của người tiêu dùng có thể giải trình tự cùng một tải trọng VHLO từ phiên bản trước.

Hình ảnh về khả năng tương thích ngược

Quan trọng hơn, VHLO được tóm tắt phía sau quá trình chuyển đổi tuần tự. Tức là khung máy học (nhà sản xuất) chỉ cần nhắm đến các hoạt động StableHLO, còn các phần phụ trợ của trình biên dịch (người dùng) chỉ cần hỗ trợ phiên bản mới nhất, là tập hợp op StableHLO. Các lượt chuyển đổi đến và từ VHLO được xử lý bằng máy móc được bảo trì trong kho lưu trữ StableHLO.

Phiên bản định dạng mã byte MLIR

Để duy trì khả năng tương thích chuyển tiếp, các phiên bản StableHLO có một phiên bản Định dạng mã byte MLIR liên kết. Ngoài ra, phiên bản mới nhất của StableHLO sẽ sử dụng phiên bản mới nhất của Định dạng mã byte MLIR. Khi phiên bản Định dạng mã byte MLIR tăng lên, bản phát hành tiếp theo của StableHLO sẽ tăng phiên bản nhỏ và cập nhật Version.cpp để sử dụng phiên bản Định dạng mã byte MLIR mới nhất.

Để biết thông tin chi tiết về Định dạng mã byte MLIR và lý do sử dụng định dạng đó trong StableHLO, hãy xem bytecode.md.

Đóng góp các thay đổi không tương thích

Tất cả các thay đổi liên quan đến khả năng tương thích đều phải trải qua quy trình RFC. Điều này bao gồm cả việc thêm, ngừng sử dụng hoặc đổi tên một tính năng. Sau đây là một số nguyên tắc về việc đóng góp sau khi RFC được phê duyệt:

Chuyển số phiên bản trong Version.h

Trước khi cập nhật hoạt động, thuộc tính, loại hoặc lượt chuyển đổi VHLO, hãy tăng số phiên bản nhỏ trong Version.h. Mọi tính năng VHLO mới được thêm vào sẽ sử dụng phiên bản tăng này, ví dụ: sau khi đổ 0.10.0 --> 0.11.0, một op mới trong VhloOps.td sẽ sử dụng:

VHLO_Op<"abs_v2", "0.11.0", "current">

Thêm hoạt động triển khai và chuyển đổi VHLO bắt buộc

Mã chính xác cần thiết để tích hợp một tính năng mới sẽ khác nhau, nhưng đối với hầu hết các phần sau đây, bạn sẽ cần thay đổi:

Một ví dụ gần đây về việc gửi yêu cầu liên quan đến khả năng tương thích là bổ sung 2 loại FP8, cũng như triển khai các kiểu FP8 này trong VHLO trong #1379.

Thêm / cập nhật kiểm thử đơn vị

Tác nhân gây ra thay đổi không tương thích chịu trách nhiệm cho cả kiểm thử đơn vị tích cực và tiêu cực của tính năng, cũng như các kiểm thử đơn vị tương thích.

Kiểm thử đơn vị tương thích bao gồm việc cập nhật stablehlo_legalize_to_vhlo.mlir để đảm bảo rằng các lượt trọn vòng của StableHLO với phiên bản VHLO mới nhất, cũng như các bài kiểm thử bổ sung về khả năng tương thích xuôi hoặc ngược cần thiết.

Sau đây là một số ví dụ:

Thêm quy trình kiểm thử chuyển đổi tuần tự theo phiên bản

Sau khi thêm một điểm kiểm thử vào stablehlo_legalize_to_vhlo.mlir, hãy tạo một bản sao đã lập phiên bản của tệp có tên stablehlo_legalize_to_vhlo.0_X_0.mlir như dưới đây, cùng với một phiên bản mã byte của tệp đó có đuôi .0_X_0.mlir.bc. Thêm các dòng FileCheck phù hợp để kiểm thử khả năng tương thích ngược và xuôi.

$ export TARGET_VERSION=0.X.0
$ export TARGET_FILENAME=${TARGET_VERSION//./_}
$ cp stablehlo/tests/stablehlo_legalize_to_vhlo.mlir stablehlo/tests/stablehlo_legalize_to_vhlo.$TARGET_FILENAME.mlir
$ build/bin/stablehlo-translate --serialize --target=$TARGET_VERSION --strip-debuginfo stablehlo/tests/stablehlo_legalize_to_vhlo.$TARGET_FILENAME.mlir > stablehlo/tests/stablehlo_legalize_to_vhlo.$TARGET_FILENAME.mlir.bc

# Replace RUN commands in stablehlo/tests/stablehlo_legalize_to_vhlo.0_X_0.mlir with the following for 0.X.0:
// RUN: stablehlo-opt --mlir-print-op-generic %s.bc | FileCheck %s
// RUN: stablehlo-translate --deserialize %s.bc | stablehlo-translate --serialize --target=0.X.0 | stablehlo-opt --mlir-print-op-generic | FileCheck %s
// RUN: diff <(stablehlo-translate --deserialize %s.bc | stablehlo-opt) <(stablehlo-opt --strip-debuginfo %s)
// RUN: diff %s.bc <(stablehlo-translate --serialize --target=0.X.0 --strip-debuginfo %s)

Ví dụ về kiểm thử có nhiều phiên bản trong #1430.