Kuantisasi StableHLO

Jenis Kuantisasi di StableHLO

Kuantisasi adalah teknik untuk mengoptimalkan model machine learning dengan mengonversi angka floating point (seperti yang digunakan dalam model asli) menjadi bilangan bulat dengan presisi yang lebih rendah. Hal ini mengurangi penggunaan memori dan mempercepat komputasi, sehingga membuat model lebih efisien untuk di-deploy di perangkat dengan sumber daya terbatas.

Kuantisasi StableHLO mengikuti spesifikasi kuantisasi LiteRT, menggunakan skema kuantisasi seragam dengan dukungan untuk kuantisasi per-tensor dan per-sumbu. Jenis ini mewarisi ekspresi jenisnya dari Quant dialect MLIR, yang memberikan cara standar untuk merepresentasikan jenis data terkuantisasi.

Kuantisasi seragam memetakan nilai floating point ke bilangan bulat menggunakan ukuran langkah seragam, sehingga menghasilkan nilai terkuantisasi yang berjarak sama. Hal ini dicapai melalui hubungan afine menggunakan dua parameter kuantisasi utama.

Kuantisasi seragam menyederhanakan representasi bilangan floating-point dengan memetakannya ke bilangan bulat yang berjarak sama. Pemetaan ini dicapai melalui transformasi affine yang menggunakan dua parameter utama: skala dan titik nol. Skala menentukan ukuran langkah antara nilai terkuantisasi yang berurutan. Skala yang lebih kecil berarti nilai terkuantisasi lebih berdekatan. Titik nol menentukan nilai bilangan bulat yang merepresentasikan nol dalam ruang floating point asli.

Hubungan antara nilai floating point asli (real_value) dan nilai bilangan bulat terkuantisasi (quantized_value) dalam kuantisasi seragam adalah:

real_value = scale * (quantized_value - zero_point)

Kuantisasi Per-tensor

Dalam kuantisasi per tensor, satu skala dan titik nol digunakan untuk semua nilai dalam tensor. Jenis terkuantisasi per-tensor dinyatakan dalam StableHLO sebagai:

quant.uniform scale:zero_point>

Contoh: !quant.uniform<i8:f32, 0.01:50>

Ini merepresentasikan bilangan bulat 8-bit (i8) yang digunakan untuk menyimpan bilangan titik mengambang 32-bit (f32) menggunakan skala 0.01 dan titik nol 50.

Kuantisasi Per-sumbu

Kuantisasi per sumbu menawarkan pendekatan yang lebih mendetail dibandingkan dengan kuantisasi per tensor. Daripada menggunakan satu skala dan titik nol untuk seluruh tensor, kuantisasi per-sumbu menetapkan skala dan titik nol terpisah ke slice di sepanjang dimensi quantized_dimension tertentu dari tensor. Hal ini sangat berguna jika nilai sangat bervariasi di berbagai dimensi, sehingga memungkinkan pelestarian informasi dan akurasi yang lebih baik.

Pertimbangkan tensor t dengan ukuran dimensi [4, 3, 2]. Kita memilih untuk menguantisasi tensor ini di sepanjang dimensi kedua (quantized_dimension = 1). Artinya, kita akan memiliki tiga slice (karena dimensi kedua memiliki ukuran 3), yang masing-masing memiliki skala dan titik nolnya sendiri:

t[:, 0, :]: This slice gets scale[0] and zero_point[0].
t[:, 1, :]: This slice gets scale[1] and zero_point[1].
t[:, 2, :]: This slice gets scale[2] and zero_point[2].

Di StableHLO, jenis terkuantisasi per sumbu dinyatakan sebagai:

quant.uniform {scale0:zero_point0, scale1:zero_point1, ...}>

dengan panjang scale:zero_point cocok dengan jumlah slice di sepanjang quantized_dimension tensor yang berisi.

Contoh: tensor<4x3x2x!quant.uniform<i8:f32:1, {0.2:20, 0.1:10, 0.3:30}>>

Penerusan Kuantisasi di StableHLO

StableHLO menyediakan beberapa langkah kompilasi yang memungkinkan berbagai transformasi dan pengoptimalan terkait kuantisasi, sehingga memberi Anda fleksibilitas dalam cara menangani model terkuantisasi. Tiket tersebut adalah:

stablehlo-legalize-qdq-to-quantized-op

Pass ini menggabungkan pola umum dalam model terkuantisasi, operasi dekuantisasi yang diikuti dengan operasi floating point, dan terakhir operasi kuantisasi, menjadi satu operasi terkuantisasi. detail

stablehlo-legalize-quantized-op-to-qdq

Operasi ini melakukan hal yang berlawanan dengan operasi sebelumnya. Operasi ini menguraikan operasi terkuantisasi ke dalam urutan operasi dekuantisasi, operasi floating point, dan operasi kuantisasi yang setara. detail

stablehlo-legalize-quant-to-math

Pass ini mengonversi operasi StableHLO pada jenis yang dikuantisasi menjadi operasi yang setara pada jenis bilangan bulat. Pada dasarnya, fungsi ini mengimplementasikan aritmetika kuantisasi menggunakan operasi matematika standar. Dekomposisi ini berguna untuk sistem yang tidak mendukung kuantisasi secara native, tetapi masih dapat menggunakan aritmatika kuantisasi untuk mengekspresikan semantik model terkuantisasi. detail

stablehlo-quant-legalize-to-tosa-rescale

StableHLO menawarkan kemampuan untuk melegalkan operasi terkuantisasi ke representasi yang sesuai dalam dialek TOSA. Legalisasi ini memfasilitasi kompatibilitas dan interoperabilitas antara StableHLO dan TOSA. Pass ini secara strategis mengonversi operasi terkuantisasi StableHLO menjadi kombinasi operasi StableHLO dan TOSA, dengan dialek TOSA terutama digunakan untuk operasi rescale. Operasi tosa.rescale memainkan peran penting dalam menyesuaikan skala dan titik nol nilai terkuantisasi, sehingga memungkinkan representasi akurat data terkuantisasi dalam framework TOSA. detail

tosa-rescale-legalize-to-stablehlo

Pass ini menulis ulang operasi penskalaan ulang TOSA menjadi operasi matematika primitif StableHLO. Salah satu kasus penggunaan utama untuk penerusan ini adalah mengizinkan interpreter StableHLO mengevaluasi program yang berisi operasi penskalaan ulang TOSA. detail

Mengevaluasi Program yang Dikuantisasi

Interpreter referensi StableHLO dapat menjalankan program yang berisi operasi terkuantisasi secara efisien. Untuk mencapai hal ini, program pertama-tama menurunkan program ke representasi yang setara hanya menggunakan operasi bilangan bulat. Proses penurunan ini melibatkan serangkaian penerusan compiler yang mengubah program sebelum interpretasi.

Pada dasarnya, interpreter memanfaatkan stablehlo-legalize-quant-to-math pass untuk mengonversi operasi terkuantisasi menjadi penerapan aritmatika bilangan bulat yang sesuai. Pass ini memperkenalkan operasi penyiaran CHLO untuk menangani perkalian/pembagian skala dan penambahan titik nol. Untuk memastikan kompatibilitas dengan interpreter StableHLO, operasi CHLO ini kemudian dilegalkan menjadi operasi StableHLO. Hal ini memperkenalkan operasi terkait bentuk yang selanjutnya dikanonisasi dan dioptimalkan menggunakan serangkaian proses kanonisasi.

Urutan lengkap lintasan yang terlibat dalam proses penurunan ini adalah sebagai berikut:

stablehlo-legalize-quant-to-math
chlo-legalize-to-stablehlo
canonicalize
shape-legalize-to-stablehlo
stablehlo-canonicalize-dynamism

Kasus Pengujian Terkuantisasi

StableHLO menyediakan serangkaian kasus pengujian terkuantisasi yang komprehensif untuk memvalidasi kebenaran dan perilaku operasi terkuantisasi. Kasus pengujian ini berfungsi sebagai pengujian unit, yang mencakup berbagai operasi StableHLO dalam skenario terkuantisasi.

Contoh umum kasus pengujian terkuantisasi terlihat seperti

func.func @main() -> tensor<11xf32> {
    %operand_0 = stablehlo.constant dense<...> : tensor<11xf32>
    %operand_1 = stablehlo.constant dense<...> : tensor<11xf32>
    %golden = stablehlo.constant dense<...> : tensor<11xf32>

    %0 = stablehlo.uniform_quantize %operand_0 : (tensor<11xf32>) -> tensor<11x!quant.uniform<i8:f32, 0.3>>
    %1 = stablehlo.uniform_quantize %operand_1 : (tensor<11xf32>) -> tensor<11x!quant.uniform<i8:f32, 0.3>>

    %2 = stablehlo.add %1, %0 : tensor<11x!quant.uniform<i8:f32, 0.3>>

    %result = stablehlo.uniform_dequantize %2 : (tensor<11x!quant.uniform<i8:f32, 0.3>>) -> tensor<11xf32>

    %4 = stablehlo.custom_call @check.eq(%golden, %result) : (tensor<11xf32>, tensor<11xf32>) -> tensor<i1>

    return %3 : tensor<11xf32>
  }

dan mencakup:

Kasus pengujian ini bermanfaat untuk:

  • Memvalidasi kuantisasi StableHLO: Memastikan bahwa perilaku kuantisasi operasi StableHLO sesuai dengan hasil yang diharapkan.
  • Validasi silang: Membandingkan perilaku kuantisasi StableHLO dengan implementasi atau framework lainnya.
  • Penelusuran kesalahan dan pengembangan: Membantu pengembangan dan penelusuran kesalahan fitur atau pengoptimalan kuantisasi baru.