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

Блог про сжатие сетей и не только.
От древнейших времен по настоящее время.
Download Telegram
🦙-3.1 стала доступна широкой публике!
[Пост на meta]
[Model card на GitHub]
[Коллекция на 🤗]
[Пост на gonzo-ml]
[Пост на эйай ньюз]
[Пост на Love.Death.Transformers]

К версиям 8 и 70B добавилась жырная 405B.

Из основных фичей:
1️⃣ Мультиязычность (English, German, French, Italian, Portuguese, Hindi, Spanish, and Thai)
2️⃣ 128k окно контекста
3️⃣ Обрезка знаний по декабрь 2023.
4️⃣ Умеет с тулами работать

Обучалось на 15T+ (неизвестно насколько+) токенов из публичных как-то собранных данных.

Базовые меньшие модели иногда, кста , просаживаются по сравнению с v3 по метрикам, но instruct стабильно лучше.

Большая модель вполне себе бодается с GPT-4-Omni и Claude-3.5-Sonnet.

Посмотрим, что выдаст lmsys арена)

На хабе есть и FP8 версии)
Боль...
Кванты Llama-3.1 уже появились на хабе.

На текущий момент выложены:

1️⃣ AWQ-INT4, GPTQ-INT4 квантизации Llama-3.1-405B-Instruct
2️⃣ BNB-NF4 квантизация Llama-3.1-405B
2️⃣ AWQ-INT4 квантизация Llama-3.1-70B
4️⃣ AWQ-INT4, BNB-NF4 квантизации Llama-3.1-8B-Instruct

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

INT4 требует 203 Gb VRAM для 405B модели, а BNB-NF4 220 Gb.
vLLM совместно с NeuralMagic регулярно проводят так называемые Office Hours, где рассказывают о новых фичах в релизах vLLM и проводят туториалы по пользованию своими либами, сжатию и ускорению моделек.

В частности, заслуживают внимания:
1️⃣ Туториал по квантизации с vLLM (выступает мой соавтор Eldar Kurtic).
2️⃣ FP8 и с чем его едят.

В общем, рекомендую)
На свет появился еще один стартап про генеративное ИИ - Black Forest Labs (помните Черный Лес из Облы 😄?).

Чуваки привлекли 31M$ инвестиций, и в дело включились такие серьезные люди как Timo Aila и Vladlen Koltun.

Команда выпустила семейство моделей FLUX.1 из трех моделей:
1️⃣ Проприетарной [pro], доступной через их API и на replicate.ai
2️⃣ Открытой [dev] с 12B параметрами
3️⃣ Открытой [schell] тоже с 12B параметрами, но нацеленную на генерацию в малое число шагов (1-4), по всей видимости дистиллированную из [dev] c помощью adversarial diffusion distillation.

Утверждают, что по ELO score бьют open-source и closed-source модели типа MJv6, SD3-Ultra, Ideogram.

Сами модели по себе представляют DiTы, обученные на flow matching.

Модель умеет генерировать изображения разного разрешения с разными aspect ratio.

Техрепорт обещают выложить в будущем.

Веса моделей на 🤗:
1️⃣ FLUX.1-dev
2️⃣ FLUX.1-schnell

Гитхаб проекта
После долгой борьбы с инфраструктурой, богами Хаоса и Разрушения, удалось-таки квантизовать 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