1.4K subscribers
74 photos
3 files
187 links
Квантование & Прунинг & Дистилляция

Блог про сжатие сетей и не только.
От древнейших времен по настоящее время.
Download Telegram
После долгой борьбы с инфраструктурой, богами Хаоса и Разрушения, удалось-таки квантизовать AQLM-ом и дообучить PV-алгоритмом меньшие версии 🦙-3.1.

1️⃣ ISTA-DASLab/Llama-3.1-8B-AQLM-PV-1Bit-1x16-hf
2️⃣ ISTA-DASLab/Llama-3.1-8B-AQLM-PV-2Bit-1x16-hf
3️⃣ ISTA-DASLab/Llama-3.1-8B-Instruct-AQLM-PV-1Bit-1x16-hf
4️⃣ ISTA-DASLab/Llama-3.1-8B-Instruct-AQLM-PV-2Bit-1x16-hf

70B в процессе. Самая интересная из 🦙, безусловно , 405B, но пока развлекаемся с тем, как поместить сие жирное чудище на машину)
Мы настолько тормозили, что Instruct 2-битную модель люди из community выложили раньше нас. Любопытно. откуда такое разночтение в метриках для исходной модели.

Если конкретно:

По нашим замерам неквантизованная Llama-3.1-Instruct выдает 68.17% точности в среднем на MMLU.
А квантизованная AQLM в 2 бита и зафайнтьюенная нами PV модель - 59.17%. То есть просадка у нашей модели меньше, но и бейзлайн выше)
[ишшуя на гитхабе]

В webui накатили квантизованные версии недавно нашумевшей FLUX.1[dev].

1️⃣bnb nf4 (4 c небольшим бит на параметро)
2️⃣fp8 (если считать fp8 квантизацией)

В зависимости от железа (рассматривается случай GPU от Ampere и новее) и версий pytorch/cuda bnb nf4 быстрее от 1.3 до 4 раз. Так как модель довольно здоровая, 12B параметров, то трансфер памяти, по всей видимости играет существенную роль. Кроме того, после недавних обновлений bitsnandbytes (0.42-0.43) скорость матричных операций (bnb.matmul_4bit) сильно выросла.

Кроме того, утверждается, что ошибка квантизации nf4 даже меньше (благодаря более адаптивной квантильной квантизации) чем у fp8 (e4m3fn/e5m2).

Далее пост содержит обсуждение хаков, как эффективно запускать FLUX на винде и примеры генераций.
Кроме того, в свежем pr (отличная работа @galqiwi !) в bitsandbytes добавили классы Embedding4bit, Embedding8bit.

В современных LLMках идет тренд на рост размера токенизатора, и недавняя работа (пост на эйай ньюз), показывает, что это даже положительно влияет на качество вдобавок к уменьшию длин последовательностей. Для экстремально сжатых моделей (в 1 и 2 бита) эмбеды и lm_head занимают значительную долю в суммарном обьеме памяти на хранение модели.

В недавней issue показано, что эмбеды можно сжимать в 4 бита простой bnb квантизацией без просадки, а lm_head в 8 бит (в 4 с небольшой просадкой).

Данное обновление весьма полезно для дальнейшего движения в сторону экстремального сжатия и посадки LLMок на мобилки.
How Fireworks evaluates quantization precisely and interpretably
[Блог]

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

Главные выводы и предписания следующие:

1️⃣ Trade-off между степенью сжатия и качеством определяется конечным приложением. Не существует универсального предписания для всех задач, что, мол, во столько раз можно сжать с умеренной просадкой в качестве, а дальше нельзя.
2️⃣ Использование KL-дивергенции для оценки степени расхождения квантизованной модели от исходной.
3️⃣ Не полагаться на точность на стандартных бенчмарках, а диверсифицировать протокол замеров

По первому пункту, вывод довольно логичен. Некоторые задачи (function calling) менее чувствительны к ошибкам, чем другие (code generation), где один косячок, и весь дальнейший вывод сыпется как домино. Перплексия тоже плоха, так как ниже у моделей с низкой энтропией, но не всегда более точных.

Ссылаясь на свежую работу от Microsoft Accuracy is not is all you need, авторы заявляют, что точность на бенчах - довольно шумная метрика оценки качества. Может быть так, что исходная модель где-то ошибалась, а квантизованная случайно стала предсказывать нужный токен. И прирост качества (скорее всего мизерный) обусловлен случайностью, а не тем, что модель “стала лучше”.

