КПД – Telegram
2.84K subscribers
176 photos
6 files
369 links
Квантование & Прунинг & Дистилляция

Блог про сжатие сетей и не только.
От древнейших времен по настоящее время.
Download Telegram
Вчера наша статейка Accurate Compression of Text-to-Image Diffusion Models via Vector Quantization попала в подборку статей Daily Papers на 🤗 про диффузию, что большая честь для нашего скромного авторского коллектива из Yandex Research.

Так-то не то, чтобы 🚀 science - по существу перенесли AQLM на задачу text-2-image генерации с помощью диффузионнок с учетом специфики и нюансов диффузионных архитектур (плохой из меня бизнесмен).

Проверяли подход на SDXL и SDXL-Turbo. В целом, вышло сносно, получше скалярной квантизации по качеству (c Q-Diffusion, PTQ4DM в качестве бейзлайнов). В 4 бита удается даже достичь паритета по Side-by-Side с оригинальной fp16 моделью. Здесь уместно заметить, что SbS куда более репрезентативная и содержательная характеристика, чем все эти ваши FIDы и CLIP-скоры. 3-битные модели по метрикам почти не отличаются от fp16 по метрикам, но просадка качества налицо (не у всех есть толока за пазухой, справедливости ради).

С практической точки зрения пока есть над чем работать: имеет место замедление инференса на 50%, ибо в отличие от огромных LLM, SDXL/SDXL-Turbo малипусики c 2.5B параметрами, которые кроме того обрабатывают большие тензоры активаций за раз, а не токен за токеном, потому вычисления compute-bound, а не memory-bound. Процедура деквантизации начинает сказываться на времени прогона через сеть. Потому модельки пока не выкладываем. Нынче модный FLUX-1 выглядит более перспективным кандидатом для прогонки метода, там и трансформер с большими матрицами, и 12B параметров. Как руки дойдут, попробуем и его посжимать.

Кроме того, запилили еще симпатичный сайтик а-ля Nerfies (credits to @Vahe527887).
🔥19👍4
Обман года.

2023 - LK-99
2024 - Reflection
😁183
Во вчерашнем посте на Kali Novskaya была разобрана статья Can LLMs Generate Novel Research Ideas? - про то, насколько хорошо нынешние LLMки умеют в генерацию наукоподобных статей.

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

Отсюда возникает идея 🤔 - давать вступительный экзамен рецензентам Core A* конференций, где им будут даны несколько публикаций от кожаных мешков и сгененированных условной гопотой или Sonnet. Если рецензент не способен адекватно отличить зерна от плевел - отфутболиваем ⚽️.

Проблема правда одна: кто ж рецензировать то будет...

Хотя было бы интересно посмотреть на рецензию GPT-4 с системным промптом Reviewer N2 😈.
👍18
Есть просто банк, есть банк столбов и матриц, а есть банк оптимальных решеток для квантования данных из нормального распределения...

Если конректно, чуваки собрали MSE-оптимальные решетки для числа точек от 1 до 5000 для одномерного нормального распределения, и для всех размерностей от 2 до 10 и числа точек от 1 до 1450 для многомерной гауссианы (с нулевым средней и единичной матрицей ковариации).

Решетки были найдены через Lloyd-CLVQ algorithm.

Зачем оно надо? Если ваши данные нормально распределены, или вы можете каким-то образом привести их к этому виду, то такая квантизация при заданной битности будет оптимальной с точки зрения квадратичной ошибки.

[Сайт проекта]
🔥92👍1🤨1
EDEN: Communication-Efficient and Robust Distributed Mean Estimation for Federated Learning
[Статья] [Код]

Квантизовать можно веса, можно активации. А что еще можно?

Правильно, градиенты! 👻

И это очень даже нужно и полезно в контексте распределенной оптимизации.
Если обучение на многих хостах, а скорость передачи информации между серверами не очень высока, то на синхронизацию между процессами может уходить основная доля времени, а не на сами вычисления. Дабы уменьшить трафик можно сжимать 🗜 градиенты - прунить, квантовать - что душе угодно. При этом, само собой, хочется их не слишком испортить, иначе все обучение пойдет прахом.

Метод

Идея квантовать градиенты для распределенного не нова - датируется еще 2016 годом (QSGD). Но данная работа предлагает ряд интересных идей (некоторые из которых мы узнаем в литературе вышедшей позднее, а сама статья 2021 года).

1️⃣ Случайные повороты
2️⃣ Оптимальные решетки квантования
3️⃣ Случайный прунинг
4️⃣ Энтропийное кодирование

