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.
[Блог] [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#, при этом мотивируя низкую скорость тем, что перемножение на Адамаровы матрицы требует
Статья вышла в конце сентября, но про PV-tuning и QTIP , вышедшие в конце мая и июня, соотвественно, ни слова, как будто весть еще не успела дойти по Великому Шелковому Пути 🐫 в Поднебесную.
И вишенка 🍒 на торте 🍰 - отсутствие AQLM/QuIP# среди бейзлайнов мотивируют тем, что модели новые, никто не выложил, а самим впадлу и напряжно квантовать. На что можно тактично заметить, что AQLM модели лежат на хабе, и не просто лежат, а там еще есть и метрики, с которыми можно сравниться. Только одна беда - они несколько получше будут. Что делать, притворимся, что мы ничего не видели 🙈)
Моделей, кстати неплохо так выложили.
[Статья][Код]
Пристегните ремни, а лучше прячьтесь в бомбоубежище 💣. Будет горячо 🔥.
На текущий момент, векторная квантизация является наиболее эффективным (с точки зрения качества) методом сжатия 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
Лернинг Рейт, Бач Сайз и Вейт Декей звучат как отличные имена для героев фантастического романа.
😁29❤1
За что большое уважение компании Meta, помимо многого прочего, так это за реально подробные и занимательные технические отчеты.
Техрепорты по 🦙-м были довольно содержательными и полезными, и, полагаю, во многом опредилили направления развития LLM, хоть и основывались по большей части на идеях из прошлых работ.
Отчет по MovieGen не уступает по качеству и полноте содержания техрепортам по Llama и может служить своего рода обзором (с рассмотрением и ablation) современных техник и достижений в области генеративных моделей.
Прекрасная работа, @asanakoy!
Сам бы у себя разобрал в серии постов, но лучше, чем причастный к созданию MovieGen, это никто не сделает)
Техрепорты по 🦙-м были довольно содержательными и полезными, и, полагаю, во многом опредилили направления развития LLM, хоть и основывались по большей части на идеях из прошлых работ.
Отчет по MovieGen не уступает по качеству и полноте содержания техрепортам по Llama и может служить своего рода обзором (с рассмотрением и ablation) современных техник и достижений в области генеративных моделей.
Прекрасная работа, @asanakoy!
Сам бы у себя разобрал в серии постов, но лучше, чем причастный к созданию MovieGen, это никто не сделает)
👍19
Спрашивает народ - по какой-такой физике присвоили Нобелевскую премию Хинтону и Хопфилду?
Ну, смотрите, есть Физика языковых моделей. И вряд ли бы она появилась без трудов Хинтона и Хопфилда (Хинтона уж точно). А в самой премии не указано по какой конкретной физике надо её давать или не давать. Все формальности соблюдены.
Ну, смотрите, есть Физика языковых моделей. И вряд ли бы она появилась без трудов Хинтона и Хопфилда (Хинтона уж точно). А в самой премии не указано по какой конкретной физике надо её давать или не давать. Все формальности соблюдены.
😁26👎1😱1
Раз уж пошла такая гулянка - предлагаю дать Нобелевскую премию мира Суцкеверу за вклад в Ai Safety.
Или Юдковскому...
Или Юдковскому...
😁24💯7🔥3❤1🤨1
Isomorphic Pruning for Vision Models
[Статья] [Код]
Введение
Полагаю, что уже немного помнят, но когда-то выбить SOTA или создать мега эффективную по параметрам/флопсам на ImageNet-1k было модно и престижно.
В данной статье авторы предлагают метод структурированного прунинга, который достигает хорошего качества на ряде ViTов, СNN и их гибридов.
Метод
При структурированном прунинге отбрасываются целые каналы, слои или размерности в сети. Однако ранжировать конструкции разной топологии между собой непонятно как, потому предлагается ранжировать только среди структурных элементов одинаковой топологии.
Каждому нейрону сопоставляется некий граф зависимости из входящих и выходящих в него ребер, кои погибнут, если выдернем нейрон. Собираем все изоморфные графы в соответствующие кучки (например с одинаковым числом входных/выходных ребер для прунинга нейрона из MLP) считаем для них некоторый importance score, и для тех у кого он меньше - выбрасываем.
Для случая трансформера естественные структуры следующие:
1️⃣ Внутренние каналы в MLP
2️⃣ Головы трансформера
3️⃣ Размерности голов трансформера
4️⃣ Размерность признаков во всей сети
Пробегаемся по всем возможным структурам и везде выбрасываем одну и ту же долю самых маловажных.
То, что получилось потом дообучаем дабы восстановить качество.
Эксперименты
Валидируют метод на ConvNext, DeiT, ResNet-ах и MobileNet-v2. В плане критерия не шибко парятся, берут просто
Прунят довольно агрессивно, в 1.5 - 4 раза, восстанавливаться надо достаточно долго и основательно, потому обучают 300 эпох с дистилляцией на RegNetY.
В результате, удается добиться небольшой просадки на ResNet-ах по сравнению с базовой моделью. Правда, протокол сомнительный - берут модели обученные по старым рецептам без аугментаций на 90 эпох, а сами тратят гораздо больше вычислений с использованием современных методик выжимания качества на ImageNet.
На DeiT и ConvNext стартуя с DeiT-Base/ConvNext-Base удается получить запруненные сети с лучшим качеством, чем Small- и Tiny- модели с тем же количеством параметров и FLOPs (т.е достичь Парето-оптимальности).
По качеству на процент-два превосходят в среднем бейзлайны из литературы.
Вывод
Нравится идея с ранжированием структур с одинаковой топологией, но такое ощущение, что хороший результат обусловлен преимущественно дистилляцией с длительным обучением. На LLMки, к сожалению, масштабировать будет тяжко простым смертным. Но всякие там NVIDIA могут позволить для условного Minitron.
[Статья] [Код]
Введение
Полагаю, что уже немного помнят, но когда-то выбить 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
MaskLLM: Learnable Semi-Structured Sparsity for Large Language Models
[Статья] [Страница проекта] [Код][Пост на Machine Learning]
Введение
2:4 (она же semistructured sparsity) дает какое-никакое ускорение на GPU от Ampere и новее. Однако, просадка при прунинге обычно слишком велика для LLMок, дабы быть интересной на практике.
В этой статье предлагают метод обучения хороших 2:4 масок через Gumbel-Softmax.
Метод
Маска суть дискретная сущность потому ее просто так не отпизируешь градиентным спуском, и авторы предлагают моделировать распределение масок через Gumbel-Softmax с
Если какой-то вес зануляется или близок к нулю, то логиты маски почти не получают градиентов, потому авторы добавляют регуляризационный член как 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 моделью.
Вывод
Вполне годная стратегия для обучения
[Статья] [Страница проекта] [Код][Пост на 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 и даже временами
Вывод
Вполне годная стратегия для обучения
2:4
, но требующая определенных вычислительных затрат (т.е прилично дороже чем прогнать SparseGPT). Результат достойный, но все же просадка остается довольно заметной - больше чем у SOTA методов 2-битной квантизации. Вероятно, если еще оптимизировать веса вместе с масками - можно выжать больше.👍6❤2
Ребята из unsloth выкатили блог про раздебаг gradient accumulation.
[Пост на Love. Death. Transformers. ]
TL;DR - наивное усреднение батчей при gradient accumulation приводит к тому, что результат отличается от того, чтобы прогнать за один шаг большой батч. Причем, как утверждают авторы, лосс всегда больше. В стандартном способе вычисления кросс-энтропии есть деление на длину последовательности, и если они разные в разных микробатчах - результат усреднения будет не такой, как лосс на суммарном батче. Потому предлагается избавлятьcя от усреднения.
Утверждение про то, что лосс при naive gradient accumulation больше, вообще говоря, неверно. В конце блога авторы доказывают, что лосс при наивном gradient accumulation больше и в доказательстве делают внезапный 😱 переход от лосса по микробатчам к среднему лоссу по батчу.
Можно подобрать контрпример. Пусть на первом батче лосс L_1 = 1, и в батче 4 токена, а на втором батче L_2=9 и 6 токенов.
Тогда усредненный лосс на всем батче:
А при наивном 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.
Отдельного внимания заслуживает утверждение:
При том что перплексия переваливает за 200 в лучшем случае, что на практике означает, что модель галлюцинирует чуть менее чем полностью на любой запрос.
Предложенный метод по качеству по перплексии несколько лучше Uniform, критериев, основанных на спектральной норме и норме Фробениуса, предложенного ранее OWL, но тем не менее просадки остаются весьма значительными (на уровне 1+eps битных квантизаций) при сжатии на 70%.
Есть результаты и на 🦙-3, которая почему-то называется LLaMA-V3-7B. Там просадки значительнее.
Еще и на ConvNext прогнали для разнообразия.
Найденные профили для LLM обычно следующие - пруним меньше первые блоки, сильнее - последние (за исключением самого последнего).
Вывод
Выглядит как использование некой взятой из воздуха характеристики матриц весов для оценки важности, без внятной мотивации. Тем не менее, в упорстве и умении себя хорошо подать авторам не занимать, потому их и взяли на NeurIPS. А вообще, прунить LLMки тяжело дается как-то по сравнению с квантизацией. В 4 бита просадка на простых бенчах почти и не видна, а 50% sparsity (сжатие в 2 раза) уже существенно ломает модель.
[Статья][Ридми, но код все равно нахрен не нужен]
Обсуждать по существу тут нечего, чисто поугарать.
Метод
Хотим мы прунить LLMки. Текущие методы сжимают слои равномерно.
Однако, одни слои могут быть чувствительнее других. Как эффективно распределить степени прореживания между разными слоями для максимизации качества?
В этой же статье предлагают использовать коэффициент в законе убывания сингулярных значений матриц весов 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
- У нас в компании оплата по количеству строчек написанного кода.
- Отлично, по рукам.
matmul_had.py в
- Отлично, по рукам.
matmul_had.py в
quip-sharp/lib/utils
😁23🤣1
Deep Compression Autoencoder for Efficient High-Resolution Diffusion Models
[Статья][Код]
Введение
Сжимать можно не только матрицы весов LLMов, но много еще что-то другое не без пользы для человечества.
Более-менее все современные SOTA или около того диффузионные модели работают в латентном пространстве, с меньшим пространственным разрешением.
От автокодировщика (тандема 🚲 из сети, кодирующей из исходного пространства данных в латентное, называемой энкодером, и декодирующей обратно - декодера) хочется одновременно высокой степени сжатия и качественной реконструкции одновременно.
Наиболее популярный пространственный фактор сжатия - 8x (Stable Diffusion, FLUX, DALLE-3 (по всей видимости)). При таком сжатии (особенно если еще и поднять число каналов в латентном пространстве до 16, скажем) реконструкции почти не отличаются от оригинала. Однако карты признаков остаются все еще достаточно большими при подаче картинок высокого разрешения, и требуется немало вычислений.
Отсюда возникает желание двигаться в сторону больших факторов сжатия при сохранении качества. И авторы данной статьи предлагают несколько интересных архитектурных решений.
Метод
По сути в предложенной статье две ключевых идеи:
1️⃣ Skip-connection (Residual Autoencoding):
- При downsample патчи 2x2 сворачиваются в 4 канала, а зачем группы по 2 канала усредняются (ребята изобрели average pooling?)
- При upsample 4 подряд идущих канала разворачиваются в 2x2, каждый канал дублируется
2️⃣ Процедура обучения
- Предобучение на низком разрешении только на реконструкцию (без адверсариального лосса)
- Дообучение на низком разрешении верхних слоев декодера с GAN лоссом (для получения резких 🔪 деталей)
- Дообучение глубоких слоев энкодера и декодера на реконструкцию на высокое разрешение (дабы адаптировать латенты под high-resolution c другим распределением частот / плотностью обьектов)
[Статья][Код]
Введение
Сжимать можно не только матрицы весов LLMов, но много еще что-то другое не без пользы для человечества.
Более-менее все современные SOTA или около того диффузионные модели работают в латентном пространстве, с меньшим пространственным разрешением.
От автокодировщика (тандема 🚲 из сети, кодирующей из исходного пространства данных в латентное, называемой энкодером, и декодирующей обратно - декодера) хочется одновременно высокой степени сжатия и качественной реконструкции одновременно.
Наиболее популярный пространственный фактор сжатия - 8x (Stable Diffusion, FLUX, DALLE-3 (по всей видимости)). При таком сжатии (особенно если еще и поднять число каналов в латентном пространстве до 16, скажем) реконструкции почти не отличаются от оригинала. Однако карты признаков остаются все еще достаточно большими при подаче картинок высокого разрешения, и требуется немало вычислений.
Отсюда возникает желание двигаться в сторону больших факторов сжатия при сохранении качества. И авторы данной статьи предлагают несколько интересных архитектурных решений.
Метод
По сути в предложенной статье две ключевых идеи:
1️⃣ Skip-connection (Residual Autoencoding):
- При downsample патчи 2x2 сворачиваются в 4 канала, а зачем группы по 2 канала усредняются (ребята изобрели average pooling?)
- При upsample 4 подряд идущих канала разворачиваются в 2x2, каждый канал дублируется
2️⃣ Процедура обучения
- Предобучение на низком разрешении только на реконструкцию (без адверсариального лосса)
- Дообучение на низком разрешении верхних слоев декодера с GAN лоссом (для получения резких 🔪 деталей)
- Дообучение глубоких слоев энкодера и декодера на реконструкцию на высокое разрешение (дабы адаптировать латенты под high-resolution c другим распределением частот / плотностью обьектов)
🔥4
Результаты
Авторы тестируют VAE на непосредственно задаче реконструкции и применительно к латентной диффузии (DiT/UViT) на ImageNet/FFHQ, Mapillary Vistas (я тоже впервые слышу про такой). Рассматривают сжатие в 32/64/128 раз по пространству с количеством латентных каналов 32/64/128.
Для повышения эффективности vanilla transformer блоки заменяют на EfficientViT.
Residual autoencoding критичен при высоких факторах сжатия - сеть сама не может выучить этот skip connection. SD-like VAE оказывается беспомощен (жесткие дефекты и размытие на экстремальных факторах), а им удается иметь метрики более-менее на одном уровне с ростом downsampling.
При фиксированном количестве патчей в DIT/UViT качество выше при более сильном сжатии за счет автоэнкодера и меньших патчах из латента (размера 1) против меньшего сжатия и бОльших патчей. Утверждается, что с DC-VAE можно получить качество не хуже, а то и лучше, чем в сетапе, как в оригинальной статье, при этом имея 4-кратное ускорение инференса.
Предложенная процедура дообучения на высокое разрешение (Decoupled High-Resolution Adaptation) критична для адекватного качества на высоком разрешении.
Кроме того, DC-VAE проверют на коротком (100к итераций) 📝-2-image сетапе.
Вывод
Результаты выглядят весьма достойно. Прокачка энкодера - это комплиментарное направление повышения эффективности диффузионных моделей вкупе с архитектурной оптимизацией и дистилляцией по шагам. Похожую идею, во всей видимости реализовали в свежей SANA.
Авторы тестируют VAE на непосредственно задаче реконструкции и применительно к латентной диффузии (DiT/UViT) на ImageNet/FFHQ, Mapillary Vistas (я тоже впервые слышу про такой). Рассматривают сжатие в 32/64/128 раз по пространству с количеством латентных каналов 32/64/128.
Для повышения эффективности vanilla transformer блоки заменяют на EfficientViT.
Residual autoencoding критичен при высоких факторах сжатия - сеть сама не может выучить этот skip connection. SD-like VAE оказывается беспомощен (жесткие дефекты и размытие на экстремальных факторах), а им удается иметь метрики более-менее на одном уровне с ростом downsampling.
При фиксированном количестве патчей в DIT/UViT качество выше при более сильном сжатии за счет автоэнкодера и меньших патчах из латента (размера 1) против меньшего сжатия и бОльших патчей. Утверждается, что с DC-VAE можно получить качество не хуже, а то и лучше, чем в сетапе, как в оригинальной статье, при этом имея 4-кратное ускорение инференса.
Предложенная процедура дообучения на высокое разрешение (Decoupled High-Resolution Adaptation) критична для адекватного качества на высоком разрешении.
Кроме того, DC-VAE проверют на коротком (100к итераций) 📝-2-image сетапе.
Вывод
Результаты выглядят весьма достойно. Прокачка энкодера - это комплиментарное направление повышения эффективности диффузионных моделей вкупе с архитектурной оптимизацией и дистилляцией по шагам. Похожую идею, во всей видимости реализовали в свежей SANA.
🔥4
Выбираете темную сторону силы?
Статьи на ArXiv, оказывается, можно читать в инвертированной цветовой схеме (черный фон / белый текст).
Для этого надо просто в pdf заменить arxiv -> arxiv.black:
Не знаю зачем, но прикольно.
Статьи на ArXiv, оказывается, можно читать в инвертированной цветовой схеме (черный фон / белый текст).
Для этого надо просто в pdf заменить arxiv -> arxiv.black:
https://arxiv.black/pdf/{arxiv-id}
.Не знаю зачем, но прикольно.
👍10🔥5🤔4🤮2