KL-дивергенция между сжатой и несжатой моделью предлагается в качестве альтернативы точности на наборе задач, как устойчивая к шумам. Если конкретно, предлагается генерировать несжатой моделью (forced generation), и смотреть, насколько различаются вероятности следующего токена предсказанные fp моделью и квантизованной. Кроме того, еще можно смотреть на token rejection rate - насколько отличается выбор top N токенов (N=16 в дальнейшем) между двумя моделями.

Ниже под квантизацией подразумевается переход от fp16 к fp8 (братве явно завезли баржу с H100). Рассматривают 4 уровня квантизации (по возрастанию степени сжатия):

1️⃣ Квантизуем только MLP без первого и последнего блока трансформера
2️⃣ Квантизуем все веса
3️⃣ Квантизуем вдобавок еще KV-cache
4️⃣ Квантизуем attention (K, V?) на prefill

Точность на MMLU просаживается немонотонно, уровень 2 даже оказывается “лучше” fp16 на тютельку. KL-дивергенция же монотонно растет со сжатием.

Далее авторы смотрят еще на ряд задачек из HELM-Lite - GSM8k, NaturalQuestions, WMT-2014 и другие, сравниваясь с другим известным провайдером - together.ai . Что fireworks, что together выдают качество близкое к fp16 при инференсе в fp8 (а то и лучше некоторых задачах), но fireworks якобы чуть лучше.

Однако, радоваться рано, говорят авторы из fireworks.ai. Нужен замер на чем-то как можно более похожем на людские предпочтения на том-же lmsys. Alpaca-Eval слишком маленький и не использует современные методы промптинга, потому предлагают смотреть на Arena-Hard-Auto от создателей lmsys. fp8 модели от fireworks и together будто бы чуть хуже fp16 на 🦙-3.1-405B, но не статзначимо.

Выводы

Вопрос оценки качества LLMок довольно нетривиален, ввиду того, что современные модели умеют решать широкий круг задач, и сложно объять всю полноту возможных задач и областей знания. Академические бенчмарки из нескольких задач и замеров перплексии на паре датасетов хороши для статей (здесь и ваш покорный слуга согрешил), но не всегда удовлетворительны для реальных приложений и запросов пользователя. Потому следует полагаться не на чужие обещания, а самому всю тщательно прощупывать 🧐.
Как сделать text2image модель, которая по SbS бьет Midjourney?

1️⃣ Учишь модель, которая хоть иногда лучше Midjourney
2️⃣ Собираешь большой набор промптов
3️⃣ Прогоняешь Side-by-Side comparison
4️⃣ Отбираешь промпты, где ваша модель бьет Midjourney
5️⃣ Утверждаешь, что на внутреннем бенче добился победы над MJ
6️⃣ Stonks!
On the Impact of Calibration Data in Post-training Quantization and Pruning
[Статья][Лаконичный ридми]

Введение

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

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

И в этой работе, авторы исследуют вопрос влияния калибровочных данных на качество data-aware методов сжатия LLMок.

Метод

Берутся 2 метода квантизации
1️⃣ GPTQ
2️⃣ SpQR (я польщен 😇)
И 2 метода прунинга
1️⃣ SparseGPT
2️⃣ Wanda

Модели квантизуют в 4 бита (SpQR в ~4.5 по факту), и прунят в 2:4 sparsity.

В качестве калибровочных данных рассматривают следующие источники:
1️⃣ C4 (бессмертная классика)
2️⃣ CNN-DM (новости, длинный текст хорошего качества, именно текст, не сами новости)
3️⃣ RedPajama
4️⃣ RefinedWeb
5️⃣ Wikipedia (английская)

Отовсюду берут 128 сэмплов длины 2048, как в статье GPTQ.

Качество замеряют на десяти 0-shot бенчах.

Берут 9 моделей:
1️⃣ Llama-1 (7B, 13B, 33B)
2️⃣ Vicuna, полученные из 🦙 выше
3️⃣ OPT (6.7B, 13B, 33B)
Результаты и наблюдения

