-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, на соответствующие статические аналоги, такие как ReshapeOp, если все динамические элементы этих операций фактически постоянны.
Например, если операнд output_shape функции DynamicReshapeOp является постоянным значением, операцию можно преобразовать в ReshapeOp.
-stablehlo-convert-to-signless
Переход для преобразования IR в беззнаковые целые числа.
-stablehlo-create-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-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)
Подмножество составных элементов можно исключить из этого преобразования с помощью флага «исключение», например:
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
Легализуйте устаревшие операции, заменив их хорошо поддерживаемыми.
В RFC StableHLO v1.0 Opset Deprecations (#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.
Преобразуйте программы StableHLO, используя типы UniformQuantized, в семантически эквивалентные целочисленные математические операции.
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 до запуска уточнения формы.
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 с динамической формой имеет правильную структуру, то обновление типов ее аргументов с динамических фигур на статические и выполнение этого прохода приведет к распространению статических фигур по всей программе.
-vhlo-legalize-to-stablehlo
Легализовать VHLO в StableHLO.
-vhlo-to-version
Преобразование между версиями VHLO.
Параметры
-target : The target version. Must be a version of the form #.#.# or 'current'.
, -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, на соответствующие статические аналоги, такие как ReshapeOp, если все динамические элементы этих операций фактически постоянны.
Например, если операнд output_shape функции DynamicReshapeOp является постоянным значением, операцию можно преобразовать в ReshapeOp.
-stablehlo-convert-to-signless
Переход для преобразования IR в беззнаковые целые числа.
-stablehlo-create-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-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)
Подмножество составных элементов можно исключить из этого преобразования с помощью флага «исключение», например:
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
Легализуйте устаревшие операции, заменив их хорошо поддерживаемыми.
В RFC StableHLO v1.0 Opset Deprecations (#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.
Преобразуйте программы StableHLO, используя типы UniformQuantized, в семантически эквивалентные целочисленные математические операции.
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 до запуска уточнения формы.
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 с динамической формой имеет правильную структуру, то обновление типов ее аргументов с динамических фигур на статические и выполнение этого прохода приведет к распространению статических фигур по всей программе.
-vhlo-legalize-to-stablehlo
Легализовать VHLO в StableHLO.
-vhlo-to-version
Преобразование между версиями VHLO.
Параметры
-target : The target version. Must be a version of the form #.#.# or 'current'.