Telegram Web Link
Результаты

В первой серии экспериментов используют SDv1.5 в качестве ученика—учителя.
Consistency дистилляция проводится на 80M подвыборке LAION-2B.

Сравнивают модели на промтах из LAION-Aesthetics и COCO2014-Сaptions.

Тандем ученик—учитель с 10 шагами генерации в среднем примерно равен DPM и DDIM с 25 шагами и 50 шагами генерации учителя, соответственно. При 15 шагах даже чуть лучше. При сравнении использовался Refinement подход.
Адаптивный подход лучше, чем просто Refinement.

Что касается автоматических метрик, Refinement и Regeneration имеют примерно одинаковый image reward, Regeneration лучший CLIP (alignment с текстом), а Refinement лучший FID (мера соответствия распределению реальных картинок).

Тандем ученик—учитель поверх SDXL сравнивается с SDXL c 50 шагами солвера и опережает SDXL-turbo.

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

Кроме того метод неплохо сохраняет разнообразие генераций учителя и хорошо себя показывает в text-guided image editing и контролируемой генерации.

Выводы

Красивая идея и результаты, подкрепленные занимательным анализом. Использование нескольких моделей для решения конкретной задачи выглядит действительно сильным подходом, уже неоднократно возникавшим в литературе . Основная сложность именно в том, как оптимально выбрать ту или иную модель и сколько моделей и какие мы можем позволить держать в памяти и применять.
Denoising Diffusion Bridge Models
[Статья][Кода нет, и не обещают]

Введение

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

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

И в данной статье предлагают ответ на данный вопрос.

Метод

Сам подход основан на стандартной теории диффузионных процессов. Однако берется специфичная форма процесса, такая, что удовлетворяет заданным граничным условиям на обоих концах (то что и хочется для задач перехода из одного распределения в другое). В литературе такой процесс известен как Doob h-преобразование. При заданной начальной точке он называется диффузионным мостом.

Далее авторы предлагают формулировку такого процесса для Variance Preserving (с постоянной дисперсией) и Variance Exploding (с растущей дисперсией) расписания шума.

Предложенный подход обобщает генерацию из шума в целевое распределение и OT-Flow-Matching / Rectified Flow.

Результаты

Метод проверяют на задачах image2image - edges2handbags и DIODE-256×256 (как я понял, это не про электронику, а генерацию сцены по маске сегментации) и unconditional генерации.

Предложенный подход заметно опережает GAN-based Pix2Pix и подходы, основанные на диффузионных моделях и работу I^2SB, использующую мосты Шредингера, по метрикам FID и LPIPS.

Unconditional генерация из шума тоже работает весьма достойно на CIFAR и FFHQ, выдавая качество сравнимое с EDM при том же количестве шагов генерации.

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

Вывод

Интересный и разумный подход, адаптирующий имеющуюся диффузионые техники на задачи перехода из одного распределения в другое. Было бы интересно провалидировать подход на большем масштабе и более сложных задачах (с широким распределением данных и высоким разрешением изображений).
2
Вот и подходит к концу 2023 год, выдавшийся очень насыщенным и непростым в различных сферах, но богатый на научные открытия и яркие результаты. Крутые LLMки, запитанные разнообразными Instruction finetuning техниками и датасетами, улучшенные генеративные модели, прогресс в компьютерном зрении, аудио, видео и мульмодальных моделях и многое другое - вот что дал нам этот год.

А какие у вас ожидания от следующего года? Прорыва в какой области и какого результата вы ждете большего всего?
1
Начнем год с маленькой викторинки.

Создадим пустые тензоры из одного элемента следующим образом:
x = [torch.empty(size=(1,))] * 2
И заполним их следующим образом:
1)
for i in range(2):
x[i] = torch.full(size=(1,), fill_value=i)

2)
for i in range(2):
x[i].data = torch.full(size=(1,), fill_value=i)
Ответ на задачку и обьяснение (за спойлером):

1) [tensor([0]), tensor([1])], 2) [tensor([1]), tensor([1])]
Почему так?

Выражение x = [torch.empty(size=(1,))] * 2 создает один обьект в памяти, на который продублированы ссылаются x[0], x[1].

