Phương ngữ VHLO

Hãy xem vhlo_checklist.md để biết các bước cần làm khi chỉnh sửa VHLO.

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

Phương ngữ VHLO (Phiên bản StableHLO) được dùng để chuyển đổi tuần tự và đảm bảo tính ổn định. Tệp 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ỉ thêm với các hoạt động, loại và thuộc tính được tạo phiên bản, có nghĩa là sau khi một tính năng được thêm vào phương ngữ, phương ngữ đó không thể bị sửa đổi theo bất kỳ cách nào ảnh hưởng đến ngữ nghĩa.

Bất kỳ thay đổi nào đối với hoạt động, loại hoặc thuộc tính đều yêu cầu phải thêm một 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 phiên bản 0.9.0, nhưng đã được thay đổi trong phiên bản 0.11.0, thì chúng ta sẽ có nội dung 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 hoạt động mới nhất. Trong ví dụ đang chạy, phương ngữ StableHLO ở 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 toán tử.

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

Việc có một phương ngữ 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 thao tác StableHLO. Điều này gói gọn khả năng tương thích thuận và ngược trong các lượt chuyển đổi giữa các toán tử 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 các thao tác xuống phiên bản mục tiêu. Nếu mọi thao tác/loại/thuộc tính trong chương trình VHLO có thể được hạ cấp xuống phiên bản mục tiêu, thì chương trình đó được đảm bảo có thể chuyển đổi tuần tự và chuyển đổi sang StableHLO trên một trình dù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ó bản tổng quan nhanh về tập hợp thao tác tại thời điểm đó.

Hình ảnh có 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 bạn sử dụng các thao tác hoặc tính năng không có trong phiên bản trước của nhóm thao tác. Đ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 thực thể 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 hoạt động VHLO lên phiên bản mới nhất (nếu cần), sau đó chuyển đổi hoạt động về ổn định. Tất cả chương trình VHLO trong khoảng thời gian tương thích đều có thể nâng cấp lên StableHLO, nghĩa là các phiên bản của người dùng có thể chuyển đổi tuần tự cùng một tải trọng VHLO từ mộ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 trừu tượng hoá sau quá trình chuyển đổi tuần tự. Điều này có nghĩa là các khung máy học (trình tạo) chỉ cần nhắm đến các toán tử StableHLO và 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, tức là tập hợp toán tử 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ó phiên bản Định dạng mã byte MLIR được 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 này trong StableHLO, hãy xem bytecode.md.