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

Блог про сжатие сетей и не только.
От древнейших времен по настоящее время.
Download Telegram
TerDiT: Ternary Diffusion Models with Transformers
[Статья][Код инференса]

LLMки не квантовал за последние год-два только ленивый, потому назрело время осваивать и другие ниши. Квантование диффузионных моделей на текущий момент пока не столь исследовано, как LLMки, в связи с тем, что сами модели не доросли до своих собратьев из NLP, потому и не было столь острой необходимости. Тем не менее, прогресс не стоит на месте, и стоит быть готовым к дальнейшему масштабированию диффузионных тушек.

В рассматриваемой статье авторы перенесли метод тернарной квантизации (quantization-aware-training) QAT из BitNet1.58 на DiTы для class-conditional генерации на ImageNet. Квантуют только веса (активации остаются в исходной точности).

Метод

По существу ничего нового по сравнению с BitNet1.58, веса обучаются через straight-through estimator (STE) с большим learning rate.

Единственное нововведение - нормализация на выходе AdaLayerNorm. Авторы обнаружили, что тернарные веса выдают большие активации, и scale/shift/gate модуляции слишком велики, чтобы сетка могла нормально сходиться. Навешивание RMSNorm на конец MLP для получения модуляций решает проблему.

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

Метод валидируют на DiTах двух размеров - с 600M параметров (примерно как DiT-XL из оригинальной статьи) и 4.2B параметров - на class-conditional генерацию на ImageNet 256x256.

По метрикам, тернарная 4.2B модель примерно равна DiT-XL, 600M несколько хуже. То есть для большой модели близкое качество к floating point модели при чуть меньшем общем размере модели (параметров больше в 7 раз, бит на параметр ~10 меньше, чем в fp16). Справедливости ради, стоит заметить что TerDiT обучался меньшее число итераций по сравнению с моделью из статьи фейсбука.

С инференсом немного грустненько 😢 получилось. Для работы с тернарными весами берут кернелы из HQQ и деквантизуют на ходу. Квантованные модели медленнее 😱 fp32 на 20-25%, а при опущенном сравнении с fp16 замедление было бы порядка 3 раз. Зато неплохая экономия по памяти. 4.2B моделька есть 3Gb видеопамяти на пике при инференсе.

В приложении еще зачем-то показывают что существующие 4-битных квантизации ломают полностью DiT. Берут, правда SmoothQuant, который в отсутствие квантования активаций, вырождается в round-to-nearest (RTN), т.е самый наивный и грубый метод, при существовании куда более сильных PTQ методов для диффузии (Q-Diffusion, PTQ4DM).

Вывод

С одной стороны, очередное подтверждение того, что тернарный QAT как-то да работает. Однако результат куда скромнее того, что получили для LLM майкрософты, и с таким замедлением инференса вряд ли интересен практикам. Неизвестно, масштабируется ли он на случай более сложной задачи text-2-image генерации. Тем не менее деятельности представляет определенный интерес, и развитием эффективных алгоритмов QAT, вероятно, тернарные модели вполне могут быть около Парето-оптимальными. Во всяком случае, в некоторых приложениях.
👍73
💰 Не проплаченной рекламы пост.

Хочу порекомендовать канал То Шо Нейросети.

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

В частности, внимания заслуживает недавняя ветка постов про Liquid Neural Networks 💧.
И реализация Мамбы 🐍 с нуля.
10🔥1🥰1
BitsFusion: 1.99 bits Weight Quantization of Diffusion Model
[Статья][Ридми]

Yet another свежая статья про экстремальную квантизацию диффузионок от Snap Research. Утверждают, что 2-битная модель даже лучше 😱 исходной. Если у вас завалялся старый игровой ПК, года так 2007, можно его не выбрасывать, а генерить картинки стейбл диффузией 😅.

Метод

По существу предложенный метод представляет собой QAT (квантизейшн эвер трэйнинг) с mixed-precision квантизацией и дистилляцией.

Каждый слой квантуется в 1️⃣, 2️⃣, 3️⃣ бита, или не квантуется вовсе. В прошлых работах было показано, что диффузионные модели очень чувствительны к сжатию timestep проекций, обуславливающих на текущий шаг расшумления. Поэтому следуя стандартной практике их не сжимают. Авторы анализируют чувствительность разных слоев к сжатию, замеряя MSE с картинкой сгенерированной оригинальной моделью и CLIP Score, при квантовании слоев по отдельности и замечают, что данные две метрики не всегда скоррелированны. В частности, сжатие слоев в cross attention слоях не сильно так сильно влияет на MSE, но при этом временами ломает семантику изображения. Shortcut свертки очень важны.

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