1️⃣ Точность может сильно различаться между разными подвыборками из одного датасета.
2️⃣ Есть более и менее шумные задачи. BoolQ и RTE показывают наибольшую дисперсию.
3️⃣ Одни датасеты лучше других. В среднем RefinedWeb показывает лучшее качество, а Wikipedia худшее, но разброс значителен - между моделями и методами и нет четкого ранжирования.
4️⃣ Прунинг сажает качество моделей сильнее, потому и влияние данных более заметно, по всей видимости. Разброс для SparseGPT больше (ожидаемо, так как SparseGPT не только прунит, но и обновляет оставшиеся веса).
5️⃣OPTы более чувствительны к выбору данных, чем парнокопытные модели
6️⃣ Качество быстро насыщается с количеством калибровочных примеров для всех методов, кроме SparseGPT. (по нашим наблюдениям, чтобы выжать максимум из качества пара тысяч последовательностей все же нужна).
7️⃣ SparseGPT лучше Wanda (хотя исходная статья утверждала обратное). Логично, ибо Wanda есть де-факто кастрированный SparseGPT.

Выводы

Мораль сей басни такова - подбирайте калибровочные данные осмысленно. Полезное исследование, но чувствуется, что для полноты картины нехватает более сложных задач и других областей (математика, код), как и более свежих моделей.
В более свежей работе, кстати, утверждают, что данные вообще не важны, и случайные последовательности работают якобы так же хорошо (за исключением OPT).

Но кажется, что авторы набагали где-то...
Compact Language Models via Pruning and Knowledge Distillation
[Статья][Код есть, хоть это поначалу и не очевидно]

Введение

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

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

Подданые кожаной куртки выпустили запруненные версии Nemotron-15B под названием Minitron-4B и Minitron-8B, которые по качеству якобы конкуретноспособны текущей SOTA в легком весе.

Метод

У трансформеров можно прунить:
☠️ Целые блоки (про что был обзор некоторое времчя назад)
☠️ Размерность признаков (был у вас d_model - 768, стал 512)
☠️ Головы в Attention
☠️ Внутреннюю размерность MLP

Первый метод про прунинг в глубину, а остальные про ширину.

Для оценки важности используются критерии, основанные на активациях:
⭐️ Средний attention по голове (при прунинге головы)
⭐️ Средняя активация по каналу (для MLP)
⭐️ Средняя активация LayerNorm (для оценки важности признаков)

Для прунинга в глубину смотрят на среднее косинусное расстояние между входом и выходом блока и изменение перплексии при выкидывании блока.

Рассматривают оценку важности one-shot, когда выкидываем все за раз, или итеративно, по чуть-чуть.

Далее выбирают некоторое (около 20) число конфигураций сжатых моделей с целевой степенью сжатия, сжимают модели и дообучают на 1.8B токенов. Берется самый перспективный кандидат и дообучается уже на ~100B токенов. Немало, но все же на 2 порядка меньше, чем у современных LLM.

На дообучении рассматривают сумму следующих лоссов:
1️⃣ Кросс-энтропию (исходный лосс)
2️⃣ KL-дивергенцию на логитах с несжатой моделью
3️⃣ L2 лосс между промежуточными признаками (так как сжатая модель может быть уже, есть матрица переводящая в размерность учителя)
Результаты

Качество замеряют на широком круге бенчей (всякие MMLU, Arc, Winogrande, HumanEval, …) и MT-Bench, IFE-Eval.

Основные выводы следующие:
1️⃣ Сжимать большую модель, дешевле чем обучать новую. На том же числе токенов хрен вы получите тоже же качество с нуля.
После дообучения нет разницы между one-shot и итеративным сжатием.
2️⃣ В ширину сжимать эффективнее, чем в глубину. (блоки прунятся хуже, чем каналы)
3️⃣ Базовый лосс не нужен, используйтк только дистилляционный.
4️⃣ Итеративная оценка важности не накидывает после дообучения кандидатов.
5️⃣ Если глубина уменьшена, дистилляция промежуточных признаков важна, иначе хватает только логитов.
6️⃣ Прунить лучше модель, как можно ближе к целевой по размеру (логично)
7️⃣ Короткое дообучение (1.8B токенов) дает более надежных кандидатов моделей для дальнейшего дообучения.
8️⃣ Если нужна instruct модель, лучше запрунить instruct модель, чем base и дообучить на инструкциях.

Minitronы выдают качество не хуже других Open-Sourcr моделей +/- того же размера:
⭐️ 8B как Llama-3-8B и Qwen-2
⭐️ 4B как Phi-2 и Gemma-2-it (только безлайны поменьше будут)

