-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 #.#.# .