В тензоре значения могут быть распределены, вообще говоря, самым произвольным и поганым (с точки зрения удобства квантования) образом. Но, известно, что если “повернуть” тензор некоей случайной матрицей, то с большой вероятностью полученные значения будут распределены как N(0, sigma^2). В качестве случайных поворотов используют (кто бы мог подумать!) - случайные Адамаровы матрицы. Каждый процесс хранит seed генерации, а главный сервер, зная этот seed на деквантизации, может применить обратное преобразование.

Решетку квантизации (а тут дело идет о квантовании в 1 и 2 бита) надо выбирать с умом. Потому берут не абы какие, а MSE-оптимальные (для 1 бита находится аналитически, для 2-ух численно).

Дабы увеличить сжатие - можно еще случайным образом запрунить ☠️ часть весов. Маску передавать при этом не надо - она как и вращение задается состоянием случайного генератора.

Решетки квантизации можно еще дотюнить при заданном ограничении на битность посредством Entropy-Constrained Vector Quantization.

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

И вся эта кухня идет с теоретическими гарантиями на ошибку аппроксимации.

Эксперименты

Метод валидируют на синтетических распределениях и распределенном обучении. В качестве бейзлайнов рассматривают QSGD, Hadamard + SQ (Stohastic Quantization), Kashin + SQ. В качестве бенчей для распределенного обучения рассматривают EMNIST (с маленькой CNNкой) и Shakespeare (с LSTM). Не самые свежие и впечатляющие бенчи, но что поделаешь 😞.

EDEN наиболее точно приближает исходные данные (в сравнении с бейзлайнами), при этом по скорости не такой быстрый как QSGD, но быстрее Kashin + SQ (ближайший с точки зрения качества подход).

В 4 бита разницы вообще нет между EDEN и float обучением, в 2 и 1 бит появляется некий зазор в качестве, но не критичный, и EDEN стабильно лучше конкурентных подходов.

Вывод

Интересная с точки зрения математики и методологии статья. Кажется, что если бы публикация чуть дотерпела до тех времен (и у авторов был на то ресурс), когда квантовать LLMки стало мейнстримом предложенные идеи были бы обязательно применены в контексте сжатия LLM.
👍71🔥1🤯1
Fine-tuning LLMs to 1.58bit: extreme quantization made easy
[Блог] [Model card] [PR с добавлением BitNet в transformers]

Некоторое время назад здесь мы разбирали статью от мелкософта про BitNet-1.58, где авторам удалось завести QAT c тернарной квантизацией и добиться вполне сносного качества при обучении с нуля.

Лицехваты 🤗 недавно опубликовали весьма занятный и содержательный длиннопост про дообучение LLM в 1.58 (log2(3)) бит.

Метод и эксперименты

Напомню, что при тернарной квантизации каждый элемент тензора принимает одно из трех значений - {-1, 0, 1} и еще есть floating-point масштаб (вместо absmax берут среднюю абсолютную величину элемента тензора).

Дабы квантовалось лучше, перед каждым линейным слоем ставится LayerNorm, и это накидывает на предобучении.

При попытке наивно затюнить Llama-3-8B в BitNet сходимость по лоссу не сильно лучше, чем у случайно инициализированной модели, и авторы начинают копать глубже.

Тернарная квантизация это довольно болезненное надругательство над весами после которого сетке тяжело оправиться, потому авторы предлагают переходить к квантованной модели не сразу а интерполировать из fp16 состояния в квантизованное постепенно. Пробуют разные функции - степенную, экспоненциальную интерполяцию. Одна опция степенной в итоге завелась лучше всего.

Шаг обучения тоже пришлось основательно подбирать, чтобы выжать приемлемое качество. После подбора удачных гиперпараметров на коротких запусках, лучшую конфигурацию учат уже 100B токенов (0.6% бюджета обучения Llama-3-8B). Тем не менее, итоговая просадка по сравнению с исходной моделью довольно значительная.

Для маленьких LM (SmolLM 125M) разогрев (постепенная квантизация) не дает улучшений.

По бенчам просадки значительные по сравнению с fp16, но лучше чем у прошлых квантизаций в похожую битность. Сам протокол сравнения спорный 🤔, не у всех вариантов есть результаты, сравниваются перплексии разных версий Llama с разными словарями. Да и Llama-3 выбивает 65, а не 49 на MMLU 5-shot.

Авторы реализовали kernel для инференса на Тритоне, который дает некоторое ускорение. А с библиотекой BitBlas ускорение становится еще более заметным. Однако работа с ней требует небыстрой компиляции.

Вывод