Конкурентные методы сжатия, поверх других моделей (Sheared-Llama, LLM-Pruner) сильно уступают).

Вывод

Структурированный прунинг - перспективная стратегия сжатия LLM, если есть ресурсы. Сильно не хватает экспериментов с квантизацией - комплиментарны ли оба подхода, или прунинг усложняет квантизацию?
типичный Area Chair и рецензенты
https://ok.ru/video/37602200235
SpinQuant: LLM quantization with learned rotations
[Статья][Код]

Если в названии статьи встречаются вместе Spin и Quant - это наверняка что-то из области физики. Но нет, это снова про квантизацию LLM

Ранее в ряде работ (QuIP, QuIP#, QuaRot) было показано, что поворот на случайную ортогональную матрицу сильно облегчает квантизацию.

И в этой работе ребята из Meta предложили развитие идеи, дающее лучшее качество на Weight + Activation (+cache) квантизации.

Метод

Наличие выбросов в отдельных каналах активаций сильно затрудняет квантизацию (так как per-channel квантизация обычно не поддерживается в железе). Ортогональные матрицы “размазывают” выбросы в весах и активациях между каналами, так что все активации имеют примерно один и тот же порядок. Но конкретный выбор ортогональной матрицы имеет значение.

Авторы замечают, что качество сильно варьируется от конкретного выбора матриц, если сэмплировать их произвольным образом (и редко бывает достаточно хороших).

Случайные Адамаровы матрицы из QuIP гораздо лучше, но все разброс существенен и нет гарантий на оптимальность.

Потому предлагается искать “хорошие” матрицы поворота с помощью оптимизации на Stiefel многообразиях, параметризующих ортогональные матрицы. Оптимизация представляет собой градиентный спуск на многообразии. А именно Кэли SGD.

Есть 4 места куда можно вкрутить поворот:
R1 - В residual перед Attention и FFN
R2 - Между V и O матрицами в Attention
R3 - В Query/Key
R4 - Между активацией в FFN

Первые два поворота можно влить в параметры модели без изменения выходов модели, последние же придется считать на каждом прогоне. Потому предложенная процедура оптимизации применяется для поиска оптимальных R1, R2 матриц. А в случаях R3, R4 используют дешевые Адамаровы матрицы, кои практически не замедляют работу LLMки и почти ничего не весят.

Для оптимизации используют небольшой набор из Wikitext-2.

Результаты

Процедура оптимизации матриц занимает час с небольшим на меньших представителях семейства 🦙 на 8 A100 и полдня для 70B моделей.

Замеряют по классике качество на перплексии и 0-шотах.

Рассматривают 3 сценария:
1️⃣ Weight only quantization
2️⃣ Weight + activation quantization
3️⃣ Weight + activation + KV cache quantization

По качеству операжают бейзлайны (ближайший QuaRot примерно на 1% в среднем). В Weight-only quantization где-то бага при замерах AQLM и QuIP#, ибо эти методы сжимают модели почти без просадки (если верить бенчам, а не здравому смыслу) почти без просадки.

Метод работает как с RTN (Round-to-nearest), так и c GPTQ.

Важны все матрицы, но большой прирост дает будто бы добавление R4 - вращение внутри FFN.

Вывод

Квантизация весов/активаций и кэша в 4 бита на текущий момент, наверное, то что дает самое большое ускорение инференса на современных GPU, потому и представляет значительный практический интерес. И улучшение качества - это хорошо. При квантизации активаций (и кэша) просадки все еще значительные и есть куда улучшаться.
Please open Telegram to view this post
VIEW IN TELEGRAM
Если гитхаб и гитлаб заблочат, телегу с функционалом чатов можно использовать в качестве альтернативы)

⭐️ Сообщения с файлами - коммиты.
⭐️ Разные чаты - разные ветки.
⭐️ PR - пересылка файлов из одного чата в другой.

Прямо как в старые добрые времена на заре систем контроля версий.
Из Double blind review

Вы пока полайкайте, а я потом шутку придумаю...
[bibtex-tidy]

Наткнулся в интернетах на офигенную тулзу для наведения красоты в bibtex.

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

Кроме того, можно красиво отформатировать все (как black), отсортировать в алфавитном, так что любо-дорого будет глядеть.
Когда собираешь свои статьи в один диссер
GIFT-SW: Gaussian noise Injected Fine-Tuning of Salient Weights for
LLMs

[Статья] [Код]

Введение

