-chlo-legalize-to-stablehlo

Mengonversi dari alur operasi CHLO ke operasi StableHLO dan Shape

-shape-legalize-to-stablehlo

Membuat operasi terkait bentuk menjadi legal untuk StableHLO.

Kartu eksperimental yang melegalkan operasi terkait bentuk ke operasi StableHLO.

Menggabungkan komputasi bentuk dan data melalui kartu opsional akan memungkinkan ekosistem StableHLO berpotensi memanfaatkan pipeline kompilasi yang menggunakan operasi StableHLO untuk membuat model dinamisme.

-stablehlo-aggressive-folder

Melipat operasi StableHLO

Opsi

-fold-float : Allow for potentially lossy computations using float type.

-stablehlo-aggressive-simplification

Mengonversi operasi StableHLO menjadi kanonis

-stablehlo-canonicalize-dynamism

Mengonvergensi operasi StableHLO dinamis menjadi operasi statis.

Mengganti operasi StableHLO dinamis seperti DynamicReshapeOp dengan counterpart statis yang sesuai seperti DynamicReshapeOp ke ReshapeOp atau DynamicBroadcastInDim ke BroadcastInDim jika semua elemen dinamis dari op ini sebenarnya adalah konstanta.

  %c = stablehlo.constant dense<16> : tensor<1xi32>
  %0 = stablehlo.dynamic_broadcast_in_dim %cst, %c, dims = [] : (tensor<f32>, tensor<1xi32>) -> tensor<16xf32>

  ==>

  %0 = stablehlo.broadcast_in_dim %cst, dims = [] : (tensor<f32>) -> tensor<16xf32>

-stablehlo-compatibility-expander

Ekspander kompatibilitas untuk operasi StableHLO.

Operasi StableHLO mendapatkan update atau operasi baru diperkenalkan di versi terbaru. Kartu keikutsertaan ini memperluas kompatibilitas mundur dengan versi StableHLO lama dengan mendekomposisi operasi StableHLO yang lebih baru menjadi operasi yang setara yang didukung oleh versi lama tersebut.

Mengapa ini adalah kartu keikutsertaan?

Terkadang, peningkatan op StableHLO digunakan untuk sangat menyederhanakan penanganan pola umum tertentu di ekosistem OpenXLA. Hal ini mencakup hal-hal seperti TanOp, yang memiliki dukungan framework dan compiler yang tinggi, serta dimensi pengelompokan pengumpulan/penyebaran, yang dapat direpresentasikan menggunakan slice, tetapi membuat sharding jauh lebih sulit. Untuk kategori fitur baru ini, kami tidak menawarkan downgrade otomatis, karena dapat menghapus informasi penting yang digunakan dalam pengoptimalan berikutnya. Kartu ini dapat digunakan untuk memperluas operasi ini berdasarkan versi target untuk memaksimalkan kompatibilitas dengan mengorbankan kompilasi yang berpotensi kurang optimal.

func.func @tan_op_non_complex(%arg0: tensor<4xf64>) -> tensor<4xf64> {
  %1 = stablehlo.tan %arg0 : tensor<4xf64>
  func.return %1 : tensor<4xf64>
}

==>

func.func @tan_op_non_complex(%arg0: tensor<4xf64>) -> tensor<4xf64> {
  %0 = stablehlo.sine %arg0 : tensor<4xf64>
  %1 = stablehlo.cosine %arg0 : tensor<4xf64>
  %2 = stablehlo.divide %0, %1 : tensor<4xf64>
  return %2 : tensor<4xf64>
}

Opsi

-target : The target version. Must be a version of the form #.#.#.

-stablehlo-convert-to-signless

Teruskan untuk mengubah IR menjadi bilangan bulat tanpa tanda tangan.

-stablehlo-legalize-composite-to-call

Mengganti operasi gabungan dengan panggilan ke dekomposisinya.

Mengganti operasi gabungan dengan panggilan ke dekomposisinya, misalnya, di bawah ini:

stablehlo.composite "my_namespace.my_op" %arg0, %arg1 {
  decomposition = @bar,
  version = 1,
  composite_attributes = {
    "my_attribute": "my_value"
  }
}