Min-Max стратегия по определению масштабов квантования не учитывает наличие выбросов в распределении весов, поэтому авторы применяют Lloyd-Max итеративный алгоритм для минимизации ошибки. Кроме того, важно учитывать симметрию весов относительно нуля и явно накладывать ее.

Далее авторы дообучают 👨‍🏫 квантованную модель.

На первой стадии сжатая модель пытается воспроизвести выход и промежуточные активации учителя. Авторы отмечают, что важно учитывать classifier-free guidance, используемый при инференсе. Распределение шагов сэмплирования смещено в область где ошибка квантизации больше (поздние шаги диффузии).

На второй стадии модель учится на noise prediction, как самая обычная диффузионка.

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

Берут SD v1.5 модель и учат 20к шагов на первой стадии, и 50к на второй на некотором проприетарном датасете. Замеряют CLIP Score и FID на MS-COCO, TIFA, GenEval и пользовательские предпочтения на PartiPrompts.

Сжатая модель после второй стадии по метрикам примерно равна несжатой.

На SbS (side-by-side сравнении) на Parti Prompts BitsFusion модель побеждает SDv1.5 с win rate 54.4% против 45.6%. Странно, что SbS, который самый показательный, учитывая несовершенство текущих генеративных метрик, скромно запрятан в приложение.

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

Вывод

Довольно хороший инженерный результат, использующий сочетание разных идей. Разве, что без специализиованного железа вряд ли удастя выжать ускорение. Однако, вызывает , почему была выбрана SD v1.5, хотя статья свежая, и уже почти как год существует SDXL. Можно ли их так же легко сжать? Полагаю, что хорошее качество еще во многом обусловлено тем фактом, что загадочный проприетарный датасет неплохо отфильтрованных и дообучение несжатой модели могло бы ее тоже улучшить, ибо SD v1.5 училась на довольно шумных данных из LAION.
👍103🔥3
Оценивать интеллект по IQ-тестам это как оценивать качество изображений по FID.
🤡15👍8🥴63🤔1
Про релиз SD3 Medium.
"Добрые люди кровопролитиев от него ждали, а он Чижика съел!"

Обсуждение на Reddit

По всей видимости, выложили pretrain чекпоинт до всяких RL-файнтьюнов.
2😢1
😁16
В процессе случайного блуждания по интернетам наткнулся на занятный блог от некоего Итона Эпперли, аспиранта в Калтехе по специальности прикладная и вычислительная математика.

В частности, у него есть весьма годные посты по разным вопросам из линейной алгебры (разреженным и низкоранговым матрицам), теории вероятностей (Марковские цепи 🔗, случайные 🎲 алгоритмы в линейной алгебре).

Есть концептуальные посты:
- Low-rank
-
FFT
И более специфичные
- Don’t Use Gaussians in Stochastic Trace Estimation

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

В общем, любителям прикладной математики рекомендую!
👍13🤯3🙈2🗿2
[Блог Nvidia][пост на addmeto]

Пока все находятся в томном ожидании релиза 🦙-3 400B Nvidia сделали ход конем и выкатили семейство здоровенных херовин.

Знакомьтесь - Nemotron-4!
Идет в трех комплектациях:
1️⃣Base - претрейн
2️⃣Instruct - дообучение на инструкциях
3️⃣Reward - reward model для RL alignment, обученная поверх Base

Предобучалось оно на 9 триллионах токенах из 50+ человеческих языков и 40+ языков программирования.
Для alignment использовали набор из 20к инструкций, который выложили в открытый доступ.
Контекст коротковат по современным меркам - всего токенов, небось больше не лезло во время обучения 😅.

Скоры на бенчах весьма достойны. На свежей ArenaHard от lmsys уступают лишь свежим версиям чат-гопоты и Клод Опус. На lmsys arena было бы еще интересно глянуть Elo Score.

Ну и самая интересная деталь - размер 340B параметров, т.е 640Gb на одни лишь веса в fp16. Как вы ее будете инферить - это ваша проблема)

Задача экстремальной квантизации уже не вместить LLMку именно на consumer-grade GPU, а хоть на какую-то)

