Каковы различия между tf.fake_quant_with_min_max_args и tf.fake_quant_with_min_max_vars - PullRequest
0 голосов
/ 25 мая 2018

Я хотел бы понять различия между функциями тензорного потока

tf.fake_quant_with_min_max_args
tf.fake_quant_with_min_max_vars

Поскольку в их API они имеют почти одинаковое описание.Я обычно вручную квантую требуемые узлы через tf.fake_quant_with_min_max_vars, хотя я не уверен, что это правильно.

Должны ли, например, веса использовать tf.fake_quant_with_min_max_args?

Аналогично, глядя накод quantize.Quantize, я понимаю, что в основном он перебирает график, находит совместимые тензоры и добавляет узлы для идентификации / квантования в зависимости от global_step.Однако следует понимать, что не все операции квантуются (например, conv1d, хотя conv2d и mat / mul -).Будет ли библиотека поддерживать все операции в будущем?

1 Ответ

0 голосов
/ 03 июня 2018

Что касается именования, это немного неправильно.Вариант «args» использует атрибуты для выражения min / max и поэтому действителен только для фиксированных диапазонов.Варианты 'vars' принимают произвольные тензоры для min / max.Будь то действительные переменные или другое вычисленное значение, зависит от вашего подхода к квантованию.Варианты 'vars' имеют градиенты для их мин / макс и поэтому могут быть обучены.Многие подходы к обучению просто вычисляют их во время обучения, используя минимальную / максимальную партии, а затем накапливают их в необучаемые переменные, используя экспоненциальную скользящую среднюю.Затем, по прошествии времени, вместо вычисленных минимальных / максимальных значений используются переменные min / max.

При добавлении их вручную необходимо убедиться, что входные данные для всех арифметических операций (add, mul и т. Д.)но не транспонировать, изменять и т. д.) иметь подходящую опцию fake_quant * для тензоров, которые ему подаются.

На практике я нашел следующее правило:

  1. когда переменная веса подается в арифметическую операцию, добавьте fake_quant_with_min_max_vars, которая вычисляет его минимальное / максимальное значение из минимального / максимального значения веса.

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

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

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

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

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

Hth.

...