В случае 1) обращение происходит по имени, и x[0] теперь ссылается на обьект tensor([0]) и x[1] на обьект tensor([1]).

В случае 2) обращение происходит по ссылке, и сначала обьект, на который ссылаются как x[0] и x[1] записывается значение tensor([0]), а затем tensor([1]).

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

Когда работал с torch.distributed.gather заполнял тензоры на разных процессах (которые вообще говоря должны были генерировать разные значения), чтобы собрать затем на главном потоке. Какого же было мое удивление, когда увидел копии одного и того же тензора в полученном списке:)
👍3
The LLM Surgeon
[Статья] [Кода нет]

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

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

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

И на помощь приходит приближение матрицы Фишера для данного слоя (линейного или свертки) кронекеровским разложением F = A \otimes G. Первый фактор (матрица ковариации входных активаций) идентичен Гессиану квадратичной ошибки для данного слоя. Второй фактор - матрица ковариации градиентов по выходу слоя. Кронекеровское разложение точно в предположении независимости градиентов по выходу слоя от активаций, которое вообще говоря не выполняется, но попытка - не пытка.

И в данной работе, получилось успешно применить кронекеровское разложение в фреймворке Optimal Brain Surgeon.

Метод

Суть метода в следующем - берут Optimal Brain Surgeon, где вместо настоящего Гессиана используется Кронекеровское разложение и выводят формулы для неструктурированного / 2:4 и структурированного прунинга. Для более высоких уровней прореживания метод применяют итеративно - между итерациями прунинга дообучают LoRA добавки и пересчитывают матрицу Фишера (до 40 раз при прореживании до 50%). Недешевое удовольствие, но качество подымает почти гарантированно.
👍4
Результаты

Метод валидируют на моделях семейства OPT и Llama-2-7b (13b в приложении). Для замера качества традиционно берут перплексию на Wikitext2 (lm_eval_harness 0-shot в приложении). LLM Surgeon уверенно опережает SparseGPT и диагональное Кронекеровское приближение как структурированном, так и неструктурированном пруниге. Конкурентные подходы ломают модель уже при слабом прореживании в то время как LLMSurgeon с серьезной просадкой, но тем не менее сохраняет какое-то качество вплоть до 50%.

Ожидаемо пересчет гессиана и дообучение низкоранговых добавок дает заметный прирост в качестве.

Так как метод оценивает важность параметров на уровне конечного слоя прореживать слои можно неоднородно. Однако, полученное распределение слоев после фильтрации по глобальному порогу сравнительно однородное для LLM Surgeon - первый и последний слой прореживаются несколько сильнее, чем слои посередине (немного неожиданно). Разные виды проекций (Q, K, V, O proj и в FC1/2) тоже прореживаются достаточно однородно (в отличие от Global Magnitude и диагональных приближений).

Вывод

Весьма достойный результат, хоть и недешевой ценой. Выглядит на текущий момент, как SOTA метод для языковых моделей размером порядка нескольких миллиардов параметров, где блочно-диагонально Фишеровское приближение становится непомерно дорогим, а предложенный метод (требующий дополнительной памяти порядка 2 размеров модели) является еще подьемным (пусть даже с шардингом, но в пределах одной вычислительной ноды). Метод заметно дороже, чем SparseGPT, который отрабатывает за 5 минут на LLama-2 на одной GPU, против 2 с лишним дней на 4x H100 для LLM Surgeon. Учитывая запрос сообщества на ускорение LLM, цена вполне приемлемая. Было бы полезно скомбинировать метод с квантизацией.
👍6
Вот думаю, разобрать ли у себя в блоге Mamba и PowerInfer?

Статьи уже возникали в блогах уважаемых тг каналов, но как мне кажется ряд интересных мыслей и нетривиальных наблюдений/решений все же были не затронуты в обзорах, о которых было бы интересно поведать.
Mamba: Linear-Time Sequence Modeling with Selective State Spaces
[Статья] [Код]

Введение

Поиск архитектуры, способной сбросить трансформеры с пьедестала, по своей важности можно сравнить с поиском философского камня или высокотемпературного сверхпроводника. Время от времени появляются работы (S4, RWKV, RetNet), в которых предъявляют архитектуру конкурентную или превосходящую по эффективности/масштабируемости трансформер, но по какой-то причине научное сообщество и пользователи до сих пор сидят на трансформерах, и все самые высокопроизводительные foundation модели так или иначе зиждятся на self-attention.

