-chlo-legalize-to-stablehlo

CHLO işlem akışında StableHLO ve Shape işlemlerini yasallaştırır

-shape-legalize-to-stablehlo

Şekle ilişkin işlemleri StableHLO'da yasallaştırın.

Şekille ilgili işlemleri StableHLO işlemlerine yasallaştıran deneysel bir geçiş.

Şekil ve veri hesaplamalarını isteğe bağlı bir geçiş aracılığıyla bir araya getirmek, StableHLO ekosisteminin dinamikliği modellemek için StableHLO işlemlerini kullanan derleme ardışık düzenlerinden yararlanmasını mümkün kılar.

-stablehlo-aggressive-folder

StableHLO işlemlerini katlar

Seçenekler

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

-stablehlo-aggressive-simplification

StableHLO işlemlerini standart hale getirir

-stablehlo-canonicalize-dynamism

Dinamik StableHLO işlemlerini statik işlemlere dönüştürür.

DynamicReshapeOp gibi dinamik StableHLO işlemlerini, bu işlemlerin tüm dinamik öğeleri aslında sabitse DynamicReshapeOp ile ReshapeOp veya DynamicBroadcastInDim ile BroadcastInDim gibi karşılık gelen statik eşdeğerleriyle değiştirir.

  %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

StableHLO işlemleri için uyumluluk genişletici.

StableHLO işlemleri güncellenir veya en son sürümlerde yeni işlemler kullanıma sunulur. Bu etkinleştirme geçişi, yeni StableHLO işlemlerini eski sürümler tarafından desteklenen eşdeğer işlemlere ayırarak eski StableHLO sürümleriyle geriye dönük uyumluluğu genişletir.

Bu neden isteğe bağlı bir geçiş?

Bazen, OpenXLA ekosistemindeki belirli yaygın kalıpların işlenmesini büyük ölçüde basitleştirmek için StableHLO işlem geliştirmeleri kullanılır. Buna, çerçeve ve derleyici desteği yüksek olan TanOp gibi öğeler ve dilim kullanılarak temsil edilebilen ancak bölümlemeyi çok daha zor hale getiren toplayıcı/dağıtıcı toplu boyutlar dahildir. Sonraki optimizasyonlarda kullanılan önemli bilgiler kaybolabileceğinden, bu yeni özellik kategorisi için otomatik düşüş sunmuyoruz. Bu geçiş, olası daha az optimal derleme pahasına uyumluluğu en üst düzeye çıkarmak için bu işlemleri hedef bir sürüme göre genişletmek amacıyla kullanılabilir.

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>
}

Seçenekler

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

-stablehlo-convert-to-signless

IR'yi işaretsiz tam sayılara dönüştürmek için iletin.

-stablehlo-legalize-composite-to-call

Kompozit işlemleri, bunların ayrıştırılmasına yönelik bir çağrıyla değiştirir.

Kompozit işlemleri, bunların ayrıştırılmasına yönelik bir çağrıyla değiştirir (ör. aşağıdaki gibi):

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

Şu hâle gelir:

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

Bir kompozit alt kümesi, "except" işareti kullanılarak bu dönüşümden hariç tutulabilir. Örneğin:

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

Seçenekler

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

-stablehlo-legalize-deprecated-ops

Desteği sonlandırılan işlemleri iyi desteklenen işlemlerle yasallaştırın.

StableHLO v1.0 Opset Deprecations RFC (#2283), birkaç gereksiz işlemin kaldırılmasını önerir. Bu geçiş, bu op kaldırma işlemlerinin uzun süredir desteklenen benzerleriyle uyumlu hale getirilmesi yoluyla çeşitli derleme ardışık düzenlerindeki etkisini değerlendirmeye yardımcı olur.

Seçenekler

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

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

StableHLO kesirli işlemine (kesirli sayıyı tam sayıya dönüştürme, kayan nokta işlemi ve kesirli sayıya dönüştürme) kalıp ekleme

Sabit HLO kesirli işlemine kalıp (kesirli sayıyı tam sayıya dönüştürme, kayan nokta işlemi ve kesirli sayıya dönüştürme) işlemini birleştirme Not: Geçiş, önceden var olan herhangi bir işlemi silmez. Örneğin, aşağıdaki program

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>>
}

Şu hâle gelir:

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

StableHLO kesirli işlemlerini StableHLO ilkel matematik işlemlerine dönüştürün.

UniformQuantized türlerini kullanan StableHLO programlarını, anlamsal olarak eşdeğer tam sayı matematik işlemlerine dönüştürün.

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>>
}

Şu hâle gelir:

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

Kantitatif StableHLO işlemini (kantitatifleştirme, kayan nokta işlemi ve kantitatifleştirme) desenine ayırın.

Tekdüzen kesme/kesme işlemini kullanarak StableHLO kesikli programlarını ayrıştırın. Örneğin, aşağıdaki program

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>>
}

Şu hâle gelir:

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

StableHLO'yu VHLO olarak yasallaştırın.

-stablehlo-refine-arguments

Ana işlevin bağımsız değişken şekillerini hassaslaştırır.

Giriş türü imzasını kullanarak ana işlevin bağımsız değişkenlerini değiştirir. Şekil hassaslaştırma çalıştırılmadan önce IR'yi geçerli tutmak için bağımsız değişkenleri custom_call @stablehlo.shape_refinement_operand_wrapper içine sarar.

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, hassaslaştırılmış türlerin listesini belirtmek için kullanılabilir. Bu, MLIR'de --types='tensor<...>,tensor<...>' ile belirtilebilir veya pass create yöntemine iletilebilir. Ayrıntılandırma türü listesi, ayrıntılandırılan main yönteminin her bağımsız değişkeninin türünü belirtmelidir.

Seçenekler

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

-stablehlo-refine-shapes

StableHLO programındaki şekilleri hassaslaştırır.

İşlemler içindeki şekilleri hassaslaştıran bir StableHLO programını gösterir.

Bu geçişin en önemli kullanım alanı, dinamik şekilli programları statik şekillere göre özelleştirmektir. Dinamik şekilde biçimlendirilmiş bir StableHLO programının doğru yapısı varsa bağımsız değişken türlerini dinamik şekillerden statik şekillere güncelleyip bu geçişi çalıştırdığınızda statik şekiller program genelinde yayılır.

Bu geçiş, sonucun kullanımlarını doğrudan operatörle değiştirerek custom_call @shape_refinement_operand_wrapper değerini kaldırır ve statik şekilleri program genelinde dağıtır.

  %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>

Şekil hassaslaştırma için geçerli olan modüller aşağıdaki özelliklere sahip olmalıdır:

  • Tüm dinamik şekiller yalnızca giriş şekillerine bağlıdır (giriş dizisi içeriğine bağlı şekil yoktur). Yalnızca giriş şekillerine (ör. stablehlo.get_dimension_size tarafından verilen) veya sembolik tam sayıların çözüldüğü değerler gibi genel sabitlere (ör. tensör : A = 5) geçişli olarak bağlı olan işlemlere dimension işlemleri denir. Tüm boyut değerleri, prosedürler arası sabit toplama işlemiyle sabitlere çözülebilir.
  • Ara işlevler, bağımsız değişken listesinin başında bir dizi jeton bağımsız değişkeni (!stablehlo.token türü) alabilir.Ardından, sembolik tam sayıların çözüldüğü değerler (ör. : A = 5) gibi sabit tam sayı skaler olan bazı küresel sabit bağımsız değişkenler alabilir.
  • Bazı ara işlevler, global sabitler üzerinde hesaplamalar döndürebilir (ör. simgesel değerler üzerinde floordiv). Bu işlevler, hassaslaştırma işleminden sonra yalnızca sabit değerler döndürerek belirtilir. Bu işlevler satır içi olarak yerleştirilir.
  • Tek bir işleve yapılan tüm çağrılar aynı bağımsız değişken biçimlerine çözümlenir ve yinelenen / ortak yinelenen işlev çağrısı yapılmaz. ### -vhlo-legalize-to-stablehlo

VHLO'yu StableHLO olarak yasallaştırın.

-vhlo-to-version

VHLO sürümleri arasında dönüştürme

Seçenekler

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