Чтобы обеспечить более высокую точность, большинство научных операций вычисляются с использованием типов с плавающей запятой. Наиболее распространенными являются 32-битный тип с плавающей запятой и 64-битный тип с плавающей запятой, а именно float32 и double64. Однако вывод без обратного распространения ошибки, в сети много неважных параметров, или для их представления не требуется слишком высокая точность.
Следовательно, квантование модели — это процесс преобразования весов, значений активации и т. д. обученной глубокой нейронной сети из высокой точности в низкую точность. Например, преобразование 32-битного числа с плавающей запятой в 8-битное целое число int8 и мы ожидаем, что после преобразования точность модели аналогична точности до преобразования.
Таким образом, в отрасли существует очень большой спрос на количественную оценку моделей.
Вообще говоря, какие данные модели будут иметь количественную оценку. В основном это следующие три. На практике возможно количественное определение многих или даже всех из них.
Большинство научных операций вычисляются с использованием типов с плавающей запятой. Наиболее распространенными являются 32-битный тип с плавающей запятой и 64-битный тип с плавающей запятой, а именно float32 и double64.
Существует множество вариантов количества битов квантования. Условно его можно разделить на несколько категорий:
Квантование в основном делится на автономное квантование: (квантование после обучения, PTQ) и обучение с учетом квантования (QAT). В статье 2019 года компания Qualcomm определила четыре уровня для моделей количественной оценки производства: как правило, мы чаще всего используем уровень 2 и уровень 3.
Как показано на рисунке ниже, квантование можно разделить на равномерное и неравномерное квантование.
Как показано на рисунке ниже, квантование также можно разделить на симметричное квантование и асимметричное квантование. Если значение нулевой точки остается неизменным до и после квантования, это называется симметричным квантованием. Однако в реальном процессе квантованные объекты распределены неравномерно и не обязательно симметричны по обе стороны от значения нулевой точки. Как показано в правой части рисунка ниже, значение нулевой точки до и после квантования различно. , которое называется асимметричным квантованием.
Как видно из приведенного выше введения, квантование на самом деле представляет собой процесс преобразования весов, значений активации и т. д. обученной глубокой нейронной сети из высокой точности в низкую точность и обеспечения того, чтобы точность не уменьшалась. Как переключиться с высокой точности на низкую? Установите взаимосвязь сопоставления данных между данными с фиксированной и плавающей запятой, аппроксимируйте непрерывное значение сигнала до конечного числа дискретных значений и добейтесь лучших преимуществ с меньшей потерей точности. Этот процесс отображения обычно выражается следующей формулой:
Q = round(scale factor * clip(x,α,β))+ zero point
В этой формуле: x представляет число, которое необходимо определить количественно, то есть объект квантования, который представляет собой данные с плавающей запятой. Q представляет собой квантованное число, которое представляет собой целочисленные данные. Формула включает в себя три операции: операцию округления, операцию обрезки и выбор масштабного коэффициента. А значения α и β, которые необходимо определить, являются верхней и нижней границей операции отсечения, называемой значением отсечения.
Нулевая точка представляет собой квантованное значение 0 в исходном диапазоне значений. В весе или активации будет много нулей (например, при заполнении или через ReLU), поэтому при квантовании нам нужно обеспечить точное представление действительного числа 0 после квантования.
Операция округления: на самом деле это отношение отображения, которое определяет, как сопоставить исходное значение с плавающей запятой с целочисленным значением в соответствии с определенными правилами. Например, мы можем выбрать принцип округления «при условии, что 5,4 имеет значение 5, а 5,5 — значение 6», или мы можем выбрать ближайшую левую вершину «5,4 и 5,5 имеют значение 5» или ближайшую правую вершину. принцип и т. д.
Операция обрезки: на самом деле это операция разрезания. Как выбрать диапазон этого количественного объекта. Почему нам следует выбирать этот диапазон? Потому что после квантования до n цифр квантованное целое значение, которое можно использовать для выражения, является фиксированным. Как нам лучше сопоставить исходную плавающую точку с такими ограниченными данными? распределение стоимости? Этот диапазон слишком велик (выбирайте по исходным максимальным и минимальным значениям, как показано на рисунке ниже. В этот раз, если в начале и в хвосте всего несколько значений с плавающей запятой, и они очень далеки). вдали от других значений (если в это время происходит равномерное квантование). Тогда дискретные значения α-α, β-β на рисунке могут быть потрачены впустую, поэтому ошибка, вызванная отображением значений с плавающей запятой к целочисленным значениямможет быть очень большим. Это значение — искусство. Если оно слишком велико, оно тратит биты. Если оно слишком мало, оно «вырежет» слишком много полезной информации.
Следовательно, различные текущие алгоритмы квантования и стратегии оптимизации часто ищут подходящее [α, β], чтобы уменьшить ошибки, вызванные операциями обрезки и округления.
Масштабный коэффициент: выражает пропорциональную связь между числами с плавающей запятой и целыми числами [разные формы квантования принимают разные значения]. Если это линейное равномерное квантование, то тогда
Подводя итог, можно сказать, что процесс квантования заключается в выборе соответствующих параметров квантования (таких как коэффициент масштабирования, нулевая точка, значение ограничения) и методов отображения данных, чтобы после того, как исходное значение с плавающей запятой преобразуется в целочисленное значение, попытайтесь сохранить точность от снижения (или, когда это возможно, дальность контроля).
В соответствии с различными диапазонами выбора параметров квантования модели степень детализации количественного анализа модели можно разделить на:
1. Трудности с несколькими бэкэндами
Реализация алгоритмов квантования на разных процессорах имеет разные характеристики. Для разного оборудования пользователям необходимо изучить разные схемы квантования оборудования. Это также приводит к ограниченному аппаратному обобщению схемы квантования. Так называемая аппаратная генерализация в основном относится к возможности миграции количественных моделей на общеаппаратные платформы.
2. Трудности аппаратного черного ящика
Количественное развертывание моделей часто сопровождается сложными работами по восстановлению точности модели, особенно при использовании стороннего оборудования, что требует решения проблемы его согласования со сторонним оборудованием. Однако в реальном процессе обслуживания решение по аппаратному выравниванию на битовом уровне является высшим приоритетом для развертывания услуг. Предоставляя среду моделирования для алгоритма квантования, алгоритм точного восстановления можно воспроизвести на аппаратном уровне. Общие аппаратные различия в основном возникают из-за обработки квантования невычислительных операторов (Concat, Eltwise), методов повторной выборки и округления аккумулятора.
3. Трудности количественного анализа ошибок
Квантование приведет к ошибкам в процессе вычислений, в результате чего точность развертывания сети потеряет некоторое выражение по сравнению с FP32. В реальном бизнесе основная проблема при развертывании заключается в том, как обеспечить точность количественной модели и обеспечить баланс между скоростью и точностью модели за счет уменьшения ошибок.
1. Как найти лучший метод сопоставления данных
Самый простой и грубый способ количественной оценки — округление. Методы округления для преобразования плавающей запятой в фиксированную: один — «Округление до ближайшего», то есть округление до ближайшего целого числа, другой — стохастическое округление, то есть с определенной вероятностью (пропорциональной расстоянию от точки округления вниз); ), чтобы определить, следует ли округлять вверх или вниз.
Обычно используемый алгоритм таков:
2. Учитывая обученную модель квантования, как найти оптимальные гиперпараметры квантования
Решение проблемы следующее: учитывая тензор, найдите подходящее [α,β], чтобы ошибки, вызванные операциями обрезки и округления, были меньше.
1. Метод количественной оценки модели PyTorch
Существует множество ссылок по внедрению методов количественной оценки модели Pytorch. Вот две рекомендуемые статьи, которые очень подробны и могут дать вам общую информацию.
Количественная оценка в Pytorch
https://zhuanlan.zhihu.com/p/299108528
Официальный количественный документ
https://pytorch.org/docs/stable/quantization.html#common-errors
Количественная оценка в Pytorch условно делится на три типа: динамическое квантование после обучения модели, статическое квантование после обучения модели и квантование, включенное во время обучения модели. Эта статья начинается с инженерного проекта (Pose. Estimation) представляет процесс статического квантования после обучения модели.
Конкретные количественные знания можно получить из двух рекомендуемых статей.
2. Подготовка к количественному процессу.
Среда выполнения кода: PyTorch1.9.0, Python3.6.4.
1. Загрузите набор данных (при выполнении статического количественного анализа вам необходимо вывести набор данных для получения характеристик распределения и калибровки данных), используйте набор проверки MSCOCO и выберите около 100 MSCOCO_val2017.
http://images.cocodataset.org/zips/val2017.zip
2. Файл модели Pytorch можно скачать здесь. Пароль для извлечения Pose_Model: s7qh.
https://pan.baidu.com/s/1nvml9pB
3. Загрузка кода квантования Pytorch_Model_Quantization
https://github.com/Laicheng0830/Pytorch_Model_Quantization
После загрузки кода, как показано выше, выберите 100 изображений из загруженного набора данных MSCOC и поместите их в каталог данных, а загруженный файл модели coco_pose_iter_440000.pth.tar поместите в каталог моделей.
pth_to_int.py преобразует модель float32 Pytorch в модель int8.
Загрузите модель int8 в Assessment_model.py для вывода.
3. Статическая количественная оценка модели
Основной код статической количественной оценки модели выглядит следующим образом. Прочтите модель float32, затем преобразуйте ее в модель int8 и сохраните как openpose_vgg_quant.pth. Полный код можно увидеть в файле pth_to_int.py. Что делает каждый шаг, подробно объясняется в комментариях.
Примечание. Прямой код квантованной модели был немного изменен, и квантование и деквантование необходимо вставлять до и после ввода модели. Пример:
Квантование и деквантование можно увидеть в строках 34–86 файлаpose_estimation.py.
Загрузка модели int8 не может быть такой же, как предыдущая загрузка модели float32. Модель необходимо преобразовать в количественную модель с помощью операций подготовки() и преобразования(), а затем в модель загружается load_state_dict.
На рисунке ниже показаны результаты после количественного определения.,общий损失不大。где размер модели200M->50M,Время работы модели5.7s->3.4s。общий,Размер модели сжат до 1/4 от исходного размера., Время работы модели сокращается примерно на 20%