Одна из наиболее интересных попыток предъявить альтернативу - была серия работ по state-space моделям (S4, H3, Hyena). Однако показав хорошее качество на ряде задач, связанных с обработкой последовательностей, аудио, они не стали сильны в общей задаче языкового моделирования.

В этой работе проанализировали недостатки и ограничения существующих state-space моделей и предложили модификацию, устраняющую или минимизирующую эти недостатки.
🔥2
Метод

State-space модель по существу - это рекуррентная модель вида (в дискретной форме):

h_{t} = A h_{t-1} + B x_{t}
y_{t} = C h_{t}


Где x - вход, h - скрытое состояние, y - выход. A, B, C - обучаемые матрицы параметров, параметризованные специальным образом. Есть еще шаг дискретизации и преобразование из непрерывной формулировки в дискретную с некоторым шагом дискретизации \Delta. В отличие от типичной рекуррентной архитектуры а-ля vanilla RNN, LSTM между h и y нет нелинейности. Благодаря этому формулу можно развернуть и представить в виде свертки, которая эффективно параллезируется на GPU.

Важно, что проекции A, B, C не зависят от времени, и динамика состояний сети обладает свойством Linear Time Invariance (LTI). Данное свойство накладывает ограничения на возможность моделирование определённых зависимостей и авторы рассматривают пару синтетических задач, которые принципиально не решаются state-space моделями с LTI:

1⃣️️️️️️ Selective Copying, где нужно запомнить и вывести несколько элементов последовательности с произвольным расстоянием между запоминаемыми элементами.
2⃣️️️️️️ Induction Heads, где приняв начало словосочетания на вход, на основе полученной ранее информации - продолжить. Если на входе Harry, выдать следует Potter (прочитай другую книгу…).

Данные задачи требуют от модели способности работать с неоднородными временными последовательностями и адаптивно учитывать контекст, которой нет в state-space моделях со статичными сверточными ядрами.

Авторы вводят два понятия с похожим звучанием, но разным значением:
🔵️️️️️️ Efficiency (компактное внутреннее состояние и дешевизна вычислений)
🔵️️️️️️ Effectiveness (способность хранить релевантную информацию)

Трансформер effective - так как может хранить в себе (во всяком случае в теории) контекст произвольной длины. Но не efficient, ибо состояние (key и valuе кэш) растет пропорционально длине последовательности, что делает инференс трансформера дорогим по памяти и вычислениям. Причем большинство хранимой информации избыточно.

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

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

Чтобы добиться данного свойства, авторы предлагают делать параметры state-space модели зависящими от входа - проекции A, B, C, как и шаг \Delta. Последнее позволяет заодно учитывать и временную неоднородность.

Развернуть рекуррентную зависимость как для LTI state-space модели теперь не получится. Вместо этого авторы реализуют эффективный алгоритм parallel scan на кастомных чудо-kernel дающий высокую производительность.

Чтобы иметь возможность запихнуть много информации в скрытое состояние, используют большой expansion фактор внутри SSM (10-100). Современные GPU зачастую memory-bound, потому чтобы не тратить драгоценные миллисекунды на перекачку данных из HBM в кэш GPU, это расширенное состояние материализуется только на GPU.

И в духе Flash Attention (один из авторов - автор Flash Attention) чтобы дополнительно сэкономить на памяти и ее трансфере, промежуточные состояния отправляются в /dev/null после прямого прохода и пересчитываются снова на обратном проходе.

Далее авторы, предлагают полностью однородную архитектуру, состоящую только из Mamba блоков, в то время как трансформер - перемежающиеся attention блоки и MLP, и прошлые state-space модели состояли собственно из state-space слоев и gated MLP.

Так как алгоритм впридачу к свойствам S4 новый тип state-space слоев обладает селективностью (selective) и использует сканирование (scan) для краткости авторы обозначают новый тип архитектуры - S6.
👍5🔥1
Результаты

