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

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

Подробный обзор деталей реализации квантования в фреймворках машинного обучения

Совместно с Нарешем Сингхом.

Содержание

  • Введение
  • Что означают термины “масштаб” и “нулевая точка” в квантовании?
  • Типы схем квантования
  • Примеры масштаба и нулевой точки для квантования
  • Квантование и нормализация активации
  • Заключение
  • Ссылки

Введение

На протяжении остальной части этой статьи мы постараемся ответить на следующие вопросы с помощью конкретных примеров.

  1. Что означают термины “масштаб” и “нулевая точка” в квантовании?
  2. Какие существуют различные типы схем квантования?
  3. Как вычислять масштаб и нулевую точку для различных схем квантования?
  4. Почему нулевая точка важна для квантования?
  5. Какие техники нормализации пользуются преимуществами квантования?

Что означают термины “масштаб” и “нулевая точка” в квантовании?

Масштаб: При квантовании диапазона чисел с плавающей запятой обычно представляют диапазон чисел с плавающей запятой [Fmin..Fmax] в квантованном диапазоне [Qmin..Qmax]. В этом случае масштаб – это отношение диапазона чисел с плавающей запятой к квантованному диапазону.

Пример вычисления масштаба будет показан позже.

Нулевая точка: Нулевая точка в квантовании представляет собой представление числа с плавающей запятой 0.0 в квантованном диапазоне. Конкретно, нулевая точка – это квантованное значение, и оно представляет число с плавающей запятой 0.0 для всех практических целей. Мы рассмотрим, как она вычисляется с примерами позже, а также почему такое представление является практически интересным для нас.

Теперь давайте рассмотрим основные схемы квантования, используемые на практике, и ознакомимся с тем, в чем их сходства и различия.

Типы схем квантования

При рассмотрении типов квантования, доступных для использования при сжатии модели, существует 2 основных типа, из которых можно выбрать

  1. Симметричное квантование: В этом случае нулевая точка равна нулю – т.е. 0,0 диапазона чисел с плавающей запятой равно 0 в квантованном диапазоне. Обычно это более эффективно вычислять во время выполнения, но может привести к снижению точности, если диапазон чисел с плавающей запятой неравномерно распределен вокруг числа с плавающей запятой 0.0.
  2. Афинное (или асимметричное) квантование: В этом случае нулевая точка имеет ненулевое значение.

Но прежде чем мы углубимся в детали, давайте попытаемся определить, что означает нулевая точка.

Примеры масштаба и нулевой точки для квантования

Начнем с очень простого примера и постепенно разберем его.

Пример 1: Симметричное квантование uint8

Допустим, мы хотим отобразить диапазон чисел с плавающей запятой [0,0..1000,0] в квантованный диапазон [0..255]. Диапазон [0..255] – это набор значений, которые могут поместиться в беззнаковое 8-битное целое число.

Для выполнения этого преобразования мы хотим пересчитать диапазон чисел с плавающей запятой так, чтобы выполнялось следующее:

Число с плавающей запятой 0,0 = Квантованное 0

Число с плавающей запятой 1000,0 = Квантованное 255

Это называется симметричным квантованием, потому что число с плавающей запятой 0,0 квантовано 0.

Таким образом, мы определяем масштаб, который равен

Где,

В данном случае, масштаб = 3.9215

Для преобразования из числа с плавающей точкой в квантованное значение, мы можем просто разделить число с плавающей точкой на масштаб. Например, число с плавающей точкой 500.0 соответствует квантованному значению

В этом простом примере, 0.0 из диапазона чисел с плавающей точкой соответствует точно 0 в квантованном диапазоне. Это называется симметричной квантовкой. Давайте посмотрим, что произойдет, если это не так.

Пример 2: Аффинная квантовка uint8

Предположим, мы хотим отобразить диапазон чисел с плавающей точкой [-20.0 .. 1000.0] в квантованный диапазон [0 .. 255].

В этом случае у нас есть другой коэффициент масштабирования, так как наше xmin отличается.

Давайте посмотрим, какое число с плавающей точкой 0.0 представлено в квантованном диапазоне, если мы применим коэффициент масштабирования к 0.0

Ну, это не совсем верно, потому что, согласно диаграмме выше, мы ожидали, что число с плавающей точкой -20.0 будет соответствовать квантованному значению 0.

Здесь вводится понятие нулевой точки. Нулевая точка действует как смещение для смещения отмасштабированного значения числа с плавающей точкой и соответствует значению в квантованном диапазоне, которое представляет число с плавающей точкой 0.0. В нашем случае нулевая точка является отрицанием отмасштабированного представления числа с плавающей точкой -20.0, то есть -(-5) = 5. Нулевая точка всегда отрицание представления минимального числа с плавающей точкой, так как минимум всегда будет отрицательным или нулем. Мы узнаем больше о том, почему это так в разделе, который объясняет пример 4.

Всякий раз, когда мы квантуем значение, мы всегда добавляем нулевую точку к этому отмасштабированному значению, чтобы получить фактическое квантованное значение в допустимом диапазоне квантования. Если мы хотим квантовать значение -20.0, мы вычисляем его как отмасштабированное значение -20.0 плюс нулевую точку, то есть -5 + 5 = 0. Таким образом, квантованное(-20.0, масштаб=4, нулевая_точка=5) = 0.

Пример 3: Аффинная квантовка int8

Что произойдет, если наш квантованный диапазон является знаковым 8-битным целым числом, а не беззнаковым 8-битным целым числом? Теперь диапазон составляет [-128 .. 127].

В этом случае, -20.0 в диапазоне с плавающей точкой соответствует -128 в квантованном диапазоне, а 1000.0 в диапазоне с плавающей точкой соответствует 127 в квантованном диапазоне.

Способ вычисления нулевой точки состоит в том, что мы вычисляем ее, как если бы квантованный диапазон был [0 .. 255], а затем смещаем его на -128, так что нулевая точка в новом диапазоне равна

Следовательно, нулевая точка для нового диапазона равна -123.

До сих пор мы рассмотрели примеры, где диапазон с плавающей точкой включает значение 0.0. В следующем наборе примеров мы рассмотрим, что происходит, когда диапазон с плавающей точкой не включает значение 0.0.

Важность значения 0.0

Почему важно, чтобы значение с плавающей точкой 0.0 было представлено в диапазоне с плавающей точкой?

При использовании свертки с заполнением, мы ожидаем, что граничные пиксели будут заполнены значением 0.0 в наиболее распространенном случае. Поэтому важно, чтобы 0.0 было представлено в диапазоне с плавающей точкой. Аналогично, если значение X будет использоваться для заполнения в вашей сети, вам необходимо убедиться, что значение X представлено в диапазоне с плавающей точкой и что квантование об этом знает.

Пример 4: Неизвестная история – смещенный диапазон с плавающей точкой

Теперь давайте посмотрим, что происходит, если 0.0 не является частью диапазона с плавающей точкой.

В этом примере мы пытаемся квантовать диапазон с плавающей точкой [40.0 .. 1000.0] в квантованный диапазон [0 .. 255].

Поскольку мы не можем представить значение 0.0 в диапазоне с плавающей точкой, нам нужно расширить нижний предел диапазона до 0.0.

Мы видим, что некоторая часть квантованного диапазона теряется. Чтобы определить, сколько, давайте вычислим квантованное значение, к которому отображается значение с плавающей точкой 40.0.

Таким образом, мы тратим диапазон [0 .. 9] в квантованном диапазоне, что составляет около 3,92% от диапазона. Это может значительно повлиять на точность модели после квантования.

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

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

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

Далее давайте посмотрим, как нормализация активации помогает с квантованием модели. Мы сосредоточимся на том, как стандартизация значений активации позволяет нам эффективно использовать весь квантованный диапазон.

Квантование и нормализация активации

Нормализация пакета/слоя изменяет тензор активации таким образом, чтобы у него было нулевое среднее и единичная дисперсия на канал или слой.

Предположим, у нас есть входной тензор с диапазоном с плавающей точкой [2000.0 .. 4000.0]. Вот как будет выглядеть квантованный диапазон.

Мы наблюдаем, что половина квантованного диапазона [-127 .. -1] не используется. Это проблематично, поскольку мы квантуем весь диапазон с плавающей точкой, используя только 7 из доступных 8 бит. Это неизбежно приведет к большей ошибке квантования и снижению точности модели. Чтобы решить эту проблему, давайте применим нормализацию слоя к тензору активации.

После применения нормализации слоя к тензору активации, тензор активации будет иметь диапазон с плавающей точкой [-2.0 .. 2.0]. Это можно представить в диапазоне знаковых целых чисел int8 [-128 .. 127]. Чтобы обеспечить симметрию распределения, мы ограничиваем диапазон квантования [-127 .. 127].

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

Заключение

Мы рассмотрели, что такое аффинная (асимметричная) и симметричная квантование и в чем их различия. Мы также узнали о том, что такое масштаб и нулевая точка и как их рассчитывать для обоих типов схем квантования.

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

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

Все изображения в этой статье созданы автором(ами).

Ссылки

  1. Efficient Deep Learning Book, Глава 2: Введение в техники сжатия
  2. Hugging Face: Квантование
  3. TensorRT: Квантование
  4. Neural Network Distiller: Квантование
  5. Lei Mao: Квантование
  6. Квантование чисел с плавающей точкой