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, обладающим куда меньше параллелизмом, отдельные вектор-векторные произведения считаются и так эффективно.
[Статья] [Код]
Введение
За последние пару лет 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, обладающим куда меньше параллелизмом, отдельные вектор-векторные произведения считаются и так эффективно.
👍5❤2
Результаты
PowerInfer тестируют на моделях семества OPT/LLama 2 и Falcon. Код основан на llama.cpp. Рассматривают 2 конфигурации, PC-high - с Intel
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.
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, куда влезает квантованная модель и так (для сравнения).
Вывод
Простой и разумный подход с практически полезным результатом. По всей видимости, умный оффлоадинг - одно из самых, если не самое перспективное направление, ускорения моделях на пользовательских устройствах. Однако, букву “О” гармонично вставить в название канала не получается. Кажется, что результаты работы можно улучшить за счет более сильного алгоритма квантизации экспертов, уменьшив просадку качества.
[Статья][Код]
Введение
Смеси экспертов (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 показывают себя неплохо в конкретных приложениях, но ограничены в выразительности по природе своей и оптимальный адаптер, по всей видимости, представляет собой некоторую смесь низкопараметрических матриц. Ее правда, надо еще сначала найти 😅️️
[Статья] [Код]
Введение
Низкоранговые адаптеры (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 пока нет реализации.
[Статьи нет, обычно наоборот][Код]
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
TinyGSM: achieving > 80% on GSM8k with small language models
[Статья][Кода нет, как и моделей и датасета]
Введение
Обучить здоровенную модель на здоровенном датасете здоровенное число итераций, которая умеет во все и всея - большого ума не надо, поставил обучаться на десятках тысяч видеокарт на несколько месяцев - и готово. А вот получить небольшую модельку, способную в сложные логические конструкции и заключения, решение задач по математике - вот это уже настоящее мастерство и искусство.
В разбираемой статье авторы обучили семейство сетей небольшого размера (от 125M до 1.3B), которые превосходят по доле правильных решений куда более крупных конкурентов.
Метод
В великом множестве статей ранее было показано, что синтетические данные, сгененированные могучей сетью а-ля GPT-3.5/4, позволяют добиться значительно более высокой эффективности обучения по сравнению с типичным корпусами, собранными из интернета. В частности, можно дотюнить (Alpaca, Vicuna, Wizard, Platypus и многое и многое другое), или обучить с нуля (серия моделей Microsoft-Phi и TinyStories).
Математические датасеты невелики по размеру. GSM-8k, в частности, имеет всего 7k примеров в обучающей выборке, и наивное обучение приведет к переобучению. Потому авторы аугментируют данные с помощью GPT-3.5, перефразируя вопросы и добавляя нерелевантный контекст. Чтобы обеспечить качество данных, убирают слишком короткие и не содержащие числа задачи. Кроме того, выфильтровали задачи, которые оказались похожи на тестовые по n-грамному сравнению. Итого вышло более 12M синтетических задач. (~1.8B токенов)
Однако одно лишь это не позволяет преодолеть порог в 70% top-1 accuracy на тесте GSM-8k.
Следующим краеугольным камнем работы является использование модели-verifier (проверятеля), которая оценивает корректность каждого шага решения. Мотивация заключается в том, что одно решение может быть неправильным, но если сгенерировать несколько, то хотя бы одно да залетит. И модель-verifier учится определять корректные шаги в решении.
Обучают ее следующим образом - берут 3 чекпоинта модели, решающей GSM-8k, с разных итераций обучения (более ранние больше ошибаются), и учат предсказывать корректность конкретного токена в решении. Если модель-решатель решила задачу верно, то все токены в последовательности размечаются, как верные - label 1, иначе - наоборот, вся последовательность, как неправильная. Сэмплируют 48 решений на каждый из 7к примеров в обучающей выборке.
Таким образом рецепт успеха состоит из двух основных идей:
1⃣️️️️️️ Аугментация датасета
2⃣️️️️️️ Обучение модели - проверятеля, оценивающей правильность конкретных шагов совместно с моделью, решающей задачи.
[Статья][Кода нет, как и моделей и датасета]
Введение
Обучить здоровенную модель на здоровенном датасете здоровенное число итераций, которая умеет во все и всея - большого ума не надо, поставил обучаться на десятках тысяч видеокарт на несколько месяцев - и готово. А вот получить небольшую модельку, способную в сложные логические конструкции и заключения, решение задач по математике - вот это уже настоящее мастерство и искусство.
В разбираемой статье авторы обучили семейство сетей небольшого размера (от 125M до 1.3B), которые превосходят по доле правильных решений куда более крупных конкурентов.
Метод
В великом множестве статей ранее было показано, что синтетические данные, сгененированные могучей сетью а-ля GPT-3.5/4, позволяют добиться значительно более высокой эффективности обучения по сравнению с типичным корпусами, собранными из интернета. В частности, можно дотюнить (Alpaca, Vicuna, Wizard, Platypus и многое и многое другое), или обучить с нуля (серия моделей Microsoft-Phi и TinyStories).
Математические датасеты невелики по размеру. GSM-8k, в частности, имеет всего 7k примеров в обучающей выборке, и наивное обучение приведет к переобучению. Потому авторы аугментируют данные с помощью GPT-3.5, перефразируя вопросы и добавляя нерелевантный контекст. Чтобы обеспечить качество данных, убирают слишком короткие и не содержащие числа задачи. Кроме того, выфильтровали задачи, которые оказались похожи на тестовые по n-грамному сравнению. Итого вышло более 12M синтетических задач. (~1.8B токенов)
Однако одно лишь это не позволяет преодолеть порог в 70% top-1 accuracy на тесте GSM-8k.
Следующим краеугольным камнем работы является использование модели-verifier (проверятеля), которая оценивает корректность каждого шага решения. Мотивация заключается в том, что одно решение может быть неправильным, но если сгенерировать несколько, то хотя бы одно да залетит. И модель-verifier учится определять корректные шаги в решении.
Обучают ее следующим образом - берут 3 чекпоинта модели, решающей GSM-8k, с разных итераций обучения (более ранние больше ошибаются), и учат предсказывать корректность конкретного токена в решении. Если модель-решатель решила задачу верно, то все токены в последовательности размечаются, как верные - label 1, иначе - наоборот, вся последовательность, как неправильная. Сэмплируют 48 решений на каждый из 7к примеров в обучающей выборке.
Таким образом рецепт успеха состоит из двух основных идей:
1⃣️️️️️️ Аугментация датасета
2⃣️️️️️️ Обучение модели - проверятеля, оценивающей правильность конкретных шагов совместно с моделью, решающей задачи.
👍2❤1
Эксперименты
Модель-решатель и модель-проверяльщика инициализируют из преобученных Phi-1.5. Одно лишь увеличение размера модели-решателя дает небольшой прирост качества, потому добавления проверяльщика - критично для достижения хорошего результата. Любопытно, что увеличение проверяльщика дает больший прирост качества, чем модели решателя. Сэмплируются 48 решений, из которых подается лучшее в качестве ответа.
Самая лучшая модель достигает качества в 81.5%, что больше, чем у GPT-3.5 (77.4%), породившей в определенном смысле данную модель, и открытых моделей, дообученных на решение математических задач поверх Llama 2 7B и 13B. GPT-4 для справки добивается 97% точности.
Метод проверяют и на другом известном бенчмарке ASDIV и там тоже получают сильный результат.
Ожидаемо, случайная инициализация работает хуже, чем обучение с чекпоинта Phi-1.5, хоть я бы ожидал большей разницы.
Вывод
Прикольное и эффектное решение. Тем не менее уместно заметить, что стоимость инференса при использовании модели-проверятеля возрастает кратно числу сгенерированных моделью-решателем ответов и выигрыш от использования меньшей модели надо умножать на число прогонов, после чего сравнить с качеством при одноразовой прогонке через большую модель.
Модель-решатель и модель-проверяльщика инициализируют из преобученных Phi-1.5. Одно лишь увеличение размера модели-решателя дает небольшой прирост качества, потому добавления проверяльщика - критично для достижения хорошего результата. Любопытно, что увеличение проверяльщика дает больший прирост качества, чем модели решателя. Сэмплируются 48 решений, из которых подается лучшее в качестве ответа.
Самая лучшая модель достигает качества в 81.5%, что больше, чем у GPT-3.5 (77.4%), породившей в определенном смысле данную модель, и открытых моделей, дообученных на решение математических задач поверх Llama 2 7B и 13B. GPT-4 для справки добивается 97% точности.
Метод проверяют и на другом известном бенчмарке ASDIV и там тоже получают сильный результат.
Ожидаемо, случайная инициализация работает хуже, чем обучение с чекпоинта Phi-1.5, хоть я бы ожидал большей разницы.
Вывод
Прикольное и эффектное решение. Тем не менее уместно заметить, что стоимость инференса при использовании модели-проверятеля возрастает кратно числу сгенерированных моделью-решателем ответов и выигрыш от использования меньшей модели надо умножать на число прогонов, после чего сравнить с качеством при одноразовой прогонке через большую модель.
🔥2👍1
И из забавного на ночь (от коллег).
Вывод одной модели на задаче из GSM-8k:
Вывод одной модели на задаче из GSM-8k:
Question:
Gerald wants to buy a meat pie that costs 2 pfennigs. Gerald has 54 farthings, and there are 6 farthings to a pfennig. How many pfennigs will Gerald have left after buying the pie?
Answer:
nobody cares\n#### 54
🔥11💅4
Parameter-Efficient Sparsity Crafting from Dense to Mixture-of-Experts for Instruction Tuning on General Tasks (спасибо @milana_shhanukova)
[Статья] [Код]
Введение
Как известно, дообучение на грамотным образом собранных инструкциях позволяет заметно повысить полезность LLM-ок. Для создания широкопрофильного ассистента требуется обучение на широком и разнообразном наборе инструкций. К сожалению, не все модели обладают достаточной емкостью, чтобы впитывать все подаваемое знание через трубочку и на практике происходит catastrophic forgetting при переходе от одного типа инструкций к другому.
Естественным решением проблемы являются смеси экспертов (MoE). Каждый эксперт условно соответствует некоторому домену. В работе Sparse Upcycling наделали реплик FFN слоев, и дообучили, но такой подход, довольно дорогостоящий по памяти для больших моделей.
Метод
Суть метода проста как пробка - раз полноценные FFN слои дорогие - даешь смесь bottleneck экспертов (а-ля LoRA c активацией посередине). И чтобы необучаемые параметры было еще проще уместить на GPU - заквантовать необучаемые параметры в 4 бита как в QLoRA.
Эксперименты
Обучают все хозяйство на смеси SlimORCA, Magicoder, MetaMathQA (520к инструкций в сумме). Обучение длится одну эпоху. В качестве основных моделей берут - Llama-2-7b, Llama-2-13b, Yi-34b (потому что Llama-2-33b не выпустили).
Если я правильно понял, модель дообученная на наборе инструкций c QLoRA - называется Camel, а эксперты со смесью LoRA адаптеров - Camelidae 🐪. Как и в Mixtral - создают 8 экспертов, из которых активируются только 2.
Модель валидируют на разнообразных бенмарчках - MMLU (знания в разных предметных областях), Hellaswag (commonsense reasoning), HumanEval (код), GSM8k (элементарная математика) и др.
Camelidae ожидаемо опережает базовую модель по метрикам, и самая большая модель Camelidae-8×34B выглядит якобы даже сильнее большего Mixtral-8×7B-instruct с плотными экспертами и Llama-2-70-b-chat. Однако, если присмотреться, кажется что разница между Camel и Camelidae не очень-то велика, и вероятно основной прирост от удачного выбора смеси инструкций. Вероятно, в Camelidae больше обучаемых параметров.
Вывод
Смеси экспертов в исходной формулировке или как адаптеры выглядят логичным решением для модели, ориентированной на решение широкого круга задач. Однако в данном случае не очевидно, насколько эффективен новый адаптер, а не данные и постановка эксперимента благоприятствуют хорошим результатам.
[Статья] [Код]
Введение
Как известно, дообучение на грамотным образом собранных инструкциях позволяет заметно повысить полезность LLM-ок. Для создания широкопрофильного ассистента требуется обучение на широком и разнообразном наборе инструкций. К сожалению, не все модели обладают достаточной емкостью, чтобы впитывать все подаваемое знание через трубочку и на практике происходит catastrophic forgetting при переходе от одного типа инструкций к другому.
Естественным решением проблемы являются смеси экспертов (MoE). Каждый эксперт условно соответствует некоторому домену. В работе Sparse Upcycling наделали реплик FFN слоев, и дообучили, но такой подход, довольно дорогостоящий по памяти для больших моделей.
Метод
Суть метода проста как пробка - раз полноценные FFN слои дорогие - даешь смесь bottleneck экспертов (а-ля LoRA c активацией посередине). И чтобы необучаемые параметры было еще проще уместить на GPU - заквантовать необучаемые параметры в 4 бита как в QLoRA.
Эксперименты
Обучают все хозяйство на смеси SlimORCA, Magicoder, MetaMathQA (520к инструкций в сумме). Обучение длится одну эпоху. В качестве основных моделей берут - Llama-2-7b, Llama-2-13b, Yi-34b (потому что Llama-2-33b не выпустили).
Если я правильно понял, модель дообученная на наборе инструкций c QLoRA - называется Camel, а эксперты со смесью LoRA адаптеров - Camelidae 🐪. Как и в Mixtral - создают 8 экспертов, из которых активируются только 2.
Модель валидируют на разнообразных бенмарчках - MMLU (знания в разных предметных областях), Hellaswag (commonsense reasoning), HumanEval (код), GSM8k (элементарная математика) и др.
Camelidae ожидаемо опережает базовую модель по метрикам, и самая большая модель Camelidae-8×34B выглядит якобы даже сильнее большего Mixtral-8×7B-instruct с плотными экспертами и Llama-2-70-b-chat. Однако, если присмотреться, кажется что разница между Camel и Camelidae не очень-то велика, и вероятно основной прирост от удачного выбора смеси инструкций. Вероятно, в Camelidae больше обучаемых параметров.
Вывод
Смеси экспертов в исходной формулировке или как адаптеры выглядят логичным решением для модели, ориентированной на решение широкого круга задач. Однако в данном случае не очевидно, насколько эффективен новый адаптер, а не данные и постановка эксперимента благоприятствуют хорошим результатам.
🔥7
#литература
Многие из вас читают статьи про диффузионные модели. В них регулярно возникает таинственная и загадочная, внушающая благоговейный трепет, сущность под названием SDE (Stochastic Differential Equations). И эти самые SDE описывают диффузионные процессы в непрерывной формулировке, потому разные продвинутые солверы и методы сэплирования в том или ином виде зиждятся на теории стохастических дифференциальных уравнений.
Однако, классическая литература по данной теме довольно сложна, и оперирует множеством сложных понятий из теории меры, разными борелевскими сигма-алгебрами, фильтрациями, и тяжела для освоения читателю без сильного математического бэкграунда.
Двое авторов из Aalto University (откуда вышло немало ярких работ по генеративным моделям) выпустили книжку по SDE, доступную широкому кругу читателей (достаточно иметь за плечами стандартный вузовский курс по диффурам и теорверу), с упором на приложения. Написано очень доступно и понятно. И упражнения в конце глав вполне себе посильные, а не как обычно бывает...
Рекомендую всем тем, кто получить некоторую математическую базу для понимания диффузии.
Многие из вас читают статьи про диффузионные модели. В них регулярно возникает таинственная и загадочная, внушающая благоговейный трепет, сущность под названием SDE (Stochastic Differential Equations). И эти самые SDE описывают диффузионные процессы в непрерывной формулировке, потому разные продвинутые солверы и методы сэплирования в том или ином виде зиждятся на теории стохастических дифференциальных уравнений.
Однако, классическая литература по данной теме довольно сложна, и оперирует множеством сложных понятий из теории меры, разными борелевскими сигма-алгебрами, фильтрациями, и тяжела для освоения читателю без сильного математического бэкграунда.
Двое авторов из Aalto University (откуда вышло немало ярких работ по генеративным моделям) выпустили книжку по SDE, доступную широкому кругу читателей (достаточно иметь за плечами стандартный вузовский курс по диффурам и теорверу), с упором на приложения. Написано очень доступно и понятно. И упражнения в конце глав вполне себе посильные, а не как обычно бывает...
Рекомендую всем тем, кто получить некоторую математическую базу для понимания диффузии.
👍14❤5
MobileDiffusion: Subsecond Text-to-Image Generation on Mobile Devices
[Статья] [Кода нет]
Было еще тут.
В последнее время был достигнут значительный прогресс в ускорении диффузионных моделей.
Тем не менее инференс на мобильных устройствах работает все еще недостаточно быстро.
Скорость генерации диффузионной модели определяется количеством шагов сэмплирования и стоимостью одного шага. На текущий момент, большинство внимания уделяется ускорению моделей за счет первого фактора - изобретением новых солверов, алгоритмов пошаговой дистилляции. Оптимизации архитектуры уделяется же значительно меньше внимания. Типичные модели хороши для GPU, но тяжеловаты для мобилок, потому имеет смысл уменьшать саму модель, сохраняя качество.
В этой работе основное внимание уделено как раз архитектуре, но и про уменьшение количества шагов сэмплирования тоже не забыли.
Метод
За основу берут StableDiffusion v1.5.
Трансформерные блоки
Первая оптимизация, мотивированная прошлыми работами UViT и SnapFusion, - уборка дорогих и не очень полезных attention с самого высокого разрешения. Кроме того, на разрешении 32x32 оставляют только cross-attention с текстовыми токенами, потому что self-attention с 1024 все еще дорогой. Таким образом, self-attention есть только на разрешении 16x16. Кроме того, объединяют проекции Key и Value, чтобы еще чуть-чуть сэкономить на параметрах, заменяют gelu на swish, который более эффективен на мобилках и приятнее с точки зрения последующего квантования модели, и softmax на relu. В последнем случае, обученную с softmax модель, файнтьюнят 10к шагов с relu, и якобы не теряют в качестве.
И уменьшают expansion в FeedForward слоях с 8 до 6 без просадки в качестве.
Сверточные блоки
Вместо обычных сверток 3x3 используют depthwise-separable с меньшим числом параметров и операций. Утверждается, что качество не просаживается. Кроме того, уменьшили общее количество блоков с 22 в SD до 12.
Целевая модель должна иметь не более 400 миллионов параметров и 200 GFLOPs на инференсе. Авторы запустили перебор разных конфигураций блоков и ширин каналов (детали процесса опущены) и отобрали самых удачных кандидатов.
Пошаговая дистилляция
Для пошаговой дистилляции были рассмотрены две стратегии:
1⃣️️️️️️ Прогрессивная дистилляция в 8 шагов сэмплирования
2⃣️️️️️️ UFOGen с адверсариальным лоссом
Автоэнкодер
Кроме того, вместо исходного автоэнкодера из SD, авторы обучили свой, более компактный, но кодирующий в 8 каналов вместо 4-х. Потом его еще запрунили (непонятно как). Полученный VAE и быстрее и лучше по метрикам.
[Статья] [Кода нет]
Было еще тут.
В последнее время был достигнут значительный прогресс в ускорении диффузионных моделей.
Тем не менее инференс на мобильных устройствах работает все еще недостаточно быстро.
Скорость генерации диффузионной модели определяется количеством шагов сэмплирования и стоимостью одного шага. На текущий момент, большинство внимания уделяется ускорению моделей за счет первого фактора - изобретением новых солверов, алгоритмов пошаговой дистилляции. Оптимизации архитектуры уделяется же значительно меньше внимания. Типичные модели хороши для GPU, но тяжеловаты для мобилок, потому имеет смысл уменьшать саму модель, сохраняя качество.
В этой работе основное внимание уделено как раз архитектуре, но и про уменьшение количества шагов сэмплирования тоже не забыли.
Метод
За основу берут StableDiffusion v1.5.
Трансформерные блоки
Первая оптимизация, мотивированная прошлыми работами UViT и SnapFusion, - уборка дорогих и не очень полезных attention с самого высокого разрешения. Кроме того, на разрешении 32x32 оставляют только cross-attention с текстовыми токенами, потому что self-attention с 1024 все еще дорогой. Таким образом, self-attention есть только на разрешении 16x16. Кроме того, объединяют проекции Key и Value, чтобы еще чуть-чуть сэкономить на параметрах, заменяют gelu на swish, который более эффективен на мобилках и приятнее с точки зрения последующего квантования модели, и softmax на relu. В последнем случае, обученную с softmax модель, файнтьюнят 10к шагов с relu, и якобы не теряют в качестве.
И уменьшают expansion в FeedForward слоях с 8 до 6 без просадки в качестве.
Сверточные блоки
Вместо обычных сверток 3x3 используют depthwise-separable с меньшим числом параметров и операций. Утверждается, что качество не просаживается. Кроме того, уменьшили общее количество блоков с 22 в SD до 12.
Целевая модель должна иметь не более 400 миллионов параметров и 200 GFLOPs на инференсе. Авторы запустили перебор разных конфигураций блоков и ширин каналов (детали процесса опущены) и отобрали самых удачных кандидатов.
Пошаговая дистилляция
Для пошаговой дистилляции были рассмотрены две стратегии:
1⃣️️️️️️ Прогрессивная дистилляция в 8 шагов сэмплирования
2⃣️️️️️️ UFOGen с адверсариальным лоссом
Автоэнкодер
Кроме того, вместо исходного автоэнкодера из SD, авторы обучили свой, более компактный, но кодирующий в 8 каналов вместо 4-х. Потом его еще запрунили (непонятно как). Полученный VAE и быстрее и лучше по метрикам.
👍8🫡1
Эксперименты
Модель обучали на 150M изображениях из Pali, 750к шагов на разрешении 256x256 и 250к шагов на 512x512. Качество замеряют по FID и CLIP на 30k изображениях из MS-COCO, следуя стандартной практике.
Кроме базовой модели MD (Mobile Diffusion) c 400M параметров, обучают еще более компактную версию MD-Lite c 300M параметрами.
На приложенных картинках все модели генерируют примерно одинаково хорошо, на одном уровне с SDXL, что с 50 шагами сэмплера, что с прогрессивной дистилляцией в 8 шагов, что с UFOGen в одношаговое сэмплирование.
По метрикам MD, сэмплирующая в 50 шагов, на уровне SD-v1.5, 8 шагов имеет немного худший FID, и одношаговая уже просаживается заметно.
По скорости выходит вполне себе здорово. При сэмплировании в 8 шагов, MD почти в 2 раза быстрее разобранной ранее SnapFusion, которую тоже дистиллировали в 8 шагов генерации. А в режиме одношаговой генерации удается достичь скорости в 238мс на изображение (при замерах на iPhone 15).
Вывод
Достойный технический результат с использованием разных техник и приемов из прошлой литературы. Однако, для полноты неплохо было бы иметь Side-by-Side evaluation c SD, и замеры разнообразия генераций.
Модель обучали на 150M изображениях из Pali, 750к шагов на разрешении 256x256 и 250к шагов на 512x512. Качество замеряют по FID и CLIP на 30k изображениях из MS-COCO, следуя стандартной практике.
Кроме базовой модели MD (Mobile Diffusion) c 400M параметров, обучают еще более компактную версию MD-Lite c 300M параметрами.
На приложенных картинках все модели генерируют примерно одинаково хорошо, на одном уровне с SDXL, что с 50 шагами сэмплера, что с прогрессивной дистилляцией в 8 шагов, что с UFOGen в одношаговое сэмплирование.
По метрикам MD, сэмплирующая в 50 шагов, на уровне SD-v1.5, 8 шагов имеет немного худший FID, и одношаговая уже просаживается заметно.
По скорости выходит вполне себе здорово. При сэмплировании в 8 шагов, MD почти в 2 раза быстрее разобранной ранее SnapFusion, которую тоже дистиллировали в 8 шагов генерации. А в режиме одношаговой генерации удается достичь скорости в 238мс на изображение (при замерах на iPhone 15).
Вывод
Достойный технический результат с использованием разных техник и приемов из прошлой литературы. Однако, для полноты неплохо было бы иметь Side-by-Side evaluation c SD, и замеры разнообразия генераций.
🔥8
QuIP#: Even Better LLM Quantization with Hadamard Incoherence and Lattice Codebooks
[Статья][Код]
Только-только мы с коллегами выкатили AQLM , как конкуренты нанесли ответный удар)
LLM-ки становятся все круче, новые модели, датасеты с инструкциями выходят почти на ежедневной основе. Однако, самые сильные из опенсорсных моделей (Llama-2-70b с дохреналлионом файтьюнов, Микстраль и загадочное нечто под названием miqu) не влезают в колаб или условную RTX 3090/4090. Квантизация в 4 бита (до недавних пор бывшая Парето-оптимальная) недостаточна, чтобы позволить уместиться такой здоровенной модели на щупленькую видеокарту, а предыдущие методы квантизации в 2-3 бита ломают заметно модель и проще взять меньшую модель в большей точности. Но свежие работы открывают дорогу к инференсу оверсайзд моделей на хорошей геймерской GPU.
Метод
Quip# (решетка, потому что E8 решетка квантования) стоит на трех 🐳 :
1️⃣ Incoherence processing
2️⃣ E8 решеточная векторная квантизация
3️⃣ Дообучение неквантованных параметров
1) Как известно, веса больших языковых моделей обладают выбросами (outliers), плохо поддающимися квантованию, и в ряде прошлых работ было предложено их тем или иным образом изолировать. Здесь же, следуя своей прошлой работе QuIP авторы домножают веса на случайное ортогональное преобразование, благодаря которому величины и чувствительности параметров растекаются равномерно по матрице (incoherence processing). Отличие от прошлой работы в том, что вместо произведения кронекеровских матриц для параметризации ортогонального преобразования используется случайное Адамарово преобразование, более эффективное вычислительно и не уступающее по качеству.
2) Поэлементная квантизация не совсем оптимальна в том смысле, что оптимизирует ошибку в пределах некоторого гиперкуба (если рассматривать группы весов). А в действительности группы весов распределены в некотором шаре. А объем шара того же диаметра, что и сторона куба, в большой размерности много меньше описанного вокруг него куба. И при том же количестве кластеров (квантованных значений), можно добиться значительно меньшей ошибки. Для используемой в работе квантизации группами по 8 весов оптимальная решетка - E8, как было показано сравнительно недавно.
3) Чтобы уменьшить ошибку квантизации, можно потюнить модель воспроизводить выходы слоев исходной модели. Как и в AQLM авторы сначала дообучают неквантованные модели на уровне отдельных блоков трансформера. А на второй стадии обучают уже все неквантованные параметры на минизацию разницы между сжатой моделью и исходной fp16.
Для больших битностей (3-4 бита) используется Residual Vector Quantization, когда ошибка квантизации еще раз квантуется и конечный вес представляется в виде суммы квантованного веса и квантованной ошибки.
[Статья][Код]
Только-только мы с коллегами выкатили AQLM , как конкуренты нанесли ответный удар)
LLM-ки становятся все круче, новые модели, датасеты с инструкциями выходят почти на ежедневной основе. Однако, самые сильные из опенсорсных моделей (Llama-2-70b с дохреналлионом файтьюнов, Микстраль и загадочное нечто под названием miqu) не влезают в колаб или условную RTX 3090/4090. Квантизация в 4 бита (до недавних пор бывшая Парето-оптимальная) недостаточна, чтобы позволить уместиться такой здоровенной модели на щупленькую видеокарту, а предыдущие методы квантизации в 2-3 бита ломают заметно модель и проще взять меньшую модель в большей точности. Но свежие работы открывают дорогу к инференсу оверсайзд моделей на хорошей геймерской GPU.
Метод
Quip# (решетка, потому что E8 решетка квантования) стоит на трех 🐳 :
1️⃣ Incoherence processing
2️⃣ E8 решеточная векторная квантизация
3️⃣ Дообучение неквантованных параметров
1) Как известно, веса больших языковых моделей обладают выбросами (outliers), плохо поддающимися квантованию, и в ряде прошлых работ было предложено их тем или иным образом изолировать. Здесь же, следуя своей прошлой работе QuIP авторы домножают веса на случайное ортогональное преобразование, благодаря которому величины и чувствительности параметров растекаются равномерно по матрице (incoherence processing). Отличие от прошлой работы в том, что вместо произведения кронекеровских матриц для параметризации ортогонального преобразования используется случайное Адамарово преобразование, более эффективное вычислительно и не уступающее по качеству.
2) Поэлементная квантизация не совсем оптимальна в том смысле, что оптимизирует ошибку в пределах некоторого гиперкуба (если рассматривать группы весов). А в действительности группы весов распределены в некотором шаре. А объем шара того же диаметра, что и сторона куба, в большой размерности много меньше описанного вокруг него куба. И при том же количестве кластеров (квантованных значений), можно добиться значительно меньшей ошибки. Для используемой в работе квантизации группами по 8 весов оптимальная решетка - E8, как было показано сравнительно недавно.
3) Чтобы уменьшить ошибку квантизации, можно потюнить модель воспроизводить выходы слоев исходной модели. Как и в AQLM авторы сначала дообучают неквантованные модели на уровне отдельных блоков трансформера. А на второй стадии обучают уже все неквантованные параметры на минизацию разницы между сжатой моделью и исходной fp16.
Для больших битностей (3-4 бита) используется Residual Vector Quantization, когда ошибка квантизации еще раз квантуется и конечный вес представляется в виде суммы квантованного веса и квантованной ошибки.
🔥6
Результаты
Одним словом, вышло здорово.
Валидация стандартная - бенчмарки по перплексии (Wikitext2/C4) и подборка zero-shot из
На битностях 2,3,4 опережают известные методы по качеству почти везде. Отрыв от AQLM небольшой, но все же есть.
QuIP# достигает Парето-оптимальности при квантовании в 3 бита (отдельные конфигурации AQLM Парето-оптимальны в 2.5-2.6 битах).
Выбор решетки имеет влияние на качество модели, но дообучение неквантованных параметров накидывает больше.
Кроме того, все это хозяйство можно вполне эффективно инферить, с приемлемой производильностью. При этом авторы отвечают, что среди них нет мастеров по написанию CUDA кернелов, и можно еще ускорить генерацию.
Выводы
Сильный результат и красивая математика. Гонка по сжатию LLM становится все захватывающее. Интересно, какова же все-таки битность Парето кривой при использовании самого лучшего из возможных методов квантования моделей и как скоро мы посадим почти lossless 70b модель на сolab.
Одним словом, вышло здорово.
Валидация стандартная - бенчмарки по перплексии (Wikitext2/C4) и подборка zero-shot из
lm_eval_harness (ArcC, ArcE, Winogrande, PiQA).На битностях 2,3,4 опережают известные методы по качеству почти везде. Отрыв от AQLM небольшой, но все же есть.
QuIP# достигает Парето-оптимальности при квантовании в 3 бита (отдельные конфигурации AQLM Парето-оптимальны в 2.5-2.6 битах).
Выбор решетки имеет влияние на качество модели, но дообучение неквантованных параметров накидывает больше.
Кроме того, все это хозяйство можно вполне эффективно инферить, с приемлемой производильностью. При этом авторы отвечают, что среди них нет мастеров по написанию CUDA кернелов, и можно еще ускорить генерацию.
Выводы
Сильный результат и красивая математика. Гонка по сжатию LLM становится все захватывающее. Интересно, какова же все-таки битность Парето кривой при использовании самого лучшего из возможных методов квантования моделей и как скоро мы посадим почти lossless 70b модель на сolab.
❤6
Возникла следующая мысль, навеянная работой то MiniCPM (отличный разбор у Сиолошной).
Типичные scaling laws для обучения языковых моделей имеют следующий вид:
где
Но в них никак не фигурируют детали обучения - learning rate, расписание обучения. Вероятно, они не явно зашиты в константы, но зависимость нетривиальная. При нулевом learning rate ничего учиться не будет, очевидно, при learning rate выше некоторого порога лосс улетит в стратосферу. Потому данный закон справедлив в некоторой области параметров.
При большем learning rate модель больше подстраивается под значение батча, но в то же время больше информации, чем было в train она постичь не может по-любому. И для точной сходимости к оптимуму, по всей видимости, необходимо иметь малый learning rate в конце обучения (чего можно добиться условным косинусом, линейным или
Интересно, насколько, кроме самой архитектуры и данных, качество полученной модели зависит от параметров обучения, и насколько оптимально подобраны рецепты обучения всех этих шиншилл, ллам, мистралей и прочей живности...
Типичные scaling laws для обучения языковых моделей имеют следующий вид:
L = A / N^{\alpha} + B / D^{\beta} + L0где
L - лосс-функция на отложенной выборкеL0 - ошибка "идеальной" моделиN - число параметров в моделиD - число токенов на обученииA, B - некоторые константыНо в них никак не фигурируют детали обучения - learning rate, расписание обучения. Вероятно, они не явно зашиты в константы, но зависимость нетривиальная. При нулевом learning rate ничего учиться не будет, очевидно, при learning rate выше некоторого порога лосс улетит в стратосферу. Потому данный закон справедлив в некоторой области параметров.
При большем learning rate модель больше подстраивается под значение батча, но в то же время больше информации, чем было в train она постичь не может по-любому. И для точной сходимости к оптимуму, по всей видимости, необходимо иметь малый learning rate в конце обучения (чего можно добиться условным косинусом, линейным или
1/sqrt(t) угасающим learning rate). Интересно, насколько, кроме самой архитектуры и данных, качество полученной модели зависит от параметров обучения, и насколько оптимально подобраны рецепты обучения всех этих шиншилл, ллам, мистралей и прочей живности...
Sora (Video generation models as world simulators)
Полагаю, все уже успели полюбоваться новым детищем от OpenAI под названием Sora. Классные разборы уже появились у светочей и рупоров отечетсвенного AI (пост Сиолошной, пост на Любовь, Смерть, Трансформеры), как и веселые мемчики. Со своей стороны лишь накину пару мыслей и соображений после прочтения отчетов и залипания в видосики.
В отчете ожидаемо (given the competitive landscape and the safety implications бла-бла-бла) не прозвучали какие-либо детали о сборе и фильтрации датасета, архитектуре, пайплайне обучения. На основе отчета можно сделать следующиее выводы:
1️⃣ Архитектура модели - некий здоровенный трансформер, работающий на пространственно-временных патчах.
2️⃣ Модель - латентная. Есть энкодер, превращающий видео с большим пространственным и временным разрешением в некое компактное латентное представление, в котором и происходит диффузионный процесс. И декодер, превращающий латенты обратно в видео.
3️⃣ Модель можно обуславливать на текст, текст + изображение, и использовать для продолжения коротких клипов. Кроме того, можно редактировать видео с помощью промпта и интерполировать два ролика осмысленным образом.
4️⃣ В процессе обучения модели, по всей видимости, на вход подавались и изображения, и картинки. Картинка эквивалентна видео из одного кадра.
5️⃣ Модель обучалась на исходных, необрезанных картинках. Благодаря этому она не генерирует обрезанный контект и способна работать в любом разрешении. Интересно, как они батчевали кадры разного разрешения. Возможно, encoder/decoder способен приводить все к одному разрешению, обуславливаясь на разрешение входа. А может, модель настолько большая, что батч больше одного все равно не лезет в сие чудище.
6️⃣ Модель обладает пространственно-временной консистентностью. Закрытие одного обьекта другим (occlusion), не приводит к характерным артефактам.
7️⃣ Генерировать можно ролики и изображения с разрешением до 2k.
8️⃣ Как и в DALLE-3, большую роль играют синтетические описания, сгененированные специально обученной для этого моделью.
Спекуляции и догадки
1⃣️️ По всей видимости. модель под капотом и обьем данных/вычислений, потраченных на обучения модели, реально колосалльны. Скорее всего сама модель значительно больше, чем SDXL, Emu, и иные модели, о которых хоть что-то известно.
2⃣️️ Полагаю, что в обучении было задействовано много синтетики зарендеренной Unreal Engine 5, или чем-то подобным. Многие ролики напоминают генерации движка 3D графики. Таким образом можно задавать пространственно-временную информацию куда более явно, чем weak supervision с огромного числа видеороликов и клипов.
Полагаю, все уже успели полюбоваться новым детищем от OpenAI под названием Sora. Классные разборы уже появились у светочей и рупоров отечетсвенного AI (пост Сиолошной, пост на Любовь, Смерть, Трансформеры), как и веселые мемчики. Со своей стороны лишь накину пару мыслей и соображений после прочтения отчетов и залипания в видосики.
В отчете ожидаемо (given the competitive landscape and the safety implications бла-бла-бла) не прозвучали какие-либо детали о сборе и фильтрации датасета, архитектуре, пайплайне обучения. На основе отчета можно сделать следующиее выводы:
1️⃣ Архитектура модели - некий здоровенный трансформер, работающий на пространственно-временных патчах.
2️⃣ Модель - латентная. Есть энкодер, превращающий видео с большим пространственным и временным разрешением в некое компактное латентное представление, в котором и происходит диффузионный процесс. И декодер, превращающий латенты обратно в видео.
3️⃣ Модель можно обуславливать на текст, текст + изображение, и использовать для продолжения коротких клипов. Кроме того, можно редактировать видео с помощью промпта и интерполировать два ролика осмысленным образом.
4️⃣ В процессе обучения модели, по всей видимости, на вход подавались и изображения, и картинки. Картинка эквивалентна видео из одного кадра.
5️⃣ Модель обучалась на исходных, необрезанных картинках. Благодаря этому она не генерирует обрезанный контект и способна работать в любом разрешении. Интересно, как они батчевали кадры разного разрешения. Возможно, encoder/decoder способен приводить все к одному разрешению, обуславливаясь на разрешение входа. А может, модель настолько большая, что батч больше одного все равно не лезет в сие чудище.
6️⃣ Модель обладает пространственно-временной консистентностью. Закрытие одного обьекта другим (occlusion), не приводит к характерным артефактам.
7️⃣ Генерировать можно ролики и изображения с разрешением до 2k.
8️⃣ Как и в DALLE-3, большую роль играют синтетические описания, сгененированные специально обученной для этого моделью.
Спекуляции и догадки
1⃣️️ По всей видимости. модель под капотом и обьем данных/вычислений, потраченных на обучения модели, реально колосалльны. Скорее всего сама модель значительно больше, чем SDXL, Emu, и иные модели, о которых хоть что-то известно.
2⃣️️ Полагаю, что в обучении было задействовано много синтетики зарендеренной Unreal Engine 5, или чем-то подобным. Многие ролики напоминают генерации движка 3D графики. Таким образом можно задавать пространственно-временную информацию куда более явно, чем weak supervision с огромного числа видеороликов и клипов.
🔥18👍4💯1
AQLM добавили в transformers 4.38.0!
https://github.com/huggingface/transformers/releases/tag/v4.38.0
Пользуйтесь, наслаждайтесь, делитесь впечатлениями)
Кроме того, мы потюнили end-2-end все обучаемые параметры на логиты fp16 модели и сравнялись по качеству на Llama-2-7b моделях с QuiP#.
Обновленные 7b модели уже лежат в хабе, остальные будем добавлять по мере готовности.
https://huggingface.co/BlackSamorez/Llama-2-7b-AQLM-2Bit-1x16-hf (wikitext2 ppl: было 6.31, стало 5.92)
https://huggingface.co/BlackSamorez/Llama-2-7b-AQLM-2Bit-2x8-hf (wikitext2 ppl: было 7.91, стало 6.69)
https://github.com/huggingface/transformers/releases/tag/v4.38.0
Пользуйтесь, наслаждайтесь, делитесь впечатлениями)
Кроме того, мы потюнили end-2-end все обучаемые параметры на логиты fp16 модели и сравнялись по качеству на Llama-2-7b моделях с QuiP#.
Обновленные 7b модели уже лежат в хабе, остальные будем добавлять по мере готовности.
https://huggingface.co/BlackSamorez/Llama-2-7b-AQLM-2Bit-1x16-hf (wikitext2 ppl: было 6.31, стало 5.92)
https://huggingface.co/BlackSamorez/Llama-2-7b-AQLM-2Bit-2x8-hf (wikitext2 ppl: было 7.91, стало 6.69)
❤11🔥5👍1
Stability.AI анонсировали Stable Diffusion 3.
Пока без конкретных деталей, но обещают в будущем папиру.
Что известно на данный момент:
1) Будет несколько моделей от 800M до 8B (как минимум 2 размера)
2) По всей видимости в латентном пространстве работает некая вариация DiT как в Sora
3) Flow matching еще что-то делает
Модель доступна только через waitlist для early preview. Типа из соображений безопасности, чтобы никто не начал использовать ее во вред человечеству и для удовлетворения небогоугодных фантазий.
Анонс на Love. Death. Transformers.
Пока без конкретных деталей, но обещают в будущем папиру.
Что известно на данный момент:
1) Будет несколько моделей от 800M до 8B (как минимум 2 размера)
2) По всей видимости в латентном пространстве работает некая вариация DiT как в Sora
3) Flow matching еще что-то делает
Модель доступна только через waitlist для early preview. Типа из соображений безопасности, чтобы никто не начал использовать ее во вред человечеству и для удовлетворения небогоугодных фантазий.
Анонс на Love. Death. Transformers.
🤯4🔥2👍1