Неплохой результат и исследование. Но есть вопросы 🙋‍♂️ к протоколу замеров качества, и пока BitNet теряет слишком много в качестве для того чтобы стать общепринятой практикой. Чтобы пользоваться модельками надо поставить версию transformers из PR.
👍3🤔1
Зальем чем-нить на ICLR и засядем за квантование.
Тока сначала надо раздобыть веса.
🔥12
VPTQ: EXTREME LOW-BIT VECTOR POST-TRAINING QUANTIZATION FOR LARGE LANGUAGE MODELS
[Статья][Код]

Пристегните ремни, а лучше прячьтесь в бомбоубежище 💣. Будет горячо 🔥.

На текущий момент, векторная квантизация является наиболее эффективным (с точки зрения качества) методом сжатия LLM (AQLM, AQLM+PV, QuiP#, GPTVQ). И ребяты из китайского 🇨🇳 отделения Мелкософта выкатили Yet Another Vector Quantization for LLM.

Метод

По существу метод представляет собой GPTQ с векторной (single- и multi- codebook) квантизацией с рядом нюансов:

1️⃣ Эффективной инициализацией центроид (векторов в кодбуках). Используют Hessian-weighted K-Means. Для полного Гессиана считать сложно и дорого, потому в этом месте прибегают в диагональному приближению. Подобное я в свое время заводил, когда работали с коллегами над SpQR и думали про неоднородную 1-мерную квантизацию.
2️⃣ Точность квантизации за счет повышения битности можно повысить за счет нескольких кодбуков. Используют Residual Quantization как в QuIP#, где новые кодбуки приближают ошибку квантования с прошлых шагов.
3️⃣ Outlierы. Находят outlierные колонки (входные размерности), которые выдают большую ошибку на выходе слоя и квантуют их отдельно. Часть без outlierов обрабатывается стандартным алгоритмом.

Далее прогоняется поблочный файнтьюн, как в AQLM/QuiP# и end-to-end дистилляция.

Результаты

Метод валидируют на моделях семейств 🦙-2, 🦙-3 и Mistral. В качестве бейзлайнов берут GPTVQ, AQLM, QuiP#.

И далее начинается самое интересное 😈)

Они применяют поблочный и end-2-end finetuning, как в QuIP# и обновленной версии AQLM, но при этом сравниваются со старой версией AQLM (а надо тогда с таблицей 4, где метрики на 7B и 13B примерно такие же, и немного даже лучше на 70B).

При сравнении скорости инференса разных подходов криво завели QuIP#, при этом мотивируя низкую скорость тем, что перемножение на Адамаровы матрицы требует O(n^2) операций, хотя любой детсадовец знает, что O(n log n).

Статья вышла в конце сентября, но про PV-tuning и QTIP , вышедшие в конце мая и июня, соотвественно, ни слова, как будто весть еще не успела дойти по Великому Шелковому Пути 🐫 в Поднебесную.

И вишенка 🍒 на торте 🍰 - отсутствие AQLM/QuIP# среди бейзлайнов мотивируют тем, что модели новые, никто не выложил, а самим впадлу и напряжно квантовать. На что можно тактично заметить, что AQLM модели лежат на хабе, и не просто лежат, а там еще есть и метрики, с которыми можно сравниться. Только одна беда - они несколько получше будут. Что делать, притворимся, что мы ничего не видели 🙈)

Моделей, кстати неплохо так выложили.
12😁8👍3
Лернинг Рейт, Бач Сайз и Вейт Декей звучат как отличные имена для героев фантастического романа.
😁291
За что большое уважение компании Meta, помимо многого прочего, так это за реально подробные и занимательные технические отчеты.

Техрепорты по 🦙-м были довольно содержательными и полезными, и, полагаю, во многом опредилили направления развития LLM, хоть и основывались по большей части на идеях из прошлых работ.

Отчет по MovieGen не уступает по качеству и полноте содержания техрепортам по Llama и может служить своего рода обзором (с рассмотрением и ablation) современных техник и достижений в области генеративных моделей.

Прекрасная работа, @asanakoy!
Сам бы у себя разобрал в серии постов, но лучше, чем причастный к созданию MovieGen, это никто не сделает)
👍19
Спрашивает народ - по какой-такой физике присвоили Нобелевскую премию Хинтону и Хопфилду?

Ну, смотрите, есть Физика языковых моделей. И вряд ли бы она появилась без трудов Хинтона и Хопфилда (Хинтона уж точно). А в самой премии не указано по какой конкретной физике надо её давать или не давать. Все формальности соблюдены.
😁26👎1😱1
Раз уж пошла такая гулянка - предлагаю дать Нобелевскую премию мира Суцкеверу за вклад в Ai Safety.

