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.
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.
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:
- Untuk semua perubahan:
- Mengupdate log versi di VhloDialect.td
- Untuk operasi baru:
- Tambahkan pengoperasian di VhloOps.td
- Menambahkan konversi StableHLO → VHLO di StablehloLegalizeToVhlo.cpp
- Tambahkan konversi VHLO → StableHLO di VhloLegalizeToStablehlo.cpp
- Untuk versi baru dari operasi yang sudah ada:
- Tambahkan pengoperasian di VhloOps.td
- Mengupdate pemetaan StableHLO ke VHLO di MapStablehloToVhlo.h
- Menambahkan konversi antara versi operasi baru dan lama di VhloToVersion.cpp
- Untuk jenis atau atribut baru:
- Tambahkan jenis di VhloTypes.td atau atribut di VhloAttrs.td
- Menambahkan konversi StableHLO → VHLO di StablehloLegalizeToVhlo.cpp
- Tambahkan konversi VHLO → StableHLO di VhloLegalizeToStablehlo.cpp
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:
- Kompatibilitas mundur, pengujian positif: vhlo_to_version_upgrade.mlir
- Kompatibilitas dengan versi baru dan pengujian positif: vhlo_to_version_downgrade.mlir
- Kompatibilitas dengan versi baru, pengujian negatif: vhlo_to_version_downgrade_invalid.0_9_0.mlir
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.