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. Fungsi ini memberikan snapshot dialek StableHLO pada waktu tertentu dengan pembuatan versi elemen-elemen program individual.

VHLO adalah dialek khusus tambahan dengan operasi, jenis, dan atribut berversi, yang berarti bahwa setelah fitur ditambahkan ke dialek, itu tidak dapat dimodifikasi dengan cara apa pun yang mempengaruhi semantik.

Setiap perubahan pada op, jenis, atau atribut memerlukan versi baru untuk ditambahkan dalam dialeknya. Misalnya, jika hipotesis my_op ditambahkan ke StableHLO di 0.9.0, tetapi diubah di 0.11.0, kami akan memiliki yang berikut ini 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 operasi versi terbaru. Sedang dijalankan contoh, dialek StableHLO di v0.11.0 hanya akan memiliki StableHLO_MyOp yang memiliki operand dan attr, sementara VHLO merekam setiap fase operasi evolusi.

Mengapa VHLO berguna?

Dengan memiliki dialek berversi, kita dapat menargetkan versi sebelumnya dari Opset StableHLO. Hal ini mencakup kompatibilitas maju dan mundur dalam konversi antaroperasi dalam dialek VHLO.

Kompatibilitas dengan versi baru: Kompatibilitas dengan versi baru disediakan dengan melakukan konversi ke VHLO dan mendowngrade operasi ke versi target. Jika setiap op/type/attr dalam Program VHLO dapat didowngrade ke versi target, dijamin dideserialisasi dan dapat dikonversi ke StabilHLO pada konsumen yang menjalankan versi lebih besar dari atau sama dengan versi target, karena VHLO memiliki {i>snapshot<i} dari {i>opset<i} pada saat itu.

Gambar kompatibilitas dengan versi baru

Konversi downgrade ini akan gagal jika operasi atau fitur yang tidak ada di {i>opset<i} versi sebelumnya akan digunakan. Ini berarti bahwa kompatibilitas dengan versi baru ditemukan pada produser, bukan pada saat runtime.

Kompatibilitas mundur: Kompatibilitas mundur disediakan dengan mengupgrade Operasi VHLO ke versi terbarunya (jika diperlukan), lalu mengonversi op kembali ke StabilHLO. Semua program VHLO dalam jendela kompatibilitas dapat diupgrade ke StabilHLO, artinya versi konsumen yang berbeda dapat melakukan deserialisasi yang sama Payload VHLO dari versi sebelumnya.

Gambar kompatibilitas mundur

Lebih penting lagi, VHLO diabstraksi di balik serialisasi. Ini berarti bahwa ML framework (produsen) hanya perlu menargetkan operasi StabilHLO, dan compiler backend (konsumen) hanya perlu mendukung versi terbaru, yaitu Operasi StableHLO disetel. Konversi ke dan dari VHLO ditangani dengan mesin disimpan di repositori StableHLO.

Versi Format Bytecode MLIR

Untuk mempertahankan kompatibilitas dengan versi baru, versi StabilHLO memiliki versi MLIR Bytecode Format terkait. Selain itu, versi terbaru StabilHLO akan menggunakan Format MLIR Bytecode versi terbaru. Jika Versi Format MLIR Bytecode bertambah, rilis StableHLO berikutnya akan menambahkan versi minor dan mengupdate Version.cpp untuk menggunakan versi Format MLIR Bytecode terbaru.

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