Или Юдковскому...
😁24💯7🔥31🤨1
😁24🌚8😱2👍1
Isomorphic Pruning for Vision Models
[Статья] [Код]
Введение

Полагаю, что уже немного помнят, но когда-то выбить SOTA или создать мега эффективную по параметрам/флопсам на ImageNet-1k было модно и престижно.

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

Метод

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

Каждому нейрону сопоставляется некий граф зависимости из входящих и выходящих в него ребер, кои погибнут, если выдернем нейрон. Собираем все изоморфные графы в соответствующие кучки (например с одинаковым числом входных/выходных ребер для прунинга нейрона из MLP) считаем для них некоторый importance score, и для тех у кого он меньше - выбрасываем.

Для случая трансформера естественные структуры следующие:
1️⃣ Внутренние каналы в MLP
2️⃣ Головы трансформера
3️⃣ Размерности голов трансформера
4️⃣ Размерность признаков во всей сети
Пробегаемся по всем возможным структурам и везде выбрасываем одну и ту же долю самых маловажных.

То, что получилось потом дообучаем дабы восстановить качество.

Эксперименты

Валидируют метод на ConvNext, DeiT, ResNet-ах и MobileNet-v2. В плане критерия не шибко парятся, берут просто |w dw| - модуль веса на градиент, посчитанный на 100 батчах из 64 сэмплов (не то, что я пол ImageNet-а пихал в свое время).

Прунят довольно агрессивно, в 1.5 - 4 раза, восстанавливаться надо достаточно долго и основательно, потому обучают 300 эпох с дистилляцией на RegNetY.

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

На DeiT и ConvNext стартуя с DeiT-Base/ConvNext-Base удается получить запруненные сети с лучшим качеством, чем Small- и Tiny- модели с тем же количеством параметров и FLOPs (т.е достичь Парето-оптимальности).

По качеству на процент-два превосходят в среднем бейзлайны из литературы.

Вывод

Нравится идея с ранжированием структур с одинаковой топологией, но такое ощущение, что хороший результат обусловлен преимущественно дистилляцией с длительным обучением. На LLMки, к сожалению, масштабировать будет тяжко простым смертным. Но всякие там NVIDIA могут позволить для условного Minitron.
👍8
Почему дают токены на всякую фигню, а не на o1...
😁16😭32
MaskLLM: Learnable Semi-Structured Sparsity for Large Language Models

[Статья] [Страница проекта] [Код][Пост на Machine Learning]

Введение

2:4 (она же semistructured sparsity) дает какое-никакое ускорение на GPU от Ampere и новее. Однако, просадка при прунинге обычно слишком велика для LLMок, дабы быть интересной на практике.

В этой статье предлагают метод обучения хороших 2:4 масок через Gumbel-Softmax.

Метод

Маска суть дискретная сущность потому ее просто так не отпизируешь градиентным спуском, и авторы предлагают моделировать распределение масок через Gumbel-Softmax с 6 = binom(2, 4) вариантам. На обучении оптимизируются логиты вероятности сэмплирования одного из вариантов масок (т.е маска есть взвешенная сумма возможных вариантов), а на инференсе берется наиболее вероятный. Обучение суть просто оптимизация кросс-энтропии (как на pretrain). Веса при этом заморожены.

Если какой-то вес зануляется или близок к нулю, то логиты маски почти не получают градиентов, потому авторы добавляют регуляризационный член как weight_decay, но со знаком , чтобы расталкивать веса от нуля, тем самым поддерживая не нулевую норму у немаскированных весов.

Кроме того, маски полученные условным SparseGPT/Wanda являются хорошей инициализацией для масок и позволяют чуть улучшить результат.

Эксперименты

Метод валидируют на 🦙-2, Nemotron-4 15B и двух маленьких проприетарных GPT-3. Замеряют по классике перплексию на Wikitext и 0-шоты.

По метрикам опережают уверенно все бейзлайны (SparseGPT, Wanda, Magnitude). SparseGPT, правда, можно завести и получше. В отличие от алгоритмов one-shot прунинга, которые быстро насыщаются от количества данных, MaskLLM продолжает улучшаться при большем и большем количестве данных, что неудивительно ибо это есть по сути метод оптимизации с большим количеством обучаемых параметров.

Ablations:
1️⃣ Инициализация маской от one-shot прунера накидывает в конечном качестве.
2️⃣ Достаточная степень стохастичности сэмплирования важна для хорошего качества, дабы модель могла “попробовать” разные варианты масок.
3️⃣ Анти-weight decay не то чтобы сильно, но улучшает качество.
4️⃣ Кроме того, полученную маску можно оптимизировать на downstream и даже временами оверфитнуться улучшить перплексию по сравнению с floating-point моделью.

