-chlo-legalize-to-stablehlo

CHLO オペレーション フローから StableHLO オペレーションとシェイプ オペレーションへの移行を合法化

-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 オペレーションを静的オペレーションに正規化。

DynamicReshapeOp などの動的 StableHLO オペレーションを、対応する静的オペレーション(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 の非推奨に関する RFC(#2283)では、いくつかの冗長なオペレーションを削除することを提案しています。このパスは、これらのオペレーションを長期サポートされている同等のオペレーションに正当化することで、さまざまなコンパイル パイプラインでのこれらのオペレーションの削除の影響を評価するのに役立ちます。

オプション

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

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

(量子化解除、浮動小数点演算、量子化)パターンを StableHLO 量子化演算に統合

パターンを 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<...>' を使用して指定することも、パス作成メソッドに渡すこともできます。絞り込みの型リストには、絞り込まれる 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>

形状の微調整に有効なモジュールには、次のプロパティが必要です。

  • すべての動的シェイプは入力シェイプにのみ依存します(入力配列の内容にシェイプの依存関係はありません)。入力シェイプ(stablehlo.get_dimension_size で指定されたものなど)またはグローバル定数(シンボリック整数の解決済み値(テンソル : A = 5)など)にのみ伝播的に依存するオペレーションを dimension オペレーションと呼びます。すべてのディメンション値は、プロシージャ間定数フォールドによって定数に解決できます。
  • 中間関数は、引数リストの先頭に複数のトークン引数(タイプ !stablehlo.token)を取り、その後に、シンボリック整数の解決済み値(テンソル : A = 5 など)などの定数整数スカラーであるグローバル定数引数を指定できます。
  • 一部の中間関数は、グローバル定数(symint 値の floordiv など)の計算を返す場合があります。これらの関数は、精度を高めた後に定数値のみを返すことで示されます。これらの関数はインライン化されます。
  • 1 つの関数への呼び出しはすべて同じ引数シェイプに解決され、再帰関数呼び出しや共再帰関数呼び出しは行われません。### -vhlo-legalize-to-stablehlo

VHLO を StableHLO に正当化。

-vhlo-to-version

VHLO のバージョンを変換する。

オプション

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