PEFT и квантизация - два понятия, которые за последние пару лет стали неразрывно связаны с большими языковыми моделями, особенно в контексте обучения и инференса в условии ограниченных ресурсов. И в сегодняшнем эфире будет сказ про немного необычное сочетание этих идей в работе от ребят из Cколтеха, AIRI и Вышки.

Метод

Вкратце напомню, что суть PEFT в до-обучении небольшого (по сравнению с размером исходной модели) числа параметров. Эти параметры могут быть как адаптерами к весами (как LoRA, DoRA, OFT), кои можно (или нельзя) влить в модель, а могут быть некоторым подмножеством весов исходной модели. Второй вариант еще называется в литературе Selective Finetuning и про него сегодня пойдет речь.

Метод основан на двух основных идеях:
1️⃣ Определении “чувствительных” весов, которые, с одной стороны не квантуются, а с другой являются тем самым подножеством обучаемых параметров.
2️⃣ Добавлении “шума” в процесс обучения.

Наличие выбросов в весах, затрудняющая квантизацию, известная особенность LLM (временами оспариваемая), и потому для улучшения качества их обычно держат в исходной точности. В данном случае, следуя LLM.int8() и QUIK выбросы определяются как уровне колонок матриц весов (входных размерностей). В качестве метрики берутся комбинации вида:

s_i = || D_i || ||X_i||_{\rho}^{\gamma}

Где \rho - норма весов в колонке, а \gamma - степень - {-½, 1, ½}.
D_i - это пертурбация весов, и в качестве пертурбации рассматривается операция квантования (скалярные однородная симметричная).

Выбросы, для которых значение данной метрики самое большое - не квантуются.

Градиентный спуск с шумом, примененным к весам до или после шага градиентного спуска, как известно из литературы, помогает избегать седел и плохих оптимумов, повышает устойчивость. В данной работе шум применяется до шага SGD.

Итоговый метод выглядит следующим образом:

Квантизуем с помощью GPTQ все веса, за исключением “выбросов”. Затем до-обучаем через обычный бэкпроп эти колонки, а оставшимся весам добавляем нормальный i.i.d шум с std равным шагу квантизации.

Рассматриваются 3 стратегии:
1️⃣ Pre-GIFT-SW - сначала учим с шумом и выбросам, типа готовим модель к квантизации, а затем квантизуем
2️⃣ Salient FT - квантизуем и до-обучаем только “выбросы” без шума
3️⃣ Post-GIFT-SW - квантизуем и до-обучаем “выбросы” с шумом
Эксперименты

Эксперименты проводят на Llama-2,3 (7B, 8B, 13B). До-обучают на инструкциях TULU2 и OpenOrca. Обучение идет 500 шагов (т.е довольно короткое). “Выбросы” определяются на основе 500 сэмплов из Pile. Для оценки качества берут среднюю точность на 5 бенчмарках из lm-eval.

Есть 2 сценария:

1️⃣ Instruction-finetuning fp16 моделей. В качестве бейзлайнов рассматривается файтьюн всей модели, и LoRA/DoRA адаптеры с примерно тем же количеством обучаемых параметров. Непонятно, однако, какой шаг квантизации для шума в данном сценарии (если есть).

2️⃣ Квантизация (в 2/3/4 бита) + Instruction-finetuning. В качестве бейзлайнов берут QUIK + LoRA, и STE, где “выбросы” обучаются обычным бэкпропом, а квантизованные веса через STE. Я только не понял, QUIK без или с квантованием активаций? Больно уж грустно смотрится.

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

При квантизации предложенный метод опережает QUIK и STE. Правда, есть более свежие и сильные бейзлайны - QuaRot и SpinQuant.

Из ablation study следует, что:
👉 Добавление шума во время до-обучения накидывает в качестве при квантизации в 2 бита.
👉 Большой разницы нет при разных опциях метрики определения выбросов. L∞ работает чуть лучше в среднем.
👉 Pre-GIFT-SW немного лучше при 4 битном сжатии, но при более аггресивном сжатии уступает альтернативам. При квантизации в 2 бита Post-GIFT-SW дает лучшее качество.

Вывод

Интересно, и неплохо по результатам. Сравнение с адаптерами, я бы рекомендовал перепроверить - не “шумят” они так на до-обучении. Еще любопытно, помогает ли добавление шума при до-обучении статистик квантования в методах типа PEQA и P-tuning (без V).