Вывод

Вполне годная стратегия для обучения 2:4, но требующая определенных вычислительных затрат (т.е прилично дороже чем прогнать SparseGPT). Результат достойный, но все же просадка остается довольно заметной - больше чем у SOTA методов 2-битной квантизации. Вероятно, если еще оптимизировать веса вместе с масками - можно выжать больше.
👍62
Ребята из unsloth выкатили блог про раздебаг gradient accumulation.
[Пост на Love. Death. Transformers. ]

TL;DR - наивное усреднение батчей при gradient accumulation приводит к тому, что результат отличается от того, чтобы прогнать за один шаг большой батч. Причем, как утверждают авторы, лосс всегда больше. В стандартном способе вычисления кросс-энтропии есть деление на длину последовательности, и если они разные в разных микробатчах - результат усреднения будет не такой, как лосс на суммарном батче. Потому предлагается избавлятьcя от усреднения.

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

Можно подобрать контрпример. Пусть на первом батче лосс L_1 = 1, и в батче 4 токена, а на втором батче L_2=9 и 6 токенов.

Тогда усредненный лосс на всем батче:
(1 + 9) / (4 + 6) = 1
А при наивном gradient_accumulation:
1/2(1/4 + 9/6) = 0.875 (то есть меньше)
👍17
AlphaPruning: Using Heavy-Tailed Self Regularization Theory for Improved Layer-wise Pruning of Large Language Models
[Статья][Ридми, но код все равно нахрен не нужен]

Обсуждать по существу тут нечего, чисто поугарать.

Метод

Хотим мы прунить LLMки. Текущие методы сжимают слои равномерно.
Однако, одни слои могут быть чувствительнее других. Как эффективно распределить степени прореживания между разными слоями для максимизации качества? Вообще говоря, Хинтон его знает, но одна занятная тема выползет скоро на архив 😆. Часть авторов сего опуса годом ранее предложила OWL - Outlier Weighted Sparsity, где чувствительность слоев определялась на основе доли выбросов (процента весов, с активациями существенно отклоняющимися от среднего значения).

В этой же статье предлагают использовать коэффициент в законе убывания сингулярных значений матриц весов W. Логика такая - у случайных матриц закон (при иниализации весов элементами из i.i.d нормального распределения) убывания собственных значений есть Марченко-Пастур c ограниченным спектром, а степенная зависимость типа отвечает сигналу. Чем медленее убывание - тем типа больше сигнала. Потому матрицы с меньшей степенью предлагается сжимать слабее.

Задают некий порог минимальной и максимальной степени сжатия и распределяют степень сжатия между слоями в зависимости от того, насколько велик/мал коэффициент по сравнению с минимальным/максимальным по всем слоям модели.

Эксперименты

Стоял на дворе 2024 год, а ребята основную часть экспериментов делают на Llama-1 и Vicuna. Валидируют по сложившейся традиции на перплексии и 0-shots.

Отдельного внимания заслуживает утверждение:
Our empirical results show that AlphaPruning prunes LLaMA-7B to 80% sparsity
while maintaining reasonable perplexity, marking a first in the literature on LLMs.

При том что перплексия переваливает за 200 в лучшем случае, что на практике означает, что модель галлюцинирует чуть менее чем полностью на любой запрос.

Предложенный метод по качеству по перплексии несколько лучше Uniform, критериев, основанных на спектральной норме и норме Фробениуса, предложенного ранее OWL, но тем не менее просадки остаются весьма значительными (на уровне 1+eps битных квантизаций) при сжатии на 70%.

Есть результаты и на 🦙-3, которая почему-то называется LLaMA-V3-7B. Там просадки значительнее.

Еще и на ConvNext прогнали для разнообразия.

Найденные профили для LLM обычно следующие - пруним меньше первые блоки, сильнее - последние (за исключением самого последнего).

Вывод

Выглядит как использование некой взятой из воздуха характеристики матриц весов для оценки важности, без внятной мотивации. Тем не менее, в упорстве и умении себя хорошо подать авторам не занимать, потому их и взяли на NeurIPS. А вообще, прунить LLMки тяжело дается как-то по сравнению с квантизацией. В 4 бита просадка на простых бенчах почти и не видна, а 50% sparsity (сжатие в 2 раза) уже существенно ломает модель.
🤔3🤷‍♂1🤮1
Нейросеть многоловая по ГОСТу
😁13😢104👍2
Внимание - всему голова!
Attention is all you need
😁153