Авторы валидируют новую архитектуру на следующих задачах:
1⃣️️️️️️ Selective Copy и Induction Heads
2⃣️️️️️️ Language model pretraining
3⃣️️️️️️ Моделирование ДНК
4⃣️️️️️️ Моделирование и генерация аудио

На Selective Copying S4, H3 и Hyena выдают качество порядка 20-60% в то время как S6 достигает почти 100% качества. На Induction Heads как трансформеры с разными позиционными энкодингами, так и прошлые state-space модели не обобщаются далеко за пределы контекста увиденного на обучении. А S6 + Mamba выдает стабильно хорошее качество на последовательностях любой длины.

Mamba + S6 достойно себя показывает на языковом моделировании при обучении на Pile, демонстрируя масштабируемость на уровне и даже чуть лучше, чем трансформер архитектуры LLama-2, со всеми последними достижениями и наработками в развитии архитектур данного семейства. H3, RetNet, Hyena, RWKV заметно отстают. Обучают модели следуя предписаниям Chincilla размером от 130M до 2.8B. Mamba заметно опережает по качеству открытые модели сопоставимого размера, а иногда и вдвое большие.

На моделировании ДНК Mamba превосходит уже заметно Трансформер и state-space модели прошлых поколений. Модели, кстати, совсем небольшие, 1.4M и 7M параметров.

На генерации аудио Mamba сильно опережает по метрикам прошлую SOTA DiffWave+ SaShiMi и иные подходы. S4+ MLP, стоит отметить, работает тоже весьма достойно.

На больших последовательностях Scan из Mamba работает куда быстрее, чем даже оптимизированный FlashAttention-2. Авторская реализация Scan в десятки раз быстрее той что в торче. Благодаря эффективности по памяти в одну GPU можно пихать гораздо больший батч, чем в трансформер. Например, 6.9B Мамбе можно скормить 128 последовательностей длины 2048 и не поперхнуться.

В ablation показывают, что полезно иметь все параметры state-space модели A, B, C, \Delta обучаемыми. Но больше всего накидывает \Delta. Комплексная параметризация A не накидывает по сравнению с нормальным распределением. Expansion внутреннего состояния улучшает качество - чем больше фактор, тем больше информации можно запихнуть в скрытое состояние. По ходу работы пользуются N=64.

Вывод

Выглядит весьма впечатляюще, крутая работа с хорошим анализом и мотивацией, серьезными инженерными достижениями и убедительными результатами. Однако, все же интересно, сможет ли Mamba родить “убийцу трансформеров”, или останется одной из многих, пусть и сильных попыток ограниченной успешности. Самая большая модель, которую использовали в бенчмарках по качеству имеет размер менее 3B параметров, что немного по современным меркам. Как признаются сами авторы, масштабирование архитектуры дальше может породить новые технические сложности и вызовы. Поживем-увидим, как говорится.
🔥9
PowerInfer: Fast Large Language Model Serving with a Consumer-grade GPU
[Статья] [Код]

Введение

За последние пару лет LLMки забавно прибавили в весе и многие модели не влезают в типичную пользовательскую GPU. А инферить умного ассистента локально ой как хочется.

Как выход, можно держать веса в ОЗУ или на диске и подгружать по мере необходимости - то есть заниматься offloading, Есть GPU-centic offloading, когда все вычисления происходят на GPU, и Hybrid Offloading (используемый в llama.cpp), где часть вычислений на GPU, а часть на CPU.

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

Метод

В Deja Vu ранее было замечено, что в слоях трансформера активируется малая часть активаций для конкретного входа. Здесь же развили идею и заметили, что нейроны активируются неравномерно, и некоторые активируются часто - так называемые “горячие🔥, а другие же только время от времени (“холодные❄️). В частности, для OPT-30B 26% (для Llama-2-70B 43%) наиболее часто активируемых нейронов отвечают за 80% суммарной величины активаций. Статистики активаций считаются в offline режиме на подвыборке из c4 и wikipedia.

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

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

На GPU мы работаем с матрицами фиксированного размера, и потому пользуемся эффективными ядрами для GEMM, а для CPU, обладающим куда меньше параллелизмом, отдельные вектор-векторные произведения считаются и так эффективно.
👍52
Результаты

