tgoop.com/quant_prune_distill/281
Last Update:
QTIP: Quantization with Trellises and Incoherence Processing
[Статья][Кода нет, но обещают, что будетт]
Было очевидно, что после выхода обновленного AQLM и PV-tuning, что ответочка от конкурентов из Cornell University - это лишь вопрос времени. Тем более, что в issue в PEFT первый автор QuIP# дал ясно понять, что новый, более совершенный, метод квантизации скоро выйдет на свет.
И тихо, незаметно, так что сам я обнаружил лишь по чистой случайности, на архиве появилась статья и классическая репа с ридмишкой.
Метод
Векторная квантизация при той же битности точнее (если реализована не криворуко), чем скалярная. Раньше я думал, что данное явление обусловлено некоторыми корреляциями между измерениями, но на самом деле векторная квантизация работает точнее даже для последовательностей i.i.d (хорошее обьяснение здесь) . Чем больше группа - тем более высокой точности при заданном числе бит можно добиться потенциально. Однако, большие кодбуки становятся довольно обьемными и вносят нетривиальный вклад в общую битность (в AQLM 1x16 кодбуки накидывают ~0.3 дополнительных бит на параметр) и не влезают в кэш GPU.
В идеале бы хотелось иметь компактный кодбук и большие группы. И авторы QTIP (названного в честь рэпера?) прибегают к красивой идее из теории кодирования - trellis coding.
Обычно при кодировке последовательностей в L бит, каждый элемент может принимать любое из 2^L значений, и последовательность длины кодируется TL битами. Если представить последовательность в виде блуждания по графу, то граф полносвязный - из любой вершины можно прийти в любую другую.
В trellis coding (названном в честь архитектурной решетки), каждый узел графа (соответствующий одному из 2^L) значений соединен только с 2^k (где k<L) ребрами с другими вершинами. Последовательность кодируется как индекс начального узла и индексы ребер при блуждании по графу. Итого расход памяти L + (T-1)k, что может быть заметно меньше TL.
Однако, наивная реализация будет чрезмерно тяжеловесной для произвольного trellis при достаточно большом L и k, так как где-то надо хранить граф связей. Кроме того, декодирование для произвольного trellis - много последовательных операций, что непозволительно медленно на практике, и QTIP предлагает несколько хитрых идей, чтобы это работало эффективно.
Как и в QuIP/QuIP# квантуется не исходный вес, а обработанный случайным ортогональным преобразованием (Адамаровыми матрицами), так что элементы матриц близки к i.i.d нормальному распределению.
Далее, чтобы не хранить полный произвольный граф, авторы рассматривают специальный анзатц - bit-shift trellis, где связаны только вершины с индексами, отличающимися на битовый сдвиг. Однако, такой выбор слишком ограничителен, и авторы предлагают “перемешивать” связи некоторой хитрой случайной перестановкой и предлагают три метода:
1️⃣ 1MAD
2️⃣ 3INST
3️⃣ HYB
В первых двух случаях в качестве индексов в случайной перестановке выступает некоторое фиксированное преобразование использующее линейный конгруэнтный генератор случайных чисел и побитовые операции. А в третьем случае - некоторое обучаемое преобразование.
Для определения оптимальной конфигурации минимизируется ошибка на выходе слоя с помощью алгоритма Витерби (динамическое программирование).
Полученный метод выдает MSE ошибку близкую к минимально теоретически возможной.
BY КПД
Share with your friend now:
tgoop.com/quant_prune_distill/281