Dialek VHLO

Lihat vhlo_checklist.md untuk mengetahui langkah-langkah yang harus diikuti saat membuat perubahan pada VHLO.

Apa itu Dialek VHLO?

Dialek VHLO (Versioned StableHLO) digunakan untuk serialisasi dan stabilitas. Layanan ini memberikan snapshot dialek StableHLO pada waktu tertentu dengan membuat versi elemen program individual.

VHLO adalah dialek khusus penambahan dengan ops, jenis, dan atribut berversi, yang berarti bahwa setelah fitur ditambahkan ke dialek, fitur tersebut tidak dapat diubah dengan cara apa pun yang memengaruhi semantik.

Setiap perubahan pada op, jenis, atau atribut memerlukan versi baru untuk ditambahkan ke dialek. Misalnya, jika hipotesis my_op ditambahkan ke StableHLO di 0.9.0, tetapi diubah di 0.11.0, kita akan memiliki hal berikut di 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);
}

Dialek StableHLO hanya memiliki versi terbaru operasi. Dalam contoh yang sedang berjalan, dialek StableHLO di v0.11.0 hanya akan memiliki StableHLO_MyOp yang memiliki operand dan attr, sementara VHLO merekam setiap fase evolusi op.

Mengapa VHLO berguna?

Dengan memiliki dialek berversi, kita dapat menargetkan opset StableHLO versi sebelumnya. Hal ini mengenkapsulasi kompatibilitas maju dan mundur dalam konversi antar-operasi dalam dialek VHLO.

Kompatibilitas dengan versi baru: Kompatibilitas dengan versi baru disediakan dengan mengonversi ke VHLO dan mendowngrade operasi ke versi target. Jika setiap op/type/attr dalam program VHLO dapat didowngrade ke versi target, opsi tersebut dijamin akan dideserialisasi dan dikonversi ke StableHLO pada konsumen yang menjalankan versi yang lebih besar dari atau sama dengan versi target, karena VHLO memiliki snapshot opset pada saat itu.

Gambar kompatibilitas dengan versi baru

Konversi downgrade ini akan gagal jika op atau fitur yang tidak ada dalam opset versi sebelumnya digunakan. Artinya, kompatibilitas maju ditemukan di produsen, bukan saat runtime.

Kompatibilitas mundur: Kompatibilitas mundur disediakan dengan mengupgrade operasi VHLOp ke versi terbarunya (jika diperlukan), lalu mengonversi operasi kembali ke StableHLO. Semua program VHLO dalam periode kompatibilitas dapat diupgrade ke StableHLO, yang berarti versi konsumen yang berbeda dapat mendeserialisasi payload VHLO yang sama dari versi sebelumnya.

Gambar kompatibilitas mundur

Yang lebih penting, VHLO di-abstract di balik serialisasi. Artinya, framework ML (produser) hanya perlu menargetkan operasi StableHLO, dan backend compiler (konsumen) hanya perlu mendukung versi terbaru, yaitu set operasi StableHLO. Konversi ke dan dari VHLO ditangani dengan mesin yang dikelola di repo StableHLO.

Versi Format Bytecode MLIR

Untuk mempertahankan kompatibilitas maju, versi StableHLO memiliki versi Format Bytecode MLIR terkait. Selain itu, StableHLO versi terbaru akan menggunakan Format Bytecode MLIR versi terbaru. Saat versi Format MLIR Bytecode bertambah, rilis StableHLO berikutnya akan menambah versi minor dan mengupdate Version.cpp untuk menggunakan versi Format MLIR Bytecode terbaru.

Untuk mengetahui detail tentang Format Bytecode MLIR dan alasan penggunaannya di StableHLO, lihat bytecode.md.