PowerInfer тестируют на моделях семества OPT/LLama 2 и Falcon. Код основан на llama.cpp. Рассматривают 2 конфигурации, PC-high - с Intel i9-13900K и RTX 4090 PC-low и i7-12700K c RTX 2080Ti. Нормальные такие геймерские компы.

PowerInfer достигает впечатляющего ускорения в 11 раз на длинных последовательностях и моделях OPT-30B, Falcon-40B. На Llama 2 ускорение не столько велико (до 3х раз), но тоже весьма достойно. В PowerInfer большинство вычислений происходит на GPU, в то время, как в llama.cpp основную вычислительную нагрузку берет себя не столь быстрый CPU.

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

Метод дает ускорение и при квантизации в 4 бита.

Оверхед от предикторов холодных нейронов мизерный по сравнению с общим методом инференса.

Качество моделей не просаживается статзначимо при используемой схеме fixed + contextual sparsity (а если проверить на MMLU?).

Метод настолько хорош, что даже на относительно слабой RTX 4090 на коротких последовательностях метод уступает всего лишь на 20-30% в скорости vLLM (оптимизрованному GPU движку) на A100.

Вывод

Полезный и сильный результат, основанный на наблюдениях из прошлых работ. По существу сочетание fixed и contextual sparsity с эффективной реализацией, учитывающей специфику вычислений на CPU и GPU.
4
Fast Inference of Mixture-of-Experts Language Models with Offloading
[Статья][Код]

Введение

Смеси экспертов (MoE), использующие лишь часть параметров на инференсе, дают значительную экономию вычислений. Однако SOTA-модели оказываются слишком тяжеловесными для многих GPU и встает вопрос эффективного оффлоадинга.

Наивная подгрузка экспертов работает довольно медленно из-за передачи большого обьема данных с ОЗУ/RAM на GPU. Возникает вопрос - можно ли оптимизировать данную процедуру?

И ответ, как можно было заранее догадаться, — да 😅.

Метод

Чтобы понять, как оптимизировать загрузку экспертов, авторы смотрят на то, как активируются эксперты. И оказывается, что в конкретном слое один и тот же эксперт может активироваться 2-4 раза подряд, потому если их оставлять в памяти, они будут доступны при прогонке следующего токена. Отсюда возникает идея поддерживать LRU кэш токенов, и сгружать экспертов на диск по необходимости.

Следующий нюанс в том, как загружать следующие блоки. Для обычных трансформеров никакой проблемы нет, но для экспертов заранее неизвестно, какие активируются. Но можно воспользоваться стратегией из De Javu, где предсказывали активные нейроны по активациям предыдущего блока, и отбирать экспертов, подавая в gating функцию на следующем блоке текущие активации (speculative loading). Это работает в силу residual структуры трансформера.

Чтобы уменьшить размер модели, используется квантизация HQQ. Не самый очевидный выбор, ибо это Data-Free квантизация, уступающая более продвинутым подходам. Но раз работает, то и ладно. QMoE, говорят, не завелось (может надо было квантовать в больше, чем 1 бит?). Attention квантуют в 4 бита, экспертов в 2 и 3 бита.

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

Рассматриваются две конфигурации системы - условный Colab с бесплатной GPU и хороший геймерский ПК. Для GPU c 12Gb VRAM можно держать кэш из 2 экспертов, а для 16Gb - влезают 4.

Чем больше размер кэша - тем больше hit-ratio (вероятность того, что эксперт лежит в кэше) и точность удачного speculative loading.
Выбранная схема квантования более менее оптимальна, так как квантизация attention в меньшее число бит уже сильно просаживает качество, а 4 бита некритично хуже fp16. Конечные конфигурации в 4-5 раз меньше по размеру базовой модели. Некоторая просадка по качеству на бенчмарках есть, но приемлемая.

Все компоненты метода - LRU-cache, пре-подгрузка экспертов заметно ускоряют инференс. Итоговое ускорение порядка 2-2.5 раз на RTX3060/RTX3080 и до 3.5 раз на T4 по сравнению с наивной реализацией в accelerate. Для прикола замеряют еще и на A100, куда влезает квантованная модель и так (для сравнения).

Вывод

