-chlo-legalize-to-stablehlo
將 CHLO 運算流程合法化,轉換為 StableHLO 和 Shape 運算
-shape-legalize-to-stablehlo
將形狀相關運算合法化至 StableHLO。
實驗性傳遞,可將形狀相關運算合法化為 StableHLO 運算。
透過選用的傳遞作業將形狀和資料運算結合,可讓 StableHLO 生態系統有機會利用使用 StableHLO 運算來模擬動態性的編譯管道。
-stablehlo-aggressive-folder
折疊 StableHLO 運算
選項
-fold-float : Allow for potentially lossy computations using float type.
-stablehlo-aggressive-simplification
將 StableHLO 作業標準化
-stablehlo-canonicalize-dynamism
將動態 StableHLO 運算轉換為靜態運算。
如果這些運算子的所有動態元素實際上都是常數,則會將動態 StableHLO 運算子 (例如 DynamicReshapeOp) 替換為對應的靜態運算子 (例如 DynamicReshapeOp
至 ReshapeOp
,或 DynamicBroadcastInDim
至 BroadcastInDim
)。
%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 作業的相容性展開項。
StableHLO 作業會在最新版本中獲得更新或推出新作業。這個選擇加入憑證會將較新的 StableHLO 作業分解為舊版支援的等效作業,進而擴大與舊版 StableHLO 的回溯相容性。
為什麼這是選擇加入的通行證?
有時,StableHLO 運算強化功能可大幅簡化 OpenXLA 生態系統中某些常見模式的處理方式。這包括 TanOp 等具有高架構和編譯器支援的功能,以及可使用切片表示但會使分割作業更加困難的收集/散布批次處理維度。對於這類新功能,我們不提供自動降級功能,因為這可能會捨棄在後續最佳化中使用的必要資訊。這個傳遞作業可用於根據目標版本擴充這些運算,以便盡可能提高相容性,但可能會導致編譯作業不夠理想。
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>
}
選項
-target : The target version. Must be a version of the form #.#.#.
-stablehlo-convert-to-signless
傳遞,將 IR 轉換為無符號整數。
-stablehlo-legalize-composite-to-call
以對組合運算的調用取代組合運算。
將複合運算替換為對其分解的呼叫,例如以下內容:
stablehlo.composite "my_namespace.my_op" %arg0, %arg1 {
decomposition = @bar,
version = 1,
composite_attributes = {
"my_attribute": "my_value"
}
}
會變成:
func.call @bar(%arg0, %arg1)
您可以使用「except」標記,將部分組合排除在這個轉換作業之外,例如:
stablehlo-opt --stablehlo-legalize-composite-to-call=except='foo.baz,foo.qux'
選項
-except : Names of composites that should not be replaced with calls.
-stablehlo-legalize-deprecated-ops
將已淘汰的運算設為受良好支援的運算。
StableHLO v1.0 Opset Deprecations RFC (#2283) 建議移除一些多餘的運算。這個階段會將這些作業移除作業合法化,以便在各種編譯管道中評估這些作業移除作業的影響。
選項
-fail-on-unused : Fail on (mostly) unused ops that are deprecated without any fallback.
-stablehlo-legalize-qdq-to-quantized-op
將 (去量化、浮點運算和量化) 模式結合至 StableHLO 量化運算
將 Fuse (de-quantize、浮點運算和量化) 模式整合至 StableHLO 量化運算 注意:傳遞不會刪除任何現有的運算。例如,以下程式
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>>
}
會變成:
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 量化運算轉換為 StableHLO 原始數學運算。
將使用 UniformQuantized 類型的 StableHLO 程式轉換為語義上等價的整數數學運算。
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>>
}
會變成:
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
將量化 StableHLO 運算分解為 (解量化、浮點運算和量化) 模式。
使用統一量化/去量化運算,分解 StableHLO 量化程式。例如,以下程式
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>>
}
會變成:
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 合法化為 VHLO。
-stablehlo-refine-arguments
精簡主函式的引數形狀。
使用輸入類型簽名修改主函式的引數。在 custom_call @stablehlo.shape_refinement_operand_wrapper
中包裝引數,以便在執行形狀精修前,讓 IR 保持有效。
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
可用來指定精細類型清單。您可以在 MLIR 中使用 --types='tensor<...>,tensor<...>'
指定這項資訊,或將其傳遞至 pass create 方法。精緻化類型清單必須指定精緻化 main
方法的每個引數類型。
選項
-types : The new types to be used for the main function's arguments, specified as an MLIR TypeRange 'tensor<1x2xf32>, ...'
-stablehlo-refine-shapes
在 StableHLO 程式中精修形狀。
逐步說明 StableHLO 程式如何在作業中調整形狀。
這個版本的主要用途,是將動態形狀的程式專門用於靜態形狀。如果動態形狀的 StableHLO 程式具有正確的結構,則將其引數類型從動態形狀更新為靜態形狀,並執行這個傳遞作業,就會在程式中傳播靜態形狀。
這個傳遞會直接將結果的用法替換為運算元,並在整個程式中傳播靜態形狀,藉此移除 custom_call @shape_refinement_operand_wrapper
。
%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>
適用於形狀精修的模組必須具備下列屬性:
- 所有動態形狀都只依賴輸入形狀 (不會依賴輸入陣列內容的形狀)。我們將作業稱為
dimension
作業,這類作業只會間接依賴輸入形狀 (例如stablehlo.get_dimension_size
所提供的形狀),或是全域常數 (例如符號整數的解析值,即張量:A = 5)。所有維度值都可以透過跨程序常數折疊解析為常數。 - 中間函式可能會在引數清單的開頭接受多個符記引數 (類型為 !stablehlo.token),後面接著一些全域常數引數,這些引數是常數整數純量,例如符號整數的解析值 (即 tensor
: A = 5)。 - 部分中間函式可能會傳回全域常數的運算結果,例如 symint 值的
floordiv
。這些函式會在精修後只傳回常數值。這些函式會內嵌。 - 所有對單一函式的呼叫都會解析為相同的引數形狀,且不會進行遞迴 / 共遞迴函式呼叫。###
-vhlo-legalize-to-stablehlo
將 VHLO 合法化為 StableHLO。
-vhlo-to-version
在不同版本的 VHLO 之間轉換。
選項
-target : The target version. Must be a version of the form #.#.# .