Akan menjadi:

func.call @bar(%arg0, %arg1)

Subkumpulan komposit dapat dikecualikan dari transformasi ini menggunakan flag "except", misalnya:

stablehlo-opt --stablehlo-legalize-composite-to-call=except='foo.baz,foo.qux'

Opsi

-except : Names of composites that should not be replaced with calls.

-stablehlo-legalize-deprecated-ops

Legalkan operasi yang tidak digunakan lagi ke operasi yang didukung dengan baik.

RFC Penghentian Opset StableHLO v1.0 (#2283) mengusulkan untuk menghapus beberapa operasi yang redundan. Kartu ini membantu mengevaluasi dampak penghapusan op ini di berbagai pipeline kompilasi dengan melegalkannya ke op yang didukung jangka panjang.

Opsi

-fail-on-unused : Fail on (mostly) unused ops that are deprecated without any fallback.

-stablehlo-legalize-qdq-to-quantized-op

Menggabungkan pola (de-kuantisasi, operasi floating point, dan kuantisasi) ke dalam operasi kuantisasi StableHLO

Menggabungkan pola (de-kuantisasi, operasi floating point, dan kuantisasi) ke dalam operasi kuantisasi StableHLO Catatan: Kartu tidak menghapus operasi yang sudah ada. Misalnya, program berikut

func.func @add(%arg0: tensor<16x16x!quant.uniform<ui8:f32, 34.0:16>>) -> tensor<16x16x!quant.uniform<ui8:f32, 34.0:16>> {
  %0 = stablehlo.uniform_dequantize %arg0 : (tensor<16x16x!quant.uniform<ui8:f32, 34.0:16>>) -> tensor<16x16xf32>
  %1 = stablehlo.abs %0 : tensor<16x16xf32>
  %2 = stablehlo.uniform_quantize %1 : (tensor<16x16xf32>) -> tensor<16x16x!quant.uniform<ui8:f32, 34.0:16>>
  func.return %2 : tensor<16x16x!quant.uniform<ui8:f32, 34.0:16>>
}

Akan menjadi:

func.func @add(%arg0: tensor<16x16x!quant.uniform<u8:f32, 3.400000e+01:16>>) -> tensor<16x16x!quant.uniform<u8:f32, 3.400000e+01:16>> {
  %0 = stablehlo.uniform_dequantize %arg0 : (tensor<16x16x!quant.uniform<u8:f32, 3.400000e+01:16>>) -> tensor<16x16xf32>
  %1 = stablehlo.abs %0 : tensor<16x16xf32>
  %2 = stablehlo.abs %arg0 : tensor<16x16x!quant.uniform<u8:f32, 3.400000e+01:16>>
  %3 = stablehlo.uniform_quantize %1 : (tensor<16x16xf32>) -> tensor<16x16x!quant.uniform<u8:f32, 3.400000e+01:16>>
  return %2 : tensor<16x16x!quant.uniform<u8:f32, 3.400000e+01:16>>
}

-stablehlo-legalize-quant-to-math

Konversi dari operasi kuantisasi StableHLO ke operasi matematika primitif StableHLO.

Mengonversi program StableHLO menggunakan jenis UniformQuantized ke operasi matematika bilangan bulat yang setara secara semantik.

func.func @add(%arg0: tensor<!quant.uniform<i8:f32,1.0:0>>, %arg1: tensor<!quant.uniform<i8:f32,2.0:1>>) ->  tensor<!quant.uniform<i8:f32,3.0:2>> {
  %0 = "stablehlo.add"(%arg0, %arg1) : (tensor<!quant.uniform<i8:f32,1.0:0>>, tensor<!quant.uniform<i8:f32,2.0:1>>) -> tensor<!quant.uniform<i8:f32,3.0:2>>
  func.return %0 : tensor<!quant.uniform<i8:f32,3.0:2>>
}

Akan menjadi:

func.func @add(%arg0: tensor<i8>, %arg1: tensor<i8>) -> tensor<i8> {
  %0 = stablehlo.convert %arg0 : (tensor<i8>) -> tensor<f32>
  %cst = stablehlo.constant dense<0.333333343> : tensor<f32>
  %1 = chlo.broadcast_multiply %0, %cst : (tensor<f32>, tensor<f32>) -> tensor<f32>
  %cst_0 = stablehlo.constant dense<2.000000e+00> : tensor<f32>
  %2 = chlo.broadcast_add %1, %cst_0 : (tensor<f32>, tensor<f32>) -> tensor<f32>
  %3 = stablehlo.round_nearest_even %2 : tensor<f32>
  %4 = stablehlo.convert %3 : (tensor<f32>) -> tensor<i32>
  %5 = stablehlo.convert %arg1 : (tensor<i8>) -> tensor<f32>
  %cst_1 = stablehlo.constant dense<0.666666686> : tensor<f32>
  %6 = chlo.broadcast_multiply %5, %cst_1 : (tensor<f32>, tensor<f32>) -> tensor<f32>
  %cst_2 = stablehlo.constant dense<1.33333337> : tensor<f32>
  %7 = chlo.broadcast_add %6, %cst_2 : (tensor<f32>, tensor<f32>) -> tensor<f32>
  %8 = stablehlo.round_nearest_even %7 : tensor<f32>
  %9 = stablehlo.convert %8 : (tensor<f32>) -> tensor<i32>
  %c = stablehlo.constant dense<2> : tensor<i32>
  %10 = chlo.broadcast_add %4, %9 : (tensor<i32>, tensor<i32>) -> tensor<i32>
  %11 = chlo.broadcast_subtract %10, %c : (tensor<i32>, tensor<i32>) -> tensor<i32>
  %c_3 = stablehlo.constant dense<-128> : tensor<i32>
  %c_4 = stablehlo.constant dense<127> : tensor<i32>
  %12 = stablehlo.clamp %c_3, %11, %c_4 : tensor<i32>
  %13 = stablehlo.convert %12 : (tensor<i32>) -> tensor<i8>
  return %13 : tensor<i8>
}

-stablehlo-legalize-quantized-op-to-qdq

Dekomposisi operasi StableHLO yang terkuantisasi ke pola (dekuantisasi, operasi floating point, dan kuantisasi).

Dekomposisi program kuantisasi StableHLO menggunakan operasi kuantisasi/dekuantisasi seragam. Misalnya, program berikut

func.func @add(%arg0: tensor<!quant.uniform<i8:f32,1.0:0>>, %arg1: tensor<!quant.uniform<i8:f32,2.0:1>>) ->  tensor<!quant.uniform<i8:f32,3.0:2>> {
  %0 = "stablehlo.add"(%arg0, %arg1) : (tensor<!quant.uniform<i8:f32,1.0:0>>, tensor<!quant.uniform<i8:f32,2.0:1>>) -> tensor<!quant.uniform<i8:f32,3.0:2>>
  func.return %0 : tensor<!quant.uniform<i8:f32,3.0:2>>
}

Akan menjadi:

func.func @add(%arg0: tensor<!quant.uniform<i8:f32, 1.000000e+00>>, %arg1: tensor<!quant.uniform<i8:f32, 2.000000e+00:1>>) -> tensor<!quant.uniform<i8:f32, 3.000000e+00:2>> {
  %0 = stablehlo.uniform_dequantize %arg0 : (tensor<!quant.uniform<i8:f32, 1.000000e+00>>) -> tensor<f32>
  %1 = stablehlo.uniform_dequantize %arg1 : (tensor<!quant.uniform<i8:f32, 2.000000e+00:1>>) -> tensor<f32>
  %2 = stablehlo.add %0, %1 : tensor<f32>
  %3 = stablehlo.uniform_quantize %2 : (tensor<f32>) -> tensor<!quant.uniform<i8:f32, 3.000000e+00:2>>
  return %3 : tensor<!quant.uniform<i8:f32, 3.000000e+00:2>>
}

-stablehlo-legalize-to-vhlo

Mengizinkan StableHLO ke VHLO.

-stablehlo-refine-arguments

Meningkatkan bentuk argumen fungsi utama.

Mengubah argumen fungsi utama menggunakan tanda tangan jenis input. Menggabungkan argumen dalam custom_call @stablehlo.shape_refinement_operand_wrapper agar IR tetap valid sebelum penyempurnaan bentuk dijalankan.

func.func public @main(%arg0: tensor<?xf32>) -> tensor<?xf32> {
  ...
}

==>

func.func public @main(%arg0: tensor<16xf32>) -> tensor<?xf32> {
  %c = stablehlo.constant dense<16> : tensor<1xi64>
  %0 = stablehlo.custom_call @stablehlo.shape_refinement_operand_wrapper(%arg0, %c) {...}
    : (tensor<16xf32>, tensor<1xi64>) -> tensor<?xf32>
  ...

refinedTypesOption dapat digunakan untuk menentukan daftar jenis yang difilter. Hal ini dapat ditentukan di MLIR dengan --types='tensor<...>,tensor<...>', atau diteruskan ke metode pembuatan kartu. Daftar jenis peningkatan harus menentukan jenis setiap argumen ke metode main yang ditingkatkan.

Opsi

-types : The new types to be used for the main function's arguments, specified as an MLIR TypeRange 'tensor<1x2xf32>, ...'

-stablehlo-refine-shapes

Meningkatkan kualitas bentuk di seluruh program StableHLO.

Menjelaskan program StableHLO yang meningkatkan kualitas bentuk dalam operasi.

Kasus penggunaan unggulan untuk kartu ini adalah mengkhususkan program berbentuk dinamis ke bentuk statis. Jika program StableHLO berbentuk dinamis memiliki struktur yang tepat, memperbarui jenis argumennya dari bentuk dinamis menjadi bentuk statis dan menjalankan penerusan ini akan menyebarkan bentuk statis di seluruh program.

Kartu ini menghapus custom_call @shape_refinement_operand_wrapper dengan mengganti penggunaan hasil dengan operand secara langsung, dan menyebarkan bentuk statis di seluruh program.

  %c = stablehlo.constant dense<16> : tensor<1xi64>
  %0 = stablehlo.custom_call @stablehlo.shape_refinement_operand_wrapper(%arg0, %c) {...}
      : (tensor<16xf32>, tensor<1xi64>) -> tensor<?xf32>
  %1 = stablehlo.add %0, %0 : tensor<?xf32>

  ==>

  %1 = stablehlo.add %arg0, %arg0 : tensor<16xf32>

Modul yang valid untuk penyempurnaan bentuk harus memiliki properti berikut:

  • Semua bentuk dinamis hanya bergantung pada bentuk input (tidak ada dependensi bentuk pada konten array input). Kita menyebut operasi yang hanya bergantung secara transitif pada bentuk input (misalnya, seperti yang diberikan oleh stablehlo.get_dimension_size) atau konstanta global seperti nilai bilangan bulat simbolis yang di-resolve (yaitu tensor : A = 5), sebagai operasi dimension. Semua nilai dimensi dapat di-resolve ke konstanta melalui penggabungan konstanta antar-prosedural.
  • Fungsi perantara dapat menggunakan sejumlah argumen token (berjenis !stablehlo.token) di awal daftar argumen, diikuti dengan beberapa argumen konstanta global yang merupakan skalar bilangan bulat konstan, seperti nilai bilangan bulat simbolis yang di-resolve (yaitu tensor : A = 5).
  • Beberapa fungsi perantara dapat menampilkan komputasi pada konstanta global, yaitu floordiv pada nilai symint. Fungsi ini ditunjukkan dengan hanya menampilkan nilai konstan setelah penyempurnaan. Fungsi ini disisipkan.
  • Semua panggilan ke satu fungsi di-resolve ke bentuk argumen yang sama, dan tidak ada panggilan fungsi rekursif / ko-rekursif yang dilakukan. ### -vhlo-legalize-to-stablehlo

Mengesahkan VHLO ke StableHLO.

-vhlo-to-version

Mengonversi antar-versi VHLO.

Opsi

-target : The target version. Must be a version of the form #.#.# .