Квантование KV-кэшей добавили в 🤗!
[Блогпост]
Чтобы не пересчитывать каждый раз все заново при авторегрессивной генерации, в трансформерах используются kv-кэши, ключи и значения, посчитанные для прошлых токенов, сохраняются в памяти и используются при подсчете attention для каждого нового токена.
Однако есть проблема - если последовательность длинная, кэш слишком тяжелый становится.
Для 🦙 (1 или 2) 7b для 10к токенов потребуется 5Gb памяти (2 * 2 * 32 * 32 * 128 * 10000 ≈ 5GB). А для более крупных моделей и , если контекст переваливает за миллион, страшно представить сколько.
Существуют разные подходы к сжатию KV-кэшей, и один из наиболее очевидных - квантизация кэша, преставление ключей и значений в более низкой битности.
Метод
В работе KIVI предложили 2-битное ассиметричное (с zero point) квантование кэшей. Ключи квантуются поканально, значения - по токенно. Поканальное квантование помогает бороться с outliers.
В HF использует по-токенное квантование для ключей и значений из соображений скорости, несколько жертвуя качеством. Кроме того, чтобы немного улучшить качество, самые свежие 128 токенов держат в исходной точности. Они обычно самые важные для текущего токена, и не добавляют много памяти для длинного контекста.
HF поддерживает два метода квантизации:
- quanto (простой rount-to-nearest)
- hqq
Оба метода data-free.
Валидация
На замерах перплексии на Llama-2-7b на PG-19, 4-битный HQQ не просаживает качество, а
На длинных последовательностях удается достичь до 2.5x экономии потребляемой памяти.
Скорость, генерации, однако замедляется так как на текущий момент нет оптимизированных ядер. Просадка по скорости 30-50% судя по графикам (крайняя правая точка на графике number_of_tokens/sec явно забагованная).
Кроме того, данная стратегия помогает именно на стадии генерации, а заполнение промпта (pre-fill) приходится делать стандартным способом.
Метод совместим с Flash Attention.
Использование
Достаточно установить quanto, и прописать аргументы в методе
[Блогпост]
Чтобы не пересчитывать каждый раз все заново при авторегрессивной генерации, в трансформерах используются kv-кэши, ключи и значения, посчитанные для прошлых токенов, сохраняются в памяти и используются при подсчете attention для каждого нового токена.
Однако есть проблема - если последовательность длинная, кэш слишком тяжелый становится.
Для 🦙 (1 или 2) 7b для 10к токенов потребуется 5Gb памяти (2 * 2 * 32 * 32 * 128 * 10000 ≈ 5GB). А для более крупных моделей и , если контекст переваливает за миллион, страшно представить сколько.
Существуют разные подходы к сжатию KV-кэшей, и один из наиболее очевидных - квантизация кэша, преставление ключей и значений в более низкой битности.
Метод
В работе KIVI предложили 2-битное ассиметричное (с zero point) квантование кэшей. Ключи квантуются поканально, значения - по токенно. Поканальное квантование помогает бороться с outliers.
В HF использует по-токенное квантование для ключей и значений из соображений скорости, несколько жертвуя качеством. Кроме того, чтобы немного улучшить качество, самые свежие 128 токенов держат в исходной точности. Они обычно самые важные для текущего токена, и не добавляют много памяти для длинного контекста.
HF поддерживает два метода квантизации:
- quanto (простой rount-to-nearest)
- hqq
Оба метода data-free.
Валидация
На замерах перплексии на Llama-2-7b на PG-19, 4-битный HQQ не просаживает качество, а
quanto_int4
умеренно просаживает. 2-битные квантизации сильно роняют качество. На LongBench в 4 битах почти нет просадки по качеству.На длинных последовательностях удается достичь до 2.5x экономии потребляемой памяти.
Скорость, генерации, однако замедляется так как на текущий момент нет оптимизированных ядер. Просадка по скорости 30-50% судя по графикам (крайняя правая точка на графике number_of_tokens/sec явно забагованная).
Кроме того, данная стратегия помогает именно на стадии генерации, а заполнение промпта (pre-fill) приходится делать стандартным способом.
Метод совместим с Flash Attention.
Использование
Достаточно установить quanto, и прописать аргументы в методе
.generate
.👍22
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, вероятно, тернарные модели вполне могут быть около Парето-оптимальными. Во всяком случае, в некоторых приложениях.
[Статья][Код инференса]
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, вероятно, тернарные модели вполне могут быть около Парето-оптимальными. Во всяком случае, в некоторых приложениях.
👍7❤3
❌ 💰 Не проплаченной рекламы пост.
Хочу порекомендовать канал То Шо Нейросети.
На данном канале вы можете найти сборную солянку интересных и полезных материалов во всякой всячине, связанной с нейронками. И более чем годные туториалы от самого автора.
В частности, внимания заслуживает недавняя ветка постов про Liquid Neural Networks 💧.
И реализация Мамбы 🐍 с нуля.
Хочу порекомендовать канал То Шо Нейросети.
На данном канале вы можете найти сборную солянку интересных и полезных материалов во всякой всячине, связанной с нейронками. И более чем годные туториалы от самого автора.
В частности, внимания заслуживает недавняя ветка постов про 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.
[Статья][Ридми]
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.
👍10❤3🔥3
Оценивать интеллект по IQ-тестам это как оценивать качество изображений по FID.
🤡15👍8🥴6❤3🤔1
В процессе случайного блуждания по интернетам наткнулся на занятный блог от некоего Итона Эпперли, аспиранта в Калтехе по специальности прикладная и вычислительная математика.
В частности, у него есть весьма годные посты по разным вопросам из линейной алгебры (разреженным и низкоранговым матрицам), теории вероятностей (Марковские цепи 🔗, случайные 🎲 алгоритмы в линейной алгебре).
Есть концептуальные посты:
- Low-rank
- FFT
И более специфичные
- Don’t Use Gaussians in Stochastic Trace Estimation
Итон - первый автор статьи XTrace, SOTA алгоритма стохастической оценки следов больших матрицы (сходящихся быстрее к истинному значению по количеству сэмплов).
В общем, любителям прикладной математики рекомендую!
В частности, у него есть весьма годные посты по разным вопросам из линейной алгебры (разреженным и низкоранговым матрицам), теории вероятностей (Марковские цепи 🔗, случайные 🎲 алгоритмы в линейной алгебре).
Есть концептуальные посты:
- 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к инструкций, который выложили в открытый доступ.
Контекст коротковат по современным меркам - всего 4к токенов, небось больше не лезло во время обучения 😅.
Скоры на бенчах весьма достойны. На свежей ArenaHard от lmsys уступают лишь свежим версиям чат-гопоты и Клод Опус. На lmsys arena было бы еще интересно глянуть Elo Score.
Ну и самая интересная деталь - размер 340B параметров, т.е 640Gb на одни лишь веса в fp16. Как вы ее будете инферить - это ваша проблема)
Задача экстремальной квантизации уже не вместить LLMку именно на consumer-grade GPU, а хоть на какую-то)
Но зеленым, конечно, спасибо за такой вклад в опенсорс)
Пока все находятся в томном ожидании релиза 🦙-3 400B Nvidia сделали ход конем и выкатили семейство здоровенных херовин.
Знакомьтесь - Nemotron-4!
Идет в трех комплектациях:
1️⃣Base - претрейн
2️⃣Instruct - дообучение на инструкциях
3️⃣Reward - reward model для RL alignment, обученная поверх Base
Предобучалось оно на 9 триллионах токенах из 50+ человеческих языков и 40+ языков программирования.
Для alignment использовали набор из 20к инструкций, который выложили в открытый доступ.
Контекст коротковат по современным меркам - всего 4к токенов, небось больше не лезло во время обучения 😅.
Скоры на бенчах весьма достойны. На свежей ArenaHard от lmsys уступают лишь свежим версиям чат-гопоты и Клод Опус. На lmsys arena было бы еще интересно глянуть Elo Score.
Ну и самая интересная деталь - размер 340B параметров, т.е 640Gb на одни лишь веса в fp16. Как вы ее будете инферить - это ваша проблема)
Задача экстремальной квантизации уже не вместить LLMку именно на consumer-grade GPU, а хоть на какую-то)
Но зеленым, конечно, спасибо за такой вклад в опенсорс)
👍26🍾3👏2
Прунинг LLM в глубину
Данный пост был в замыслах уже пару месяцев, но все никак не доходили руки.
Ниже приведен разбор нескольких статей, посвященных одной и той же теме - depth pruning. Так как задача и мотивация у всех статей общая, то и введение дедуплицированное, общее для всех работ.
Введение
При структурированном прунинге веса отбрасываются не поодиночке, а группами - поканально, поголовно 🗿 (трансформерно поголовно), иногда даже весь слой целиком отправляется в царство Аида ☠️. Структурированный прунинг хорош тем, что явно уменьшает размерности матриц и тензоров в операциях, потому дает неплохое ускорение на разнообразном железе и движках. Увы, серьезного сжатия без серьезной просадки в качестве обычно сложно достичь без серьезных вложений в дообучение.
Трансформеры содержат skip-connection как в Attention, так и в MLP. Residual type архитектуры, как было замечено еще давно , являются в некотором смысле ансамблями, где конечный выход можно воспринимать как агрегацию знания от нескольких неглубоких экспертов. Одна голова хорошо, две лучше, еще больше - еще лучше, но и иногда и пары специалистов достаточно. Потому есть основания полагать, что прунинг в глубину - прореживание целых блоков - имеет шанс завестись и сжатая модель будет выдавать адекватную точность.
Данный пост был в замыслах уже пару месяцев, но все никак не доходили руки.
Ниже приведен разбор нескольких статей, посвященных одной и той же теме - 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 первые и последние блоки важно - иначе перплексия взлетает до нескольких тысяч.
Комментарий
Метод прост и логичен. Однако просадка, на самом деле несколько больше, чем декларируется. На собственных замерах с l
[Статья][Код]
Первая статья в хронологическом порядке и с открытым исходным кодом.
Метод
Хотим мы, значится, выбрасывать блоки целиком - но какие брать?
Авторы рассматривают 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 первые и последние блоки важно - иначе перплексия взлетает до нескольких тысяч.
Комментарий
Метод прост и логичен. Однако просадка, на самом деле несколько больше, чем декларируется. На собственных замерах с l
m_eval=0.4.0
поверх дообученных чекпоинтов (26 блоков против исходных 32) замерил просадку в 3% по сравнению с исходной моделью.👍4❤1
ShortGPT: Layers in Large Language Models are More Redundant Than You Expect
[Статья][Нет кода]
Метод
Трансформерные блоки, как известно обладают аддитивными skip connections следующего вида (для простоты изложения забьем на нормализацию):
Выход mlp, attn нередко инициализируется нулем и остается небольшим по норме в процессе обучения. Следовательно, каждый блок меняет понемножку внутренне представление.
В данной работе предлагают выбрасывать те блоки, которые изменяют меньше всего внутреннее представление на некоторой выборке (примерах из PG19). В качестве расстояния используют среднее косинусное расстояние между токенами перед и после данного блока. В итоге убираются блоки с наименьшим косинусным расстоянием.
Результаты
Так как работа от китайских коллег, то замеряют качество как на Llama-2, так и на Baichuan. Для оценки качества используют стандарнтые 0-шоты, MMLU и CMMLU.
Предложенная метрика выбирает блоки ближе к концу сети (но не самые последние).
Результаты бенчмарков вызывают вопросы, утверждается, что качество на MMLU почти не просаживается вплоть до 28% sparsity, при этом перплексия на wikitext2 возрастает довольно заметно. При таких значениях обычно сеть с трудом два слова связать может, не то что решать задачи на логику).
Безлайны - методы структурированного прунинга в ширину, естественно, бьют. С ShortenedLLama, вышедшей чуть раньше, не сравниваются.
[Статья][Нет кода]
Метод
Трансформерные блоки, как известно обладают аддитивными 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% без просадки на этом бенчмарке.
Далее смотрят на корреляцию признаков в разных блоках. Наибольшая корреляция (наименьшее расстояние) в блоках ближе к концу, согласуясь с наблюдениями из двух прошлых работ. Отсюда предлагают простое правило - пруньте блоки с конца, исключая последний, и типа хорошо работает.
[Статья][Нет кода]
Метод
Идея по существу та же, что и выше, но выбрасывают блоки не по отдельности, а пачкой - т.е находим группу последовательных трансформерных блоков, которые минимально меняют представление. Критерий тот же самый - косинусная близость.
Как и в 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к контекста (как на обучении), но общая суть от сего не меняется.
[Статья][Пост в телеге][Пост на Хабре][Код]
Интересное релевантное исследование от коллег из 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.
Трансформеры, вероятно, являясь в каком-то смысле ансамблем, устойчивы, как печень, к ампутации крупных кусков. Однако просадки (там где результатам можно доверять - первая и последняя работа), все же значительны при степени сжатия более 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 ошибку близкую к минимально теоретически возможной.
[Статья][Кода нет, но обещают, что будетт]
Было очевидно, что после выхода обновленного 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-х)
Метод валидируют на 🦙-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 компенсироваться более медленной сходимостью?
[Блог]
Торч недавно выкатил блог, где показывает, что 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 карт справедливо следующее неравенство:
И соотвественно, чем медленее меняется attention, тем чаще он переиспользуется.
За счет переиспользования карт attention можно параллелить эффективно между разными GPU разные шаги генерации по времени (уменьшении оверхеда на 50% без переиспользования карт).
Переиспользование карт дает ускорение ~30%. А распаралелливание на 8 GPU дает почти линейное ускорение (8.4x-10.6x) по сравнению с генерацией на одной GPU наивным способом. То есть ускорение достигается в первую очередь за счет эффективного параллелизма.
Тем не менее, достойный инженерный результат.
[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 наивным способом. То есть ускорение достигается в первую очередь за счет эффективного параллелизма.
Тем не менее, достойный инженерный результат.
👍8❤1