Dialek VHLO

Apa itu Dialek VHLO?

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

VHLO adalah dialek khusus tambahan dengan operasi, jenis, dan atribut berversi. Artinya, setelah ditambahkan ke dialek, fitur tersebut tidak dapat dimodifikasi dengan cara apa pun yang memengaruhi semantik.

Setiap perubahan pada operasi, jenis, atau atribut memerlukan versi baru untuk ditambahkan ke dialek tersebut. Misalnya, jika hipotesis my_op ditambahkan ke StableHLO dalam 0.9.0, tetapi diubah dalam 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 operasi versi terbaru. Dalam contoh yang berjalan, dialek StableHLO di v0.11.0 hanya akan memiliki StableHLO_MyOp yang memiliki operand dan attr, sedangkan VHLO menangkap setiap fase evolusi op.

Mengapa VHLO berguna?

Memiliki dialek berversi memungkinkan kita menargetkan opset StableHLO versi sebelumnya. Cara ini mengenkapsulasi kompatibilitas maju dan mundur dalam konversi antara berbagai 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/jenis/attr dalam program VHLO dapat didowngrade ke versi target, maka VHLO dijamin dapat dideserialisasi dan dikonversi ke StableHLO pada konsumen yang menjalankan versi yang lebih besar atau sama dengan versi target, karena VHLO memiliki snapshot opset pada saat itu.

Gambar kompatibilitas maju

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

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

Gambar kompatibilitas mundur

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

Versi Format Bytecode MLIR

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

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

Menyumbangkan Perubahan yang Tidak Kompatibel

Semua perubahan dengan implikasi kompatibilitas harus melalui proses RFC. Hal ini termasuk menambahkan, menghentikan penggunaan, atau mengganti nama fitur. Setelah RFC disetujui, berikut beberapa panduan kontribusi:

Menambahkan Nomor Versi di Version.h

Sebelum memperbarui operasi, atribut, jenis, atau konversi VHLO, naikkan nomor versi minor pada Version.h. Setiap fitur VHLO baru yang ditambahkan akan menggunakan versi yang ditambahkan ini, misalnya setelah menabrak 0.10.0 --> 0.11.0, operasi baru di VhloOps.td akan menggunakan:

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

Tambahkan Penerapan dan Konversi VHLO yang Diperlukan

Kode yang tepat yang diperlukan untuk mengintegrasikan fitur baru akan bervariasi, tetapi untuk sebagian besar, hal berikut perlu diubah:

Contoh terbaru pengiriman terkait kompatibilitas adalah penambahan dua jenis FP8, serta implementasinya di VHLO pada #1379.

Menambahkan / Mengupdate Pengujian Unit

Kontributor perubahan yang tidak kompatibel bertanggung jawab atas pengujian unit positif dan negatif dari fitur, serta pengujian unit kompatibilitas.

Pengujian unit kompatibilitas melibatkan update stablehlo_legalize_to_vhlo.mlir untuk memastikan bahwa perjalanan bolak-balik StableHLO dengan versi terbaru VHLO, serta pengujian kompatibilitas maju atau mundur tambahan yang diperlukan.

Beberapa contoh:

Tambahkan Uji Serialisasi Versi

Setelah menambahkan titik pengujian ke stablehlo_legalize_to_vhlo.mlir, buat salinan berversi file bernama stablehlo_legalize_to_vhlo.0_X_0.mlir sebagai berikut, beserta versi bytecode dari file tersebut dengan ekstensi .0_X_0.mlir.bc. Tambahkan baris FileCheck yang tepat untuk pengujian kompatibilitas maju dan mundur.

$ 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)

Contoh pengujian berversi di #1430.