Telegram Web
On Architectural Compression of Text-to-Image Diffusion Models
[Статья][Код]

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

1️⃣ Уменьшение количества шагов сэмплирования
2️⃣ Удешевление одного шага сэмплирования

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

Постановка эксперимента

За основу берется Stable Diffusion v1.4. Как известно, данная модель состоит из UNet модели, генерирующей в латентном пространстве, текстового энкодера, и вариационного кодировщика, погружающего в скрытое пространство и из него. Но так как почти все вычисления приходятся на UNet целесообразно сжимать в первую очередь его.

UNet Stable Diffusion состоит из сверточных ResNet блоков и Transformer блоков.

Первое наблюдение, которое делают авторы, — оказывается, что из UNet Stable Diffusion можно вытащить среднюю часть (с наименьшим разрешением карт активаций) с довольно небольшой просадкой по качеству и метрикам без какого либо дообучения, что любопытно. Выходит, что данный участок сети не выполняет серьезной работы, либо сеть, как человеческая печень, продолжает функционировать в штатном режиме при удалении части от нее.

Далее авторы предлагают три варианта уменьшенной Stable Diffusion:
1️⃣ Base. Меньше блоков в верхних слоях.
2️⃣ Small. Без блоков в середине модели.
3️⃣ Tiny. Укорачивание на промежуточных разрешениях.

Обучать с нуля это хозяйство (оригинальная Stable Diffusion обучалась 150к GPU часов на A100) - удел богатых. И авторы прибегают к дистилляции.

Лосс состоит из трех компонент:
1️⃣ исходного denoising loss
2️⃣ mse с учителем
3️⃣ mse между активациями на выходах каждой стадии (перед понижением/повышением разрешения).

Существенная деталь, от которого зависит итоговое качество всей процедуры, — на каких данных следует дистиллировать в условиях ограниченного бюджета? Авторы используют подвыборку из 220k примеров из LAION-Aesthetics с наибольшими оценками по эстетике.
🔥2
Эксперименты

Процедура дистилляции выходит относительно бюджетной по нынешним меркам: обучение самой большой модели BK-SDM Base занимает 300 часов на одной A100.

Для оценки качества генераций модели используется стандартный бенчмарк MS-COCO на реалистичность изображений и соответствие описанию картинки. Дистиллированые BK-SDM несколько просаживаются по метрикам по сравнению с материнской моделью, тем не менее, обладают все еще неплохим качеством генераций. Что интересно, оптимальное качество (по FID) достигается еще до последней итерации.

Авторы демонстрируют, что BK-SDM генерирует лучше GANов, хотя осмысленность подобного сравнения без сопоставления времени генераций выглядит сомнительной.

Полученные модели позволяют генерировать картинку на 30-40% (в зависимости от размера), быстрее чем исходная SD v1.4.

Далее авторы проводят ablation. Инициализация модели-ученика весами Stable Diffusion работает на порядок лучше, чем с нуля, что ожидаемо, учитывая короткое время обучения. Оба лосса в дистилляции - на выходе модели и на уровне промежуточных активаций полезны, и улучшают качество. Больший размер батча немного лучше, чем меньший в среднем по метрикам.

На специализированной генерации с DreamBooth дистиллированные модели почти не уступают базовой Stable Diffusion.

Заключение

Данная статья достигает довольно неплохих результатов по сжатию моделей в условиях ограниченных ресурсов, используя стандартные методы из дистилляции трансформеров. Совсем просадки по качеству избежать не удалось, и, сжатые модели, по всей видимости, более специализированы под генерацию в стиле LAION Aestethics, и, скорее всего, проседают более заметно на промптах из другого распределения. Однако, сама возможность восстановить качество, близкое к исходному, за счет отбрасывания некоторых блоков, говорит о том, что есть некоторая свобода и простор в направлении оптимизации архитектур для диффузионных моделей. Классификаторы ImageNet-1k и бэкбоуны для детекции/сегментации на MSCOCO несколько приелись.
Dataset Quantization
[Статья][Код]

Вопреки обыкновению, данная статья не про квантование нейронных сетей, и даже не про квантование векторов, а про квантование датасетов.

Как известно, чем больше данных, тем лучше итоговая модель.
Однако, обучение на большом датасете требует значительных затрат по времени. Да и данные надо где-то хранить.

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

Существующие методы отбирают примеры либо на основе градиентов по примерам для фиксированной архитектуры, либо model-agnostic способами на основе некоторых эвристик.

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

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

Метод

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

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

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

Для дальнейшего сжатия, авторы оценивают информативность патчей с помощью модифицированной версии GradCam и заменяют на черные квадраты наименее информативные.
🔥1
Эксперименты

Качество работы метода проверяется на CIFAR-10, ImageNet-1k, ADE20k, MS COCO и инструкциях из Alpaca.

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

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

Оптимальное число корзин в районе 10.

Для задач из компьютерного зрения без просадки в качестве удается сжать датасет на 20%, 40%. It aint much but it’s honest work.

Датасет с инструкциями же удается сжать куда лучше (80-98%). Вероятно, потому, что рассмотренные задачи для компьютерного зрения требуют существенной перестройки модели, а instruction tuning - небольшая корректировка весов модели под желаемый паттерн поведения. Кроме того, ранее было показано, что удачно выбранное подмножество из ALPACA-set лучше всего ALPACA.

Кроме того, метод работает за разумное время, от силы час (но непонятно, для какого датасета).

Итог

Задача полезная и востребованная. Однако сам метод не имеет каких-то строгих теоретических гарантий и имеет ограниченные возможности по сжатию датасетов, хоть и превосходит альтернативы. Было бы интересно прогнать на FlanV2, там как раз больше миллиона инструкций. И для генеративных моделей.
Falcon-180B
[Статьи нет, но обещают][Блог-пост на HF]

Свершилось!
Тысячелетний сокол расправил крылья и явился широкой публике во всей красе!
Самая большая модель в публичном доступе, побеждающая все открытые модели на бенчмарках и кое-где даже проприентарные!

Охладим бурю эмоций и перейдем к сути дела.
Модель и правда самая большая - 180 лярдов параметров, чуть больше Bloom и OPT-175B. Обучалась эта здоровенная птица на 3.5Т токенов (против у различных версий Llama-2) из RefinedWeb и других источников - диалогов, статей, кода. Датасет настолько велик, что даже это немалое число меньше, чем одна эпоха. Длину контекста (2k токенов) не меняли.

Возникает вопрос о compute-оптимальности модели, ибо масштабирование по размеру модели больше, чем по количеству данных, а Chincilla law предписывает масштабировать модель и данные примерно одинаково.

На стандартных бенчмарках Falcon-180B опережает все иные модели из находящихся в публичном доступе (без instruction-finetuning). Хотя памятуя о том, что ранее была выявлена лажа с валидацией меньшей версии модели [1], требуется независимая экспертиза научного сообщества для проверки справедливости заявлений.

Архитетурно большой сокол не отличается существенно от меньших соколиков, за исключением multi-query attention, по аналогии с Llama-2.

Учитывая, колосалльный размер модели, ее инференс и файнтьюнинг представляет определенные сложности. Если самую большую Llama/Llama-2 можно без проблем засунуть на одну A100 (80Gb), а в 4-бита через bitsnandbytes / gptq интеграцию и на A100 (40Gb) / RTX A6000, то Falcon 80Gb не влезает целиком ни на одну GPU стандартными методами, без квантизации в менее чем в 4 бита.

Блог содержит информацию о требуемых ресурсах для запуска модели. Однако, есть вопросы к приведенным в таблице цифрам, ибо QLoRA вряд ли требует меньше памяти, чем инференс с GPTQ с той же битностью. С 4 битной квантизацией, на батче размера 1 и последовательностью длины порядка ~1k должно выходить ~90 Gb. Без информации о длине последовательности непонятен расход память на kv-кэши.

Некоторые утверждают [2], что Falcon-180B лучше справляется со сложными промптами, чем GPT-3.5 и LLama-2.

Возможно, статья приоткроет интересные подробности об обучении модели, хотя скорее всего размер модели и данных играют определяющую роль. Статья про Llama-2 примечательна в первую очередь дообучением модели под чатбота и заточкой ее под полезность и безопасность. Предполагаю, что нечто подобное будет предьявлено и для Falcon-180B.

[1] https://twitter.com/Francis_YAO_/status/1666833311279517696
[2] Обсуждение на reddit
🔥3
Memory-Efficient Selective Fine-Tuning
[Статья][Кода нет]

Введение

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

На GPU надо как-то разместить модель + состояния оптимизатора, и промежуточные активации, необходимые для большинства операций на обратном проходе. Для экономии памяти на состояниях оптимизатора существуют различные методы PEFT. Но память, расходуемая на хранение активаций, тоже бывает весьма существенной, особенно при обучении на больших батчах и длинных последовательностей. Есть давно известный способ - gradient checkpointing - позволяющий экономить расход по памяти за счет дополнильных вычислений, но в идеале хотелось бы обойтись без этого.

Метод

В рассматриваемой статье предлагается делать backprogation только через часть выбранных случайным образом токенов (одинаковых для всех блоков трансформера), а для остальных можно высвобождать активации после выполнения операции. При длине последовательности L и количестве выбранных токенов k экономия по памяти L/k раз.

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

Результаты

Авторы проверяют свой метод на бенчмарках из GLUE, используя маленькую по современным меркам BERT-Large модель. При одинаковых гиперпараметрах процедуры обучения (за исключением подбираемого индивидуально под каждый метод learning rate) Selective finetuning c k=16 не сильно уступает full-finetuning и слегка опережает LoRA.

Далее авторы показывают, что их метод гораздо лучше масштабируется с размером батча по сравнению с альтернативами. Кроме того, Selective finetuning можно применять в связке с LoRA для экономии на активациях и состояниях оптимизатора одновременно.

Потом приводится ablation качества с количеством выбранных токенов. Первоначально качество модели сильно улучшается с ростом k, но затем выходит почти на плато.

Вывод

Идея проста в реализации и довольно интуитивна. Интересно, насколько хорошо полученные в статье результаты будут обобщаться на другие задачи, например, пресловутый instructing finetuning. Да и GLUE содержит преимущественно последовальности длиной в несколько десятков токенов. Идея об экономии памяти за счет использования части токенов не нова, например, работы по token pruning и merging (DynamicViT, Differentiable Patch Selection, ToMe и др) предлагают оставлять только часть или объединять в один несколько токенов по ходу прогонки последовательности через трансформер. Здесь же длина последовательности фиксирована и экономия достигается за счет backward pass.
Для полноты картины нехватает сравнения с gradient checkpointing по скорости шага обучения и расходу памяти.
InstaFlow: One Step is Enough for High-Quality Diffusion-Based Text-to-Image Generation
[Статья][Кода нет]

Введение

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

Для уменьшения количества шагов генерации были разработаны продвинутые солверы, способы дистилляции учителя в ученика с меньшим количеством шагов сэмплирования. Но при стремлении количества шагов к единице, у всех методов неизбежно проседает качество генераций. В режиме одношаговой генерации новые архитектуры GANов, которые, как известно, не обучаются без жертвоприношений богам Хаоса и Разрушения, все еще остаются лучшими по качеству. Была еще работа по Consistency Models, но ее не проверяли в практически интересном сценарии.

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

В рассматриваемой предлагается способ одношагового сэмплирования, который, как утверждается, дает одновременно хорошее качество генераций и работает всего за один шаг.
🔥4
Метод

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

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

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

А чтобы выпрямить траектории, авторы предлагают Rectified Flow - метод итеративного выпрямления траекторий.

Суть метода заключается в следующем: у нас есть изначальный метод генерации (сеть + солвер), выдающий некоторые траектории X(t). А новая сеть должна за один шаг, стартуя из начальной точки X(0) , попасть в X(t), но уже по прямому пути. А затем процесс повторяется с использованием сети с последней итерации для генерации траекторий. Таким образом, постепенно траектории становятся все более и более прямыми. Фиксированная точка итеративного процесса, когда прошлый генератор траекторий совпадает с текущим - и есть генератор идеально прямых траекторий.

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

Далее, последнюю модель с RectifiedFlow дистиллируют в модель, предсказывающую картинку из шума за раз. В качестве функций потерь на данной стадии используют MSE и the Learned Perceptual Image Patch Similarity (LPIPS), более коррелирующий с человеческим представлением о качестве изображения.
Эксперименты

За основу авторы берут StableDiffusion v1.4 и ее же пробуют наивно дистиллировать по шагам (на исходных траекториях) и с использованием RectifiedFlow.

Наивная дистилляция приводит к сильной просадке качества и некрасивым, нереалистичным картинкам, в то время как полученные при дистилляции с RectifiedFlow картинки выглядят значительно лучше, хоть все еще не дотягивают до уровня базовой модели. Сам RectifiedFlow при том же числе шагов, что и базовая модель, имеет +/- то же качество.

Далее авторы, экспериментируют с разными параметрами и модификациями сети

2 этапов выпрямления достаточно, и большее количество шагов выпрямления уже не отражается существенно на качестве. Для повышения выразительности сети, предлагается соединить (как два вагона железнодорожного состава) исходную сеть с ее копией (тоже инициализированной весами Stable Diffusion). Полученная сущность называется - StackedUNet. При значительном приросте качества (снижении FID с 20 до 13.7) время инференса растет не так сильно (c 0.09с до 0.12c на сэмпл). Архитектурный StableDiffusion, которая учится предсказывать за один шаг - называется Instaflow-0.9B. А Stacked версия - Instaflow-1.7B.

Конечный пайплайн обучения выглядит следующим образом:
1️⃣ 2 шага RectifiedFlow, второй шаг с большим размером батча
2️⃣ Дистилляция в Instaflow с MSE лоссом
3️⃣ Дистилляция в Instaflow с LPIPS лоссом

Почему дистилляция проводится с разными лоссами, а не их взвешенной комбинацией - не понятно.
Instaflow-0.9B(1.7B) в 30 (24) раза быстрее базовой StableDiffusion, хоть и с некоторой потерей в качестве (13.10(11.83) против 9.62 на замерах FID-30k на MS COCO 14). При том же бюджете на время, модель выдает сопоставимые метрики с GANами (превосходя StyleGAN-T, но проигрывая GigaGAN).

Потом авторы сравнивают генерации StableDiffusion и Instaflow на разном количестве шагов генерации, и StableDiffusion ожидаемо дает низкокачественные и мыльные картинки на малом количестве шагов, а Instaflow - вполне приемлемого качества.

Если смотреть на конкретные пиксели при отдельности, то в StableDiffusion их значение меняется по сложным траекториям, а у RecitifiedFlow почти по прямой.

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

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

Instaflow из коробки комбинируется с Refiner и SuperResolution в SDXL, и полученные картинки выглядят вполне себе сносно.

Вся процедура обучения занимает 108 для Instaflow-0.9B и 130 для Instaflow-1.7B A100 GPU дней, соответственно, что не так много по нынешним меркам (StableDiffusion v1.4 обучалась 6250 A100 GPU дней). Обучение RectifiedFlow и дистиллированной модели не успело сойтись до конца, так что при более длительном обучении качество может еще возрасти.
🔥1
Вывод

Метод довольно прост и интуитивен, хоть и поди догадайся так сам придумать. Просадка по качеству генераций довольно заметна по сравнению с исходными моделями, но при таком ускорении результат все равно довольно впечатляющий. Наверняка, кто-то из бигтехов / исследовательских лабораторий с большими вычислительными ресурсами попробует воспроизвести идею. Генерация картинок за прогон - это движение в сторону к real-time генерации, снижении расходов на генерацию контента, улучшение useer experience. Будем посмотреть.
🔥1
Beyond Surface Statistics:
Scene Representations in a Latent Diffusion Model

[Статья][Кода нет]

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

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

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

В данной работе, авторы находят еще 2 применения внутренним представлениям - salient object distinction и depth estimation.

Постановка

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

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

Рассматривают две постановки задачи - discrete binary depth, где предполагается разделять примечательные объекты и фон, и continious depth estimation с вещественными метками.
🔥2
Эксперименты

Для обучения линейных классификаторов авторы генерируют датасет из 1000 картинок с помощью Stable Diffusion и размечают на salient object distinction и depth estimation при помощи моделей Tracer и MiDaS. Промпты для картинок берут из LAION-AESTHETICS v2. Затем из датасета фильтруется непотребный контент и изображения без понятия о глубине. То, что остается, содержит 617 примеров и разбивается на обучающую и тестовую выборку в отношении 246/371 пример.

Метки имеют разрешение 512x512, а предсказания классификатора - куда меньшее разрешение скрытых представлений Stable Diffusion, потом последние интерполируют до размера конечного изображения.

Для оценки качества сегментации salient objects используется Dice Score и RMSE для предсказания глубины.

Для saliency distinction / depth estimation пробуют признаки с разных блоков UNet-а и разные шаги диффузии. Существенной разницы между выбором блока нет, а вот что примечательно понятие о глубине возникает на ранних шагах расшумления, еще задолго до того, как изображение напоминает что-то осмысленное. То есть расположение обьектов на сцене формируется еще до того, как из шума начинают выделяться обьекты. Интересно, что даже карты активаций низкого разрешения позволяют выделить мелкие обьекты.

Stable Diffusion со случайно инициализированными весами ожидаемо дает низкое качество линейного классификатора.

Авторы проверяют, что глубина заложена в UNet-е, а не VQ-VAE, преобразующем из латентного пространства в пространство изображений. Попытки обучить классификатор на признаках из VQ-VAE приводят к фиаско.

Вдобавок ко всему прочему, авторы демонстрируют, что с предложенный подход позволяет двигать сцену во время генерации. А именно, обученный классификатор выделяет некоторую исходную маску, есть некоторая желаемая позиция - левее, правее, ниже, выше. И с помощью градиентного спуска по предсказанному шуму, его модифицируют таким образом, чтобы целевой объект находился в желаемой позиции. Фон при этом может сильно измениться.
🔥1
Вывод

Диффузионные модели, хоть и обучаются явно только на генеративное моделирование, в качестве приятного бонуса содержат в себе кладезь различной полезной информации, и в некотором роде могут рассматриваться как foundation models в области компьютерного зрения. Задача предсказания шума является dense-prediction task, потому можно предположить, что признаки из диффузионок более подходят для сегментации/детекции и прочих задачах с множественными предсказаниями по сравнению с image-level обучением - классификацией ImageNet, CLIP, разными SSL методами.
👍2
LongLoRA: Efficient Fine-tuning of Long-Context Large Language Models
[Статья][Код]

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

В литературе были предложены разные стратегии дообучения на длинные последовательности - но стандартное обучение вычислительно затратно, требует нескольких машин для современных LLM. А стратегии, модифицирующие attention, retrieval-based подходы обычно несколько хуже по качеству. Да и не все могут использовать преимущества эффективных CUDA-кернелов а-ля Flash Attention.

Метод

Метод прост как пробка и относится к разряду - где-то я уже это видел, тем не менее любопытен. Токены группируются по окнам некоторого размера порядка длины контекста на обучении и attention делается только в пределах этих окон.

Чтобы информация протекала между группами, в половине групп маска attention сдвинута на половину размера группы. Технически это реализовано следующим образом - в половине голов attention применяются обычные окна, в другой половине - сдвинутые. Метод явно вдохновлен работой по Swin.

Группы перегоняются в размерность батча перед операцией attention, поэтому реализация не требует существенных усилий.

Другой источник дороговизны обучения - состояния оптимизатора, и потому авторы предлагают использовать LoRA для дообучения. Наивное применение, без предложенной выше стратегии работы с Attention экономит по памяти на градиентах и моментах Adam, но не самих операциях и активациях, и кроме того, не обладает достаточной выразительностью, чтобы выучивать длинный контекст. Предложенный же метод по сути работает с исходным Attention, поэтому не требует существенного дообучения.

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

Предложенный метод валидируется на ряде бенчмарков по языковому моделированию с большим контекстом - PG19, proof-pile, topic retrieval на LongChat. Для обучения используется RedPajama.

LongLoRA работает значительно лучше обычного файнтьюна с LoRA, и не сильно уступает полному дообучению (там где это было посильно).

Сдвиг окон важен для качества, причем, если его делать в головах attention, а не в чередующихся последовательных блоках - качество немного выше. Dilated, sparse attention на данных задачах показывают себя плохо.

Упомянутый ранее тюнинг эмбеддингов и нормализаций, называемый LoRA+, неплохо накидывает.

Дообученная таким образом LLama-2 13b выступает на одном уровне или даже бьет специализированные модели под длинный контекст такие как MPT-Storywriter, LongChat.

Вывод

Простая идея, которую можно быстро применить. Не хватает однако сравнения с парой бейзлайнов - LM-Infinite, например, не требующей вообще никакого дообучения. Да и непонятно, насколько подход универсален.
🔥1
Pruning vs Quantization: Which is Better?
[Статья][Кода нет]

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

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

Метод

В данной работе авторы используют симметричное квантование к ближайшему значению на сетке (round-to-nearest) и magnitude (неструктурированный!) pruning, как простые для анализа и самые распространенные на практике. Размер и качество модели сравнивается относительно fp16 модели.
🔥1
Эксперименты

В первой части исследования авторы смотрят на норму разницы между исходными и сжатыми весами, или если быть точнее, log SNR разницы.

Сначала рассматривают аналитические распределения - нормальное и обрезанное t-распределение Стьюдента, чтобы моделировать тяжелые хвосты.

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

Для t-распределения Стьюдента при сильном сжатии и kurtosis (меры тяжести хвостов распределения) прунинг может быть лучше квантизации, однако такое распределение редко встречается на практике.

Затем авторы берут 46 моделек из torchvision и вновь смотрят на ошибку приближения весов и почти все оказывается, что при заданном сжатии у квантизации ошибка меньше.

Далее авторы смотрят на ошибку уже на выходе слоя и рассматривают более продвинутые алгоритмы прунинга и квантизации в сценарии post-training compression (то есть без дообучения), оптимизирующие ошибку на уровне слоя. Выводы, тем не менее, те же, что и раньше.

Но сохраняется ли преимущество квантования после обучения сжатой модели?

Оказывается, что да. Авторы берут несколько архитектур - ResNet, MobileNet, EfficientNet, ViT и прогоняют sparse training / quantization aware training, соотвественно, сжатых моделей на ряде задач компьютерного зрения - классификации, сегментации, детекции, и почти всегда квантованная модель оказывается лучше запруненной. Гиперпараметры процедуры обучения одинаковы в обоих случаях для честного сравнения.

Здесь стоить важную ремарку, что модели сжимают за один раз, в то время как для прунинга куда оптимальнее сжимать итеративно (и тот же MobileNet-V3 вполне реально сжать до 87.5% с умеренной просадкой в качестве).

Вывод

Довольно интересное, хоть и сравнительно короткое исследование. Наверное, основной вывод естественен, что небольшие пертурбации всех весов влияют на качество модели меньше, чем большие у части. Вероятно, результат зависит еще от деталей процедуры обучения, в особенности, weight decay. И было бы интересно посмотреть на аналогичное исследования для языковых моделей. Кроме того, прунинг можно комбинировать с квантованием и можно поставить задачу поиска оптимального соотношения между прунингом и квантованием. Тем для будущих исследований предостаточно…
👍4🔥2
QA-LoRA: Quantization-Aware Low-Rank Adaptation of Large Language Models
[Статья][Код]

Давеча коллеги из Хуавей подогнали статью про квантование и дообучение больших языковых моделей.

Как известно, квантование позволяет значительно уменьшать размер модели и ускорять большие языковые модели, а низкоранговые адаптеры, упоминаемая чуть не в каждом посте LoRА, дообучать в условиях ограниченных ресурсов.
Однако, квантование применяется к исходной модели перед ее дообучением, поэтому при вливании низкоранговых адаптеров в модель придется переквантовывать модель, что может привести к заметной просадке качества.

И в этой статье авторы исследую причины, приводящие к просадке качества при переквантовании модели и предлагают способ бесшовного слияния LoRA c весами базовой модели.

Сразу скажу, что в статье есть несколько некорректных утверждений и ослабления бейзлайнов, по невнимательности или по злому умыслу.
Наиболее близкая по теме статья - разобранная ранее QLoRA. Напомню, что там модель квантуется в 4 бит, и поверх квантованной модели обучается низкоранговый адаптер на Instruction Finetuning.

Авторы QA-LoRA утверждают, что выгода от этого подхода только во время обучения, так как на инференсе все равно придется сливать веса с адаптерами. Но данное утверждение более чем спорно, ибо можно параллельно прогонять вход через квантованные веса и floating-point адаптер, и накладные расходы на последний довольно маленькие (так как типичный ранг добавки r в сотни и тысячи раз меньше размерности в сети).
🔥1
Метод

Наивное квантование работает не очень хорошо из-за несовпадения степеней свободы у квантования и низкоранговой добавки. На каждый входной канал приходится один скейл и один zero (вообще-то нет), и при этом r чисел в адаптере. Но чтобы можно было просто взять и поменять параметры квантизации, нужно чтобы все r чисел в адаптере, соотвествующие конкретному ряду матрицы, были одинаковы. Что по сути ограничивает LoRA одноранговой добавкой.

Чтобы как-то повысить выразительность, предлагается (о боже!) квантовать входную размерность малыми группами, и тогда ранг добавки следует делать равным числу групп. И после этого можно сливать добавку без проблем.
Тут стоит напомнить, что маленькие группы (размера 64), которые дополнительно квантуют, - одна из ключевых идей в QLoRA.

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

Чтобы провалидировать предложенный подход авторы квантуют модель с помощью GPTQ с размером группы 32 и дообучают LoRA на ALPACA и FLANv2.

Для валидации используются MMLU и ряд других стандартных бенчмарков языковых моделей - ARC, Hellaswag, PIQA,
Замечу, что используемый размер группы дает более, чем 0.5 бит на параметр, что не пренебрежимо мало.

QA-LoRA на 4 битах несколько уступает QLoRA без вливания но уверенно бьет варианты с вливанием весов и повторным квантованием, как и PEQA с дообучением скейлов в квантизации. Метод неплохо себя показывает при низких битностях, давая качество статистически выше случайного даже при двух битном квантовании (качество случайного классификатора на MMLU - 25%).

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

Размер подвыборки FLANv2 заметно влияет на качество, особенно при квантовании в низкую битность.

Выводы

Интересная постановка задачи и подход, однако мотивация метода строится сразу на нескольких неверных утверждениях - дороговизне инференса QLoRA , отсутствия квантования малыми группами в QLoRA. Используемые группы даже меньше, чем в QLoRA, потому расходы на хранение статистик квантования, как было выше сказано, довольно существенны.
🔥1
2025/08/27 16:57:49
Back to Top
HTML Embed Code: