Стабильное квантование HLO

Типы квантования в StableHLO

Квантование — это метод оптимизации моделей машинного обучения путем преобразования чисел с плавающей запятой (например, тех, что использовались в исходных моделях) в целые числа меньшей точности. Это снижает использование памяти и ускоряет вычисления, делая модели более эффективными для развертывания на устройствах с ограниченными ресурсами.

Квантование StableHLO соответствует спецификации квантования LiteRT , используя единую схему квантования с поддержкой как потензорного, так и поосевого квантования. Он наследует выражение типа от диалекта Quant MLIR, обеспечивая стандартизированный способ представления квантованных типов данных.

Равномерное квантование отображает значения с плавающей запятой в целые числа с использованием одинакового размера шага, что приводит к равномерному распределению квантованных значений. Это достигается за счет аффинного соотношения с использованием двух ключевых параметров квантования.

Равномерное квантование упрощает представление чисел с плавающей запятой, отображая их в целые числа, расположенные на равном расстоянии друг от друга. Такое сопоставление достигается посредством аффинного преобразования, использующего два ключевых параметра: масштаб и нулевую точку . Масштаб определяет размер шага между последовательными квантованными значениями. Меньший масштаб означает, что квантованные значения расположены ближе друг к другу. Нулевая точка определяет целочисленное значение, которое представляет ноль в исходном пространстве с плавающей запятой.

Отношения между исходным значением с плавающей запятой ( real_value ) и квантованным целочисленным значением ( quantized_value ) при равномерном квантовании:

real_value = scale * (quantized_value - zero_point)

Тензорное квантование

При потензорном квантовании для всех значений в тензоре используются одна шкала и нулевая точка. Потензорный квантованный тип выражается в StableHLO как:

quant.uniform scale:zero_point>

Пример : !quant.uniform<i8:f32, 0.01:50>

Это представляет собой 8-битное целое число ( i8 ), используемое для хранения 32-битного числа с плавающей запятой ( f32 ), используя масштаб 0.01 и нулевую точку 50 .

Поосевое квантование

Поосевое квантование предлагает более детальный подход по сравнению с потензорным квантованием. Вместо использования единого масштаба и нулевой точки для всего тензора, поосевое квантование назначает отдельные шкалы и нулевые точки срезам вдоль определенного измерения quantized_dimension тензора. Это особенно полезно, когда значения значительно различаются по разным измерениям, что позволяет лучше сохранить информацию и повысить ее точность.

Рассмотрим тензор t с размерами [4, 3, 2] . Мы решили квантовать этот тензор по второму измерению ( quantized_dimension = 1 ). Это означает, что у нас будет три среза (поскольку второе измерение имеет размер 3), каждый со своим масштабом и нулевой точкой:

t[:, 0, :]: This slice gets scale[0] and zero_point[0].
t[:, 1, :]: This slice gets scale[1] and zero_point[1].
t[:, 2, :]: This slice gets scale[2] and zero_point[2].

В StableHLO квантованный тип по оси выражается как:

quant.uniform {scale0:zero_point0, scale1:zero_point1, ...}>

где длина scale:zero_point соответствует количеству срезов вдоль quantized_dimension содержащего тензора.

Пример : tensor<4x3x2x!quant.uniform<i8:f32:1, {0.2:20, 0.1:10, 0.3:30}>>

Проходы квантования в StableHLO

StableHLO предоставляет несколько проходов компилятора, которые позволяют выполнять различные преобразования и оптимизации, связанные с квантованием, что дает вам гибкость в работе с квантованными моделями. Эти пропуска:

stablehlo-legalize-qdq-to-quantized-op

Этот проход объединяет общий шаблон в квантованных моделях: операцию обратного квантования, за которой следует операция с плавающей запятой и, наконец, операция квантования, в одну операцию квантования. подробности

стабильный-легализировать-квантованный-оп-к-qdq

Этот проход делает противоположность предыдущему проходу. Он разлагает операцию квантования на эквивалентную последовательность операций деквантования, операций с плавающей запятой и операций квантования. подробности

стабильно-легализовать-квант-в-математику

Этот проход преобразует операции StableHLO с квантованными типами в эквивалентные операции с целочисленными типами. По сути, он реализует арифметику квантования с использованием стандартных математических операций. Это разложение полезно для систем, которые изначально не поддерживают квантование, но все же могут использовать арифметику квантования для выражения семантики квантованных моделей. подробности

стабильно-квант-легализовать-до-тоса-перемасштабировать

StableHLO предлагает возможность узаконить квантованные операции в их соответствующих представлениях на диалекте TOSA . Эта легализация облегчает совместимость и взаимодействие между StableHLO и TOSA. Этот проход стратегически преобразует квантованные операции StableHLO в комбинацию операций StableHLO и TOSA, при этом диалект TOSA в основном используется для операции rescale . Операция tosa.rescale играет решающую роль в настройке масштаба и нулевой точки квантованных значений, обеспечивая точное представление квантованных данных в рамках TOSA. подробности

tosa-rescale-legalize-to-stablehlo

Этот проход перезаписывает операции масштабирования TOSA на примитивные математические операции StableHLO. Один из основных вариантов использования этого прохода — позволить интерпретатору StableHLO оценивать программы, содержащие операции масштабирования TOSA. подробности

Оценка квантованных программ

Эталонный интерпретатор StableHLO может эффективно выполнять программы, содержащие квантованные операции. Чтобы добиться этого, сначала программа приводится к эквивалентному представлению, используя только целочисленные операции. Этот процесс понижения включает в себя серию проходов компилятора, которые преобразуют программу перед интерпретацией.

По сути, интерпретатор использует проход stablehlo-legalize-quant-to-math для преобразования квантованных операций в соответствующие им реализации целочисленной арифметики. В этом проходе представлены широковещательные операции CHLO для обработки масштабного умножения/деления и сложения нулевой точки. Чтобы обеспечить совместимость с интерпретатором StableHLO, эти операции CHLO затем узакониваются как операции StableHLO. Это вводит операции, связанные с формой, которые впоследствии канонизируются и оптимизируются с помощью серии проходов канонизации.

Полная последовательность проходов, участвующих в этом процессе опускания, следующая:

stablehlo-legalize-quant-to-math
chlo-legalize-to-stablehlo
canonicalize
shape-legalize-to-stablehlo
stablehlo-canonicalize-dynamism

Квантованные тестовые примеры

StableHLO предоставляет полный набор квантованных тестовых примеров для проверки правильности и поведения квантованных операций. Эти тестовые примеры служат модульными тестами, охватывающими различные операции StableHLO в квантовых сценариях.

Типичный пример квантованного тестового примера выглядит так:

func.func @main() -> tensor<11xf32> {
    %operand_0 = stablehlo.constant dense<...> : tensor<11xf32>
    %operand_1 = stablehlo.constant dense<...> : tensor<11xf32>
    %golden = stablehlo.constant dense<...> : tensor<11xf32>

    %0 = stablehlo.uniform_quantize %operand_0 : (tensor<11xf32>) -> tensor<11x!quant.uniform<i8:f32, 0.3>>
    %1 = stablehlo.uniform_quantize %operand_1 : (tensor<11xf32>) -> tensor<11x!quant.uniform<i8:f32, 0.3>>

    %2 = stablehlo.add %1, %0 : tensor<11x!quant.uniform<i8:f32, 0.3>>

    %result = stablehlo.uniform_dequantize %2 : (tensor<11x!quant.uniform<i8:f32, 0.3>>) -> tensor<11xf32>

    %4 = stablehlo.custom_call @check.eq(%golden, %result) : (tensor<11xf32>, tensor<11xf32>) -> tensor<i1>

    return %3 : tensor<11xf32>
  }

и включает в себя:

Эти тестовые примеры ценны для:

  • Проверка квантования StableHLO: обеспечение соответствия поведения квантования операций StableHLO ожидаемым результатам.
  • Перекрестная проверка: сравнение поведения квантования StableHLO с другими реализациями или платформами.
  • Отладка и разработка: помощь в разработке и отладке новых функций квантования или оптимизации.