Типы квантования в 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 и оценщику HLO .
Эти тестовые примеры ценны для:
- Проверка квантования StableHLO: обеспечение соответствия поведения квантования операций StableHLO ожидаемым результатам.
- Перекрестная проверка: сравнение поведения квантования StableHLO с другими реализациями или платформами.
- Отладка и разработка: помощь в разработке и отладке новых функций квантования или оптимизации.