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
Решил я запустить генерацию с meta-llama/Meta-Llama-3.1-8B-Instruct с
Ответ оказался немного неожиданным)
慢性胰腺炎(CI)是一种慢性胰腺炎,其特点是胰腺炎症的持续存在和慢性损伤。胰腺炎是肾上腺皮质激素(CORT)过量释放的副作用之一。与CI相比,其作用更持久。
Если вбить в переводчик, выдает следующее:
<bos_token>
(то есть без всякого контекста) с температурой 1, и было любопытно, что первое взбредет сеточке в голову.Ответ оказался немного неожиданным)
慢性胰腺炎(CI)是一种慢性胰腺炎,其特点是胰腺炎症的持续存在和慢性损伤。胰腺炎是肾上腺皮质激素(CORT)过量释放的副作用之一。与CI相比,其作用更持久。
Если вбить в переводчик, выдает следующее:
Chronic pancreatitis (CI) is a kind of chronic pancreatitis, which is characterized by the persistence of pancreatitis and chronic damage.Pancreatitis is one of the side effects of excessive release of adrenal corticosteroids (CORT).Compared with CI, its effect is more lasting.
😁17👀8
Self-calibration for Language Model Quantization and Pruning
[Статья] [Кода нет]
Многие современные методы сжатия моделей используют некоторую выборку калибровочных данных для приближения эмпирического распределения данных. Чем ближе эта выборка к целевому набору задач - тем интуитивно лучше качество, но хороших предписаний по отбору последовательностей до сих пор не существует.
Ранее эти же авторы перебрали несколько вариантов (пост на КПД), и обнаружили, что некоторое, хоть и не столько значительное, различие в качестве есть в зависимости от источника данных.
В этой же статье авторы предлагают сжимаемой модели самой сгенерировать 🪄 данные для калибровки.
Метод
Калибровочные последовательности генерируют начиная с
Дабы повысить качество данных предлагается динамически менять температуру - сначала больше, чтобы было разнообразие, а затем снижать по мере увеличения количества сгенерированных токенов.
Эксперименты
Рассматривают несколько небольших LLM:
⭐️ Gemma 2B
⭐️ Phi-2
⭐️ OPT 6.7B 👨🦳
⭐️ Mistral 7B
⭐️ Llama-3.1-8B
Которые сжимают при помощи AWQ, GPTQ (4-битная квантизация) и SparseGPT, Wanda (2:4 прунинг).
В качестве бейзлайнов берут Wikitext-2, C4, рандомные токены, Сosmopedia.
Качество замеряют на стандартных бенчах из lm-eval-harness.
⚡️ Синтетические данные, сгенерированные моделью, почти всегда лучше выборок из датасетов. Различие заметнее на прунинге, где просадки больше.
⚡️ Сгенерированный текст обыкновенно довольно связный, грамматически корректный, по статистикам довольно близок к реальному, но менее разнообразный.
⚡️ Снижение температуры 🌡️ генерации от 2 до 1 по ходу генерации дает самые лучшие результаты, хоть и без значительного отрыва от фиксированной температуры - 1.
Вывод
Идея прикольная, и для используемого количества данных (128 последовательной длины 2048) достаточно дешева в проверке. Эффективность метода во многом зависит от качества базовой модели, что, впрочем, для современных LLM, интересных сообществу верно. Интересно 🤔, справедливы ли полученные выводы для более сложных задач?
[Статья] [Кода нет]
Многие современные методы сжатия моделей используют некоторую выборку калибровочных данных для приближения эмпирического распределения данных. Чем ближе эта выборка к целевому набору задач - тем интуитивно лучше качество, но хороших предписаний по отбору последовательностей до сих пор не существует.
Ранее эти же авторы перебрали несколько вариантов (пост на КПД), и обнаружили, что некоторое, хоть и не столько значительное, различие в качестве есть в зависимости от источника данных.
В этой же статье авторы предлагают сжимаемой модели самой сгенерировать 🪄 данные для калибровки.
Метод
Калибровочные последовательности генерируют начиная с
<bos>
токена. Дабы повысить качество данных предлагается динамически менять температуру - сначала больше, чтобы было разнообразие, а затем снижать по мере увеличения количества сгенерированных токенов.
Эксперименты
Рассматривают несколько небольших LLM:
⭐️ Gemma 2B
⭐️ Phi-2
⭐️ OPT 6.7B 👨🦳
⭐️ Mistral 7B
⭐️ Llama-3.1-8B
Которые сжимают при помощи AWQ, GPTQ (4-битная квантизация) и SparseGPT, Wanda (2:4 прунинг).
В качестве бейзлайнов берут Wikitext-2, C4, рандомные токены, Сosmopedia.
Качество замеряют на стандартных бенчах из lm-eval-harness.
⚡️ Синтетические данные, сгенерированные моделью, почти всегда лучше выборок из датасетов. Различие заметнее на прунинге, где просадки больше.
⚡️ Сгенерированный текст обыкновенно довольно связный, грамматически корректный, по статистикам довольно близок к реальному, но менее разнообразный.
⚡️ Снижение температуры 🌡️ генерации от 2 до 1 по ходу генерации дает самые лучшие результаты, хоть и без значительного отрыва от фиксированной температуры - 1.
Вывод
Идея прикольная, и для используемого количества данных (128 последовательной длины 2048) достаточно дешева в проверке. Эффективность метода во многом зависит от качества базовой модели, что, впрочем, для современных LLM, интересных сообществу верно. Интересно 🤔, справедливы ли полученные выводы для более сложных задач?
❤7👍5
Соавтор и коллега по Yandex Research @galqiwi выкатил демку AQLM на ржавчине.
Можно просто взять и запустить Llama 3.1-8b, квантованную в 2 бита AQLM+PV в браузере на CPU, со скоростью 1.4 токена в секунду на M1.
LM head квантизуется в int8.
Отличная работа, Вова!
[Демка][Пост на galqiwi boredom][Репост на Love. Death. Transformers][Репозиторий]
Можно просто взять и запустить Llama 3.1-8b, квантованную в 2 бита AQLM+PV в браузере на CPU, со скоростью 1.4 токена в секунду на M1.
LM head квантизуется в int8.
Отличная работа, Вова!
[Демка][Пост на galqiwi boredom][Репост на Love. Death. Transformers][Репозиторий]
🔥36❤6
Если вам приспичит инферить LLMку на микроволновке. пока разогревается еда 🍣, мы как раз подогнали 2-битные меньшие версии Llama-3.2:
👶 Llama-3.2-1B-AQLM-PV-2Bit-2x8
👶 Llama-3.2-1B-Instruct-AQLM-PV-2Bit-2x8
👶 Llama-3.2-3B-AQLM-PV-2Bit-2x8
👶 Llama-3.2-3B-Instruct-AQLM-PV-2Bit-2x8
Основное место занимают уже эмбеды (которые хоть shared, но с FSDP немного покорячиться пришлось).
Ждем выкатки квантизации эмбедов в
👶 Llama-3.2-1B-AQLM-PV-2Bit-2x8
👶 Llama-3.2-1B-Instruct-AQLM-PV-2Bit-2x8
👶 Llama-3.2-3B-AQLM-PV-2Bit-2x8
👶 Llama-3.2-3B-Instruct-AQLM-PV-2Bit-2x8
Основное место занимают уже эмбеды (которые хоть shared, но с FSDP немного покорячиться пришлось).
Ждем выкатки квантизации эмбедов в
transformers
.🔥17❤4🤯4
Liger Kernel: Efficient Triton Kernels for LLM Training
[Техрепорт]
[Репозиторий]
Ребята из LinkedIn написали кернелы для разных операций в LLMках на Тритоне (когда нибудь я научусь писать на нем, а не про него), которые ускоряют процедуру обучения и снижают расход памяти по сравнению с ванильной торчовой реализации.
Метод
В частности, Liger Kernel предлагает следующее:
⭐️ Зафьюженные RMSNorm и LayerNorm на прямом и обратном проходе
⭐️ Зафьюженные SwiGLU и GeGLU на прямом и обратном проходе
⭐️ Оптимизированный RoPE
⭐️ И самое интересное - оптимизация вычисления кросс-энтропии
По поводу последнего:
Словари нынче у моделек перевалили за 100к, и на сколь-либо длинных последовательностях матрица логитов будет весить десятки гигов. Потому авторы реализовали прямой проход, вычисление кросс-энтропии и обратный проход в одном kernel-е без необходимости материализации одновременно матрицы логитов и градиентов по логитам. Кроме того, считать логиты можно не разом для всей последовательности, а чанками.
Бенчмарки
Замеряют на A100.
Предложенные нормализации дают хорошее ускорение по сравнению с торчом (не хватает сравнения с Apex). RoPE прямо знатно ускорился. SwiGLU и GeGLU по скорости такие же, как в торче, но снижают расход памяти в 1.6 раз.
В end-2-end сценарии гоняют finetune на 4A100 на Alpaca на Llama-3-8B, Qwen-2-7b, Gemma-1-7b. Скорость обучения возрастает от 10 до 40 %, и пиковый расход памяти уменьшается в среднем на 50%.
Метод также валидируют в связке с Medusa, методом где LLM учится предсказывать несколько следующих токенов за раз, и на каждый n+1 токен своя обучаемая голова. Liger Kernel снижает заметно расход памяти как с замороженной, так и обучаемой тушкой трансформера, благодаря трюкам с вычислениями логитов.
Использование
Liger Kernel можно вызвать по щелчку пальца через
Liger Kernel уже интегрирован в transformers, TRL и axolotl.
[Техрепорт]
[Репозиторий]
Ребята из LinkedIn написали кернелы для разных операций в LLMках на Тритоне (когда нибудь я научусь писать на нем, а не про него), которые ускоряют процедуру обучения и снижают расход памяти по сравнению с ванильной торчовой реализации.
Метод
В частности, Liger Kernel предлагает следующее:
⭐️ Зафьюженные RMSNorm и LayerNorm на прямом и обратном проходе
⭐️ Зафьюженные SwiGLU и GeGLU на прямом и обратном проходе
⭐️ Оптимизированный RoPE
⭐️ И самое интересное - оптимизация вычисления кросс-энтропии
По поводу последнего:
Словари нынче у моделек перевалили за 100к, и на сколь-либо длинных последовательностях матрица логитов будет весить десятки гигов. Потому авторы реализовали прямой проход, вычисление кросс-энтропии и обратный проход в одном kernel-е без необходимости материализации одновременно матрицы логитов и градиентов по логитам. Кроме того, считать логиты можно не разом для всей последовательности, а чанками.
Бенчмарки
Замеряют на A100.
Предложенные нормализации дают хорошее ускорение по сравнению с торчом (не хватает сравнения с Apex). RoPE прямо знатно ускорился. SwiGLU и GeGLU по скорости такие же, как в торче, но снижают расход памяти в 1.6 раз.
В end-2-end сценарии гоняют finetune на 4A100 на Alpaca на Llama-3-8B, Qwen-2-7b, Gemma-1-7b. Скорость обучения возрастает от 10 до 40 %, и пиковый расход памяти уменьшается в среднем на 50%.
Метод также валидируют в связке с Medusa, методом где LLM учится предсказывать несколько следующих токенов за раз, и на каждый n+1 токен своя обучаемая голова. Liger Kernel снижает заметно расход памяти как с замороженной, так и обучаемой тушкой трансформера, благодаря трюкам с вычислениями логитов.
Использование
Liger Kernel можно вызвать по щелчку пальца через
AutoLigerKernelForCausalLM
или патчинг модели из 🤗. А можно импортировать модули и из них собрать модельку.Liger Kernel уже интегрирован в transformers, TRL и axolotl.
👍10
В комментариях был задан резонный вопрос - а сравнивали с torch с или без compile?
Будучи лучшего мнения о людях, я полагал, что да.
Но если посмотреть в скрипты бенчмарков в репозитории проектов - compile не фигурирует нигде. RMSNorm берут сырой из modeling_llama.py в частности.
Хитрые собаки 🐶!
Будучи лучшего мнения о людях, я полагал, что да.
Но если посмотреть в скрипты бенчмарков в репозитории проектов - compile не фигурирует нигде. RMSNorm берут сырой из modeling_llama.py в частности.
Хитрые собаки 🐶!
😢7❤3😁2