Но зеленым, конечно, спасибо за такой вклад в опенсорс)
👍26🍾3👏2
Бог создал слабые и сильные методы сжатия, но файтьюн уравнял их.
😇13😁3😱1
Прунинг LLM в глубину

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

Ниже приведен разбор нескольких статей, посвященных одной и той же теме - depth pruning. Так как задача и мотивация у всех статей общая, то и введение дедуплицированное, общее для всех работ.

Введение

При структурированном прунинге веса отбрасываются не поодиночке, а группами - поканально, поголовно 🗿 (трансформерно поголовно), иногда даже весь слой целиком отправляется в царство Аида ☠️. Структурированный прунинг хорош тем, что явно уменьшает размерности матриц и тензоров в операциях, потому дает неплохое ускорение на разнообразном железе и движках. Увы, серьезного сжатия без серьезной просадки в качестве обычно сложно достичь без серьезных вложений в дообучение.

Трансформеры содержат skip-connection как в Attention, так и в MLP. Residual type архитектуры, как было замечено еще давно , являются в некотором смысле ансамблями, где конечный выход можно воспринимать как агрегацию знания от нескольких неглубоких экспертов. Одна голова хорошо, две лучше, еще больше - еще лучше, но и иногда и пары специалистов достаточно. Потому есть основания полагать, что прунинг в глубину - прореживание целых блоков - имеет шанс завестись и сжатая модель будет выдавать адекватную точность.
👍11
Shortened LLaMA: A Simple Depth Pruning for Large Language Models
[Статья][Код]

Первая статья в хронологическом порядке и с открытым исходным кодом.

Метод

Хотим мы, значится, выбрасывать блоки целиком - но какие брать?
Авторы рассматривают 3 критерия
1️⃣ Среднюю величину весов (Magntude pruning)
2️⃣ Taylor (не Свифт, а норму градиента на вес, вдв кароч)
3️⃣ Изменение перплексии при выкидывании каждого блока по отдельности
В первых двух случаях временами выпиливаются первые и последние блоки, которые оказываются позарез важными, поэтому предлагается убрать их рассмотрения.

Чтобы восстановить качество модели после сжатия, навешивают LoRA на то, что выжило и дообучают на небольшом количестве данных.

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

Берут LLama-1 и Vicuna-7B, 13B. Для калибровки (оценки важности блоков) берут 10 последовательностей длины 128 из BookCorpus, и потом дообучают на Alpaca.

Предложенный метод не хуже, а то и лучше LLM-Pruner и структурированный Wanda (где критерием важности параметра выступает норма веса на норму активации).

Просадка при 20% прореживания заметная, но все же довольно умеренная. На малых степенях сжатия лучше всего работает критерий по градиенту умножить на вес, при запрете на отбрасывание первых четырех и последних двух блоков, при больших - оценка важности по перплексии.

Файнтьюн с LoRA неплохо восстанавливает метрики после сжатия, особенно с увеличением степени сжатия. Тем не менее разрыв между исходной моделью и сжатой все еще существенен (просадки больше, чем при SOTA 2-битной квантизации).

Данных требуется совсем немного для калибровки, качество существенно не меняется если взять больше, чем 10 примеров. Запрещать сжимать для Taylor и Magnitude первые и последние блоки важно - иначе перплексия взлетает до нескольких тысяч.

Комментарий

Метод прост и логичен. Однако просадка, на самом деле несколько больше, чем декларируется. На собственных замерах с lm_eval=0.4.0 поверх дообученных чекпоинтов (26 блоков против исходных 32) замерил просадку в 3% по сравнению с исходной моделью.
👍41
ShortGPT: Layers in Large Language Models are More Redundant Than You Expect
[Статья][Нет кода]

Метод

Трансформерные блоки, как известно обладают аддитивными skip connections следующего вида (для простоты изложения забьем на нормализацию):

x = x + attn(x)
x = x + mlp(x)


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

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

Результаты

Так как работа от китайских коллег, то замеряют качество как на Llama-2, так и на Baichuan. Для оценки качества используют стандарнтые 0-шоты, MMLU и CMMLU.

Предложенная метрика выбирает блоки ближе к концу сети (но не самые последние).

Результаты бенчмарков вызывают вопросы, утверждается, что качество на MMLU почти не просаживается вплоть до 28% sparsity, при этом перплексия на wikitext2 возрастает довольно заметно. При таких значениях обычно сеть с трудом два слова связать может, не то что решать задачи на логику). lm-eval-harness нигде не цитируется. По всей видимости используют какой-то иной или самописный фреймворк.

Безлайны - методы структурированного прунинга в ширину, естественно, бьют. С ShortenedLLama, вышедшей чуть раньше, не сравниваются.
👍5
The Unreasonable Ineffectiveness of the Deeper Layers
[Статья][Нет кода]

Метод

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

Как и в ShortenedLlama для восстановления качества сжатой модели дообучают с LoRA. И дообучение называется лечением (healing 🚑).

Результаты

Замеряют качество языкового моделирование (вместо перплексии смотрят на изменение кросс-энтропии) и MMLU/BoolQ. Рассматривают Llama-2, Mistral, Phi-2.

Кросс энтропия просаживается, но неплохо лечится после файнтьюна.

Результаты на MMLU вызывают большие сомнения 🤔 - спад качества имеет скачкообразный характер. По личным наблюдениям спад MMLU довольно монотонный, постепенный и коррелировал с ростом перплексии. Утверждается, что некоторые модели можно сжать до 40% без просадки на этом бенчмарке.

Далее смотрят на корреляцию признаков в разных блоках. Наибольшая корреляция (наименьшее расстояние) в блоках ближе к концу, согласуясь с наблюдениями из двух прошлых работ. Отсюда предлагают простое правило - пруньте блоки с конца, исключая последний, и типа хорошо работает.
👍3👀1
Your Transformer is Secretly Linear
[Статья][Пост в телеге][Пост на Хабре][Код]

Интересное релевантное исследование от коллег из AIRI/Сколтеха. Кратко, ибо все хорошо и доступно изложено самим автором в постах в телеге и на Хабре.

Метод

Оказывается, что активации трансформера в соседних блоках связаны почти что линейным преобразованием. В качестве меры линейности используется linearity score, который по существу является r2 (коэффициентом детерминации) . Сам по себе факт не столь удивителен, ибо норма skip-connection обыкновенно значительно больше преобразования в attn/mlp. Но даже если вычесть skip connection выделяется явная линейная и нелинейная компонента.

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

Исходя из наблюдений, предлагается прунить самые “линейные” слои, а для восстановления качества заместо запруненного блока учится линейный слой. И такой адаптер неплохо восстанавливает качество.

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

Рассматривают большое число открытых моделей - от GPT-2 (когда-то OpenAI был действительно открытым), Bloom до свежих Phi-3.

Рост линейности имеет место для всех моделей и задач. Прирост качества от регуляризации хоть и невелик, но все же заметен. Интересно, насколько он будет иметь место на большом масштабе?

Несколько нетипичный сетап замера перплексии - короткие последовательности вместо обычно используемого 2к/4к контекста (как на обучении), но общая суть от сего не меняется.
6👍1🔥1
Вывод

Трансформеры, вероятно, являясь в каком-то смысле ансамблем, устойчивы, как печень, к ампутации крупных кусков. Однако просадки (там где результатам можно доверять - первая и последняя работа), все же значительны при степени сжатия более 20%. Как ни крути, scaling laws существуют не просто так, и представления, выученные разными блоками, хоть имеют и разную полезность, но все же содержат в себе релевантное знание, хоть для какого-то входа. Отсюда и успех контекстуальных методов сжатия, вроде Deja Vu и PowerInfer.
19
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 ошибку близкую к минимально теоретически возможной.
1
Эксперименты

Метод валидируют на 🦙-2, 3, и в качестве бейзлайнов выступает QuIP# и AQLM первой версии. С PV-tuning не сравниваются, шельмецы 👺, хоть и лежит он на архиве 3 недели с их публикации) Квантуют группами 16x16 (число весов по входной и выходной размерности) с L=16, и Q=9 (гиперпараметр в обучаемом гибридном коде). Разные битности отличаются числом ребер k из каждой вершины.

Метод демонстрирует выдающееся качество даже без какого-то дообучения, в 4 бита почти без просадки, а в 2 бита почти на уровне AQLM и QuIP# c end-to-end finetuning (жулики в FT репортят цифры AQLM только с блочным файтьюном 😈 ).

С полноценным файнтьюном (дообучение знаков в Адамаровых матрицах и параметров HYB преобразования) метод вырывается далеко вперед при низких битностях от QuIP#/AQLM. Неупомянутый PV-tuning работает несколько лучше на меньших моделях - 7(8B), 13B, и сравнивается на 70B (используя, правда, больше данных и вычислений).

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

Скорость инференса (замеряют на RTX4090) на уровне QuIP#. Сравнение с AQLM полная шляпа 🎩, чуваки, небось коряво поставили либу для инференса, либо что еще наворотили, ибо tokens/s в нашей статье (на более медленной RTX3090) куда больше.

Выводы

Несмотря на корявое сравнение с AQLM, в общем и целом, конкуренты проделали отличную работу. Здорово, когда красивые идеи из математики находят применение на практике. Кажется, что стоит реально засесть за ботанье 👨‍🏫 матана и чтение статей из 80-х)
👏12👍4
Accelerating Neural Network Training with Semi-Structured (2:4) Sparsity
[Блог]

Торч недавно выкатил блог, где показывает, что 2:4 sparsity паттерн может быть полезен не только для инференса, но и на стадии обучения модели.

Напомню, что 2:4 sparsity - это когда из 4 подряд идущих весов 2-нулевые. Начиная с Ampere нвидиевские GPU имеют поддержку такого формата. Веса хранятся в виде сжатого вдвое тензора и еще есть тензор индексов элементов.

Ранее было показано, что такой паттерн выдает ускорение 10-30% по сравнению с fp16 на инференсе, но чтобы добиться эффективного обучения необходимо учесть еще ряд нюансов.

Обучение с фиксированной маской работает не очень, и нужно ее обновлять по ходу дела чтобы не просесть по качеству. Наивный kernel слишком медленный и по порядку величины близок к времени forward пасса. И заслуга авторов в разработке эффективной процедуры прореживания.

1️⃣ На обратном проходе при подсчете градиента участвует не W, W.T, которая вообще говоря не 2:4. Авторы ограничивают паттерн прореживания так, что 2:4 паттерн имеет место как для W, так и для W.T (прореживая блоки 4x4). Еще есть нюанс в том, что на уровне железа реализовано умножение sparse матриц на dense, но не наоборот. Потому предлагается считать транспонированное умножение, а затем его транспонировать. В cuSPARSELt есть опция выбирать индексирование в памяти как по колонкам, так и по столбцам, что позволяет иметь непрерывное расположение элементов в обоих случаях.

2️⃣ Потоки CUDA считывают за раз по 128 байт, и чтобы отпимизировать операции чтения/записи каждый поток берет на себя по 4 блока 4x4 (4x4x4x2 (fp16) = 128 байт).

3️⃣ if/else операции, когда разные потоки в группе (warp) попадают в разные условные ветви - работают сильно неэффективно на GPU. Используется sorting network для определения важных/неважных элементов без условных операторов.

4️⃣ Сжатые матрицы и метаданные (индексы ненулевых элементов) хранятся в column-major для оптимизации операций записи.

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

Обучают DINOv2 (ViT-L) c разными пропорциями sparse/dense обучения. Сначала идет sparse обучение, а затем dense. Для оценки качества смотрят на точность лог-регрессии на ImageNet-1k поверх признаков обученной модели.

Обучение в sparse режиме на протяжении 40-70% обучения не просаживается по качеству по сути по сравнению с dense обучением.
Всегда sparse - теряет полпроцента качества.

Ускорение времени обучения при 70% sparse обучения порядка 6% (на А100).

Вывод

2:4 паттерн не дает какого-то впечатляющего ускорения, но может слегка повысить эффективность. Интересно 🤔, насколько полученные результаты масштабируются на LLMки с миллиардами параметров. Будет ли выигрыш от 2:4 компенсироваться более медленной сходимостью?
👍8
Real-Time Video Generation with Pyramid Attention Broadcast
[Cтатьи Нет][Код есть]

В ряде отечественных тг каналов (пост на эйай ньюз, пост на Machine Learning) упомянули проект Real-Time Video Generation with Pyramid Attention Broadcast.

Самой папиры еще нет и потому какие-то нюансы могут быть неизвестны.
От себя добавлю несколько деталей.

Суть подхода заключается в следующем. В видео диффузии есть 3 вида attention операций:

1️⃣ Пространственное 🌌
2️⃣ Временное
3️⃣ Перекрестное внимание на condition 🤞

Ранее в Cache Me If You Can было замечено, что карты attention между соседними шагами диффузии мало меняются между соседними шагами на большей части процесса (за исключением начала и конца) при картиночной генерации. В данном проекте авторы замечают, что для скорости изменения attention карт справедливо следующее неравенство:

v_cross < v_time < v_spatial

И соотвественно, чем медленее меняется attention, тем чаще он переиспользуется.

За счет переиспользования карт attention можно параллелить эффективно между разными GPU разные шаги генерации по времени (уменьшении оверхеда на 50% без переиспользования карт).

Переиспользование карт дает ускорение ~30%. А распаралелливание на 8 GPU дает почти линейное ускорение (8.4x-10.6x) по сравнению с генерацией на одной GPU наивным способом. То есть ускорение достигается в первую очередь за счет эффективного параллелизма.

Тем не менее, достойный инженерный результат.
👍81
Sparse-Marlin
[Код]

Некоторое время назад я затрагивал Marlin - быстрый кернел для батчового инференса INT4xFP16.

Пару месяцев назад коллеги из IST выпустили SparseMarlin - где дополнительно к квантизации весов добавляется 2:4 sparsity, за счет чего достигается еще большее ускорение по сравнению с fp16.

Как я понял, основные инженерные наработки следующие:
1️⃣ Эффективная обработка 2:4 метаданных - позиций нулевых и ненулевых весов
2️⃣ Использование Sparse Tensor Cores (SPTCs)
3️⃣ Умное расположение квантованных весов, метаданных для sparsity, и статистик квантования

Итоговое ускорение до 5.3x 🏃‍♂️ на RTX3090 (у Marlin ~4x) при перемножении больших матриц. Интересно🥴 , какое end-2-end ускорение может быть достигнуто на эффективном движке для инференса типа vLLM?

На Hopper и более новые архитектуры пока не завезли

Таким образом, 2:4 может давать определенный выигрыш по скорости. Основная проблема в том, что на текущий момент 2:4 прунинг (post-training) сильно просаживает качество LLM ☹️.
👍2
Sparse maximal update parameterization: A holistic approach to sparse training dynamics
[Папира][Кода нет]

Введение

Подбор шага обучения - занятие довольно потное 🥲 и утомительное 😞. Learning rate, хороший для меньших моделей, зачастую приводит к расходимости для больших. Потому большие модели обычно обучают с меньшим learning rate. Но подбор по сетке (или с помощью байесовской оптимизации) может оказаться слишком накладным на практике, а иметь хорошие значения гиперпараметров все-таки хочется.

В Tensor Programs V предложили параметризацию весов, градиентов и learning rate (μP), такую, что оптимальные гиперпараметры обучения переносятся с маленьких моделей на большие.

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

Метод

Параметризация, при которой learning rate и прочие гиперпараметры обучения будут
переноситься на разные размеры моделей и степени прореживания, должна удовлетворять следующим свойствам:

1️⃣ Нормы весов не зависят от ширины и sparsity
2️⃣ Нормы градиентов по весам не зависят от ширины и sparsity
3️⃣ Изменения весов (для произвольного алгоритма оптимизации) не зависят от ширины и sparsity

Из нехитрой математики следует, что variance весов при иниациализации и learning rate следует масштабировать как 1 / (ширину_слоя * (1 - sparsity)). Чем шире сеть - тем меньше разброс параметров и learning rate, чем более разреженная сеть - тем, наоборот, больше разброс параметров и learning rate. При sparsity = 0, предложенная SμPar вырождается в μP.

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

Метод валидируют на LMках c SwiGLU и Alibi, обучаемых на токенах из Slim Pajama. В качестве маленькой прокси модели для тюнинга гиперпараметрво берут LMку с 40M параметрами, а основную серию экспериментов проводят на 610M модели. Замеряют loss на обучении (датасет большой, потому переобучения нет).

При стандартной параметризации и μP оптимальный learning rate приходится подбирать для каждой степени сжатия свой, в то время, как для SμPar оптимальные learning rate зафиксирован.

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

Авторы - ребята из Cerebras, потому умеют вполне эффективно эксплуатировать разреженные операции 😉.

Вывод

Полезная идея при обучении разреженных сетей. Ранее в Sparsity Scaling Laws было показано, что при очень большом числе данных sparse модели более compute оптимальны, чем плотные. Если в будущем будут активно учить LLMки с использованием специализированного железа SμPar будет весьма кстати для подбора гиперпараметров.
👍13