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