Простой и разумный подход с практически полезным результатом. По всей видимости, умный оффлоадинг - одно из самых, если не самое перспективное направление, ускорения моделях на пользовательских устройствах. Однако, букву “О” гармонично вставить в название канала не получается. Кажется, что результаты работы можно улучшить за счет более сильного алгоритма квантизации экспертов, уменьшив просадку качества.
👍9
RoSA: Accurate Parameter-Efficient Fine-Tuning via Robust Adaptation
[Статья] [Код]

Введение

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

Однако, данное утверждение - приближенное, и поэтому LoRA, по всей природе неспособная учить высокоранговые добавки, не всегда сравнивается по качеству с дообучением всей модели.

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

Основная техническая сложность использования разреженных матриц - эффективная реализация на GPU. Благо при сильном прореживании неплохо работают ядра из специальных библиотек, в частности, sputnik.

Метод

Как можно догадаться, суть работы в том что совместили низкоранговый и low-rank adapter и дообучили на downstream задачах. Разреженную маску получают на основе самых больших элементов диагонали матрицы Фишера. Авторы отмечают, что отдельно диагональ для sparse адаптера работает не очень, но хорошо в связке с низкоранговым адаптером.

Авторы анализируют точность приближения суммой низкорангового и sparse приближения на одном слое, и оказывается, что минимум ошибки достигается при сопоставимом вкладе от low-rank и sparse компоненты. Чем больше доля параметров от исходной - тем эффективнее перекладывать в sparse (который уже не такой sparse).

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

Метод валидируют на Llama-2-7b и датасетах Viggo, GSM-8k (математика без подвоха 🤡), SQL. При фиксированном бюджете некоторая смесь, обычно с примерно равной долей sparse и low-rank компоненты, дает лучшее качество. По отдельности low-rank и sparse не так хороши. Больший адаптер работает обычно лучше и самой большой (с суммарным числом обучаемых параметров 160M) почти сравнивается по качеству с полным файнтьюном. Все эксперименты влезают на одну RTX3090 (24Gb памяти).

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

Вывод

Поиск эффективных и выразительных адаптеров - архиважная задача, ибо пользователи без high-end GPU только так и могут обучать современные LLMки на целевую подзадачу. LoRA и ортогональные адаптеры OFT показывают себя неплохо в конкретных приложениях, но ограничены в выразительности по природе своей и оптимальный адаптер, по всей видимости, представляет собой некоторую смесь низкопараметрических матриц. Ее правда, надо еще сначала найти 😅️
👍4🔥1
Marlin
[Статьи нет, обычно наоборот][Код]

Marlin, Mixed Auto-Regressive Linear kernel - новое быстрое ядро FP16xINT4 для инференса LLM с большими батчами.

Как известно, вычисления на современных GPU для современных GPU обычно memory bound, и можно получить заметное ускорение даже с fp умножением за счет одной лишь подгрузки весов в кэши. И идеальное ускорение, которое дает INT4 - 4x. Однако с увеличением размера батча, мы начинаем выходить на compute-bound и выигрыш от имеющихся ядер (не использующих tensor cores) исчезает, то есть они становятся медленее fp16 native матричных операций.

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

1️⃣ префетчинг
2️⃣ использование активаций в вычислениях несколько раз до загрузки / сгрузки
3️⃣ асинхронная загрузка весов модели
4️⃣ тонкая настройка порядка операций квантования / деквантования и матричных умножений с tensor cores для максимальной утилизации железа
5️⃣ оптимизация конфигурации варпов (групп потоков на GPU)

В итоге удается достичь почти идеального speedup - 4x по сравнению с fp16 на батчах до 32, и иметь ускорение даже на больших (64-128), в то время как безйлайны из bitsandbytes, exllamav2, AWQ становятся в ~2x медленее fp16 с батчей >=16.

Ускорение имеет место на нескольких GPU поколения Ampere - A10, A6000, RTX 3090 и сохраняется даже на пониженных частотах.

На поколении Hopper пока нет реализации.
🔥6
Видала я статьи без кода, но код без статьи! Такого я в жизни ещё не встречала.
😁101
2025/07/14 04:32:25
Back to Top
HTML Embed Code: