Scaling Rectified Flow Transformers for High-Resolution Image Synthesis
[Статья][Кода нет, но обещают]
Stability.AI таки выкатили обещанный отчет про обучения Stable Diffusion 3.
Метод
Сама по себе процедура обучения представляет комбинацию большого числа техник из прошлой литературы. Авторы перебирают различные архитектурные конфигурации, диффузионные процессы, расписания зашумления и иные трюки, чтобы достичь наилучшего качества.
Диффузионный процесс
Авторы рассматривают следующие постановки диффузионных процессов:
1️⃣ Rectified flow (который как понятно из названия используется в конечной модели). По существу, линейная интерполяция между изображением и шумом.
2️⃣ EDM с variance exploding.
3️⃣ Косинусное расписание из ADM. Модели предсказывают либо шум, либо скорость.
Кроме того, рассматриваются различные расписания зашумления. В наивном подходе шаги сэмплируются равномерно по времени диффузии. Однако предсказание скорости сложнее в середине траектории, вдали от распределения данных и распредения шума6 потому целесообразно сэмплировать чаще в середине.
Желаемого эффекта можно достичь с помощью logit-normal sampling (log t / (1 - t)) и CosMap.
Авторы ablaтят различные выборы, смотря на метрики генерации CLIP-score, FID в class-conditional генерации на ImageNet и CC12M.
Оказалось, что rectified flow (rf) с логит-нормальным распределением зашумления работает лучше всего.
[Статья][Кода нет, но обещают]
Stability.AI таки выкатили обещанный отчет про обучения Stable Diffusion 3.
Метод
Сама по себе процедура обучения представляет комбинацию большого числа техник из прошлой литературы. Авторы перебирают различные архитектурные конфигурации, диффузионные процессы, расписания зашумления и иные трюки, чтобы достичь наилучшего качества.
Диффузионный процесс
Авторы рассматривают следующие постановки диффузионных процессов:
1️⃣ Rectified flow (который как понятно из названия используется в конечной модели). По существу, линейная интерполяция между изображением и шумом.
2️⃣ EDM с variance exploding.
3️⃣ Косинусное расписание из ADM. Модели предсказывают либо шум, либо скорость.
Кроме того, рассматриваются различные расписания зашумления. В наивном подходе шаги сэмплируются равномерно по времени диффузии. Однако предсказание скорости сложнее в середине траектории, вдали от распределения данных и распредения шума6 потому целесообразно сэмплировать чаще в середине.
Желаемого эффекта можно достичь с помощью logit-normal sampling (log t / (1 - t)) и CosMap.
Авторы ablaтят различные выборы, смотря на метрики генерации CLIP-score, FID в class-conditional генерации на ImageNet и CC12M.
Оказалось, что rectified flow (rf) с логит-нормальным распределением зашумления работает лучше всего.
🔥6
Архитектура
Прошлые работы показали, что увеличение размерности латентных кодов повышает качество. Следуя данному наблюдению, авторы попробовали автоэнкодер с 4 (как и в прошлых SD), 8, 16 каналами. Увеличение ширины стабильно накидывает по метрикам.
Самое примечательное - архитектура трансформера.
В типичной диффузионной UNet архитектуре условие подается в виде модуляции сверток и через cross attention с патчами изображения/латента.
Здесь же токены изображения и текстовые конкатенируются и обрабатываются совместно единым мультимодальным трансформером. В данной работе авторы используют 3 текстовых энкодера разной размерности - CLIP-L/14, CLIP-G/14 и T5XXL. Эмбеддинги первых двух энкодеров конкатятся и паддятся до размерности T5XXL (которая больше, чем у L/14 и G/14) вместе взятых. То есть имеем 3️⃣ потока токенов - текстовые токены от CLIP-L/14 + CLIP-G/14, текстовые токены от T5XXL, токены изображения. Причем FeedForward слои, нормализации и модуляционные слои имеют свои веса для каждого из трех перечисленных выше потоков токенов. Attention проекции общие для всех токенов.
Иногда пре-attention выдает слишком большие значения, и для повышения стабильности обучения авторы нормализуют ключи и значения перед attention c помощью RMSNorm.
Предложенная архитектура работает лучше, чем UViT (UNet с token merging и splitting), CrossAttention и DiT с общими MLP, модуляциями для всех типов токенов. Иметь отдельные слои для разных текстовых энкодеров полезно, хоть выигрыш сравнительно небольшой. Модели сравниваются на основе динамики валидационного лосса / метрик на СС12M.
Следуя прошлым работам, авторы добавляют синтетические описания, сгенерированные через CogVLM в пропорции 50/50%. Их добавление в обучение заметно улучшает согласованность текста и изображения по мнению разметчиков.
Прошлые работы показали, что увеличение размерности латентных кодов повышает качество. Следуя данному наблюдению, авторы попробовали автоэнкодер с 4 (как и в прошлых SD), 8, 16 каналами. Увеличение ширины стабильно накидывает по метрикам.
Самое примечательное - архитектура трансформера.
В типичной диффузионной UNet архитектуре условие подается в виде модуляции сверток и через cross attention с патчами изображения/латента.
Здесь же токены изображения и текстовые конкатенируются и обрабатываются совместно единым мультимодальным трансформером. В данной работе авторы используют 3 текстовых энкодера разной размерности - CLIP-L/14, CLIP-G/14 и T5XXL. Эмбеддинги первых двух энкодеров конкатятся и паддятся до размерности T5XXL (которая больше, чем у L/14 и G/14) вместе взятых. То есть имеем 3️⃣ потока токенов - текстовые токены от CLIP-L/14 + CLIP-G/14, текстовые токены от T5XXL, токены изображения. Причем FeedForward слои, нормализации и модуляционные слои имеют свои веса для каждого из трех перечисленных выше потоков токенов. Attention проекции общие для всех токенов.
Иногда пре-attention выдает слишком большие значения, и для повышения стабильности обучения авторы нормализуют ключи и значения перед attention c помощью RMSNorm.
Предложенная архитектура работает лучше, чем UViT (UNet с token merging и splitting), CrossAttention и DiT с общими MLP, модуляциями для всех типов токенов. Иметь отдельные слои для разных текстовых энкодеров полезно, хоть выигрыш сравнительно небольшой. Модели сравниваются на основе динамики валидационного лосса / метрик на СС12M.
Следуя прошлым работам, авторы добавляют синтетические описания, сгенерированные через CogVLM в пропорции 50/50%. Их добавление в обучение заметно улучшает согласованность текста и изображения по мнению разметчиков.
🔥6
Результаты
Нащупав хороший сетап, авторы запускают полномасштабное обучение. Самая большая модель имеет 8B параметров (с учетом T5XXL или без?).
Данные отфильтровываются по наличию NSFW контента 👯♀️, эстетичности, и дубликатам.
На начальной стадии обучаются на 256x256 изображениях, а затем переходят генерации на разрешениях до 1024x1024 с разными aspect ratio. При дообучении на высоком разрешении оказывается важным изменить расписание шагов зашумления, так как изображение более высокого разрешения имеют больше сигнала. Сдвинутое расписание улучшает качество, согласно оценке аннотаторов.
После обучения на высоком разрешении, модель дообучают с помощью DPO на улучшение эстетичности и пользовательских предпочтений. Примечательно, что обучают не все параметры, а LoRA адаптеры.
Scaling модели стабильно улучшает качество. Разные модели отличаются и шириной и глубиной. Валидационный лосс (score matching loss) хорошо коррелирует с пользовательскими предпочтениями на GenEval и T2I-CompBench.
Stable Diffusion 3 сравнивают на parti-prompts с прошлыми версиями Stable Diffusion, PixArt-alpha и проприетарными моделями - DALLE-3, Midjouney-V5, Ideogram-V1.0. Stable Diffusion 3 заметно опережает прошлые SD, PixArt и слегка проприентарные модели. Основной выигрыш за счет typography, разница по визуальной эстетике не столько велика.
Большой текстовый энкодер (T5XXL) полезен при сложных промптах, но особо не влияет на эстетическое качество.
Выводы
Сильная модель, вобравшая в себя достижения современной науки и значительный инженерный труд. С точки зрения науки никаких прорывных идей, киллер-фич не предложено. Ждем код и возможность поиграться с моделькой. Rectified flow постановка по идее должна благоприятствовать хорошим генерациям в малое число шагов.
Нащупав хороший сетап, авторы запускают полномасштабное обучение. Самая большая модель имеет 8B параметров (с учетом T5XXL или без?).
Данные отфильтровываются по наличию NSFW контента 👯♀️, эстетичности, и дубликатам.
На начальной стадии обучаются на 256x256 изображениях, а затем переходят генерации на разрешениях до 1024x1024 с разными aspect ratio. При дообучении на высоком разрешении оказывается важным изменить расписание шагов зашумления, так как изображение более высокого разрешения имеют больше сигнала. Сдвинутое расписание улучшает качество, согласно оценке аннотаторов.
После обучения на высоком разрешении, модель дообучают с помощью DPO на улучшение эстетичности и пользовательских предпочтений. Примечательно, что обучают не все параметры, а LoRA адаптеры.
Scaling модели стабильно улучшает качество. Разные модели отличаются и шириной и глубиной. Валидационный лосс (score matching loss) хорошо коррелирует с пользовательскими предпочтениями на GenEval и T2I-CompBench.
Stable Diffusion 3 сравнивают на parti-prompts с прошлыми версиями Stable Diffusion, PixArt-alpha и проприетарными моделями - DALLE-3, Midjouney-V5, Ideogram-V1.0. Stable Diffusion 3 заметно опережает прошлые SD, PixArt и слегка проприентарные модели. Основной выигрыш за счет typography, разница по визуальной эстетике не столько велика.
Большой текстовый энкодер (T5XXL) полезен при сложных промптах, но особо не влияет на эстетическое качество.
Выводы
Сильная модель, вобравшая в себя достижения современной науки и значительный инженерный труд. С точки зрения науки никаких прорывных идей, киллер-фич не предложено. Ждем код и возможность поиграться с моделькой. Rectified flow постановка по идее должна благоприятствовать хорошим генерациям в малое число шагов.
🔥8
Gemma оказалась камнем 💎 с дефектами.
https://x.com/danielhanchen/status/1765446273661075609?s=20
Проблемы gemmы:
1️⃣ Нету <bos> токена. (Я устал, <bos>)
2️⃣ Очепятка в <end_of_turn>
3️⃣ sqrt(d_embed) = sqrt(3072)=55.4256, но bfloat16 = 55.5
4️⃣ Layernorm(w+1) не во float32
5️⃣ Баг в bfloat16 RoPE
6️⃣ RoPE чувствительна к выбору между y * (1/x) или y/x
7️⃣ (Пофиксили) RoPE должен быть в float16. RoPE может содержать числа выходящие за машинную точность, потому обыкновенно применяется в float32, а затем выход кастуется к fp16/bf16 при инференсе/обучении в половинной точности.
А я-то думаю, чего это AQLM квантизация разваливает 7b модель...
https://x.com/danielhanchen/status/1765446273661075609?s=20
Проблемы gemmы:
1️⃣ Нету <bos> токена. (Я устал, <bos>)
2️⃣ Очепятка в <end_of_turn>
3️⃣ sqrt(d_embed) = sqrt(3072)=55.4256, но bfloat16 = 55.5
4️⃣ Layernorm(w+1) не во float32
5️⃣ Баг в bfloat16 RoPE
6️⃣ RoPE чувствительна к выбору между y * (1/x) или y/x
7️⃣ (Пофиксили) RoPE должен быть в float16. RoPE может содержать числа выходящие за машинную точность, потому обыкновенно применяется в float32, а затем выход кастуется к fp16/bf16 при инференсе/обучении в половинной точности.
А я-то думаю, чего это AQLM квантизация разваливает 7b модель...
👍7🤡1
gemma-2b
квантуется, кстати, вполне сносно. Вчера выложили 2 модели:
1️⃣ https://huggingface.co/BlackSamorez/gemma-2b-AQLM-2Bit-1x16-hf
2️⃣ https://huggingface.co/BlackSamorez/gemma-2b-AQLM-2Bit-2x8-hf
Правда, эмбеддинги и голова занимают большую часть памяти теперь. Планируем сжать их в будущих релизах, чтобы уместить модельку в 1гб.
🔥10
Сказ о потерянном skip connection.
Забабахал архитектуру.
Обучаю трансформер.
Чет лосс почти не падает.
Кручу-верчу лернинг рейт, один хрен.
Смотрю на выход (с zero инициализацией на последнем слое), и он еле-еле колеблется в районе 0.
Чешу репу, смотрю код, и опа!
В трансформерном блоке было нечто такое (для краткости опущены нормализации и RoPE):
Добавил потерянный skip и все заработало 🚀.
Мораль сей басни такова - не теряйте skip connections!
Забабахал архитектуру.
Обучаю трансформер.
Чет лосс почти не падает.
Кручу-верчу лернинг рейт, один хрен.
Смотрю на выход (с zero инициализацией на последнем слое), и он еле-еле колеблется в районе 0.
Чешу репу, смотрю код, и опа!
В трансформерном блоке было нечто такое (для краткости опущены нормализации и RoPE):
x = x + self_attn(x)
x = cross_attn(x)
x = x + feedforward(x)
Добавил потерянный skip и все заработало 🚀.
Мораль сей басни такова - не теряйте skip connections!
💅22🙈2
BitNet: Scaling 1-bit Transformers for Large Language Models
[Статья][Официального кода нет]
Пойдем в обратном хронологическом порядке и откатимся на несколько месяцев и 0.58 битов назад по отношению к статье.
Собственно, здесь по существу и расписана вся экспериметнальная постановка, на которой основывается статья с тернарной квантизацией.
Метод
Линейные слои заменяются на
Активации квантуются в 8 бит с помощью равномерной сетки.
Чтобы веса лучше квантовались, перед линейным слоем стоит LayerNorm.
Вычисление среднего значения для определения среднего значения по тензору требует синхронизации при model parallelism. И во избежание лишней коммуникации между процессами при распределенном обучении среднее считается по части матрицы, лежащей на данном процессе.
Странно, что они не рассматирвают поканальное квантование, или даже группами по 256: выразительность больше, а размер модели все еще не сильно отличается от 1 бита.
Далее авторы приводят табличку, показывающую насколько энергоэффективнее INT8 по сравнению с fp16 на разных техпроцессах. На случай, если Грета будет ревьюером.
Эксперименты
Обучают на смеси Pile, CommonCrawl, CC-Stories, RealNews модели размером от 125M до 6.7B. По перплексии полученные модели ожидаемо хуже бейзлайна в fp16, но зато, если нормализовать на энергопотребление, то BitNet смотрится весьма представлительно.
Обучение BitNet с STE требует большего learning rate для адекватной сходимости (~8e-4), на котором fp16 расходится.
По 0-шот бенчам якобы не слишком сильно уступают fp16 трансформеру, однако вопрос в том, насколько хорошо был затюнен сам бейзлайн, и сами бенчи были выбраны по-хитрому. BitNet 6.7B выдает 55.9% на бенчах, но при этом качество случайной модели 43.8% и относительный отрыв от рандом выглядит не таким большим.
Конкурентые PTQ подходы, стартующие с fp16 трансформера конкренто ломаются в низкой битности (тогда еще не вышли QuIP# и AQLM).
Вывод
С одной стороны, неплохо, что это уже как-то работает, но бенчи и бейзлайны были подобраны не слишком честно) BitNet1.58 выдает уже значительно более высокое качество, благодаря возможности принимать хотя бы 0-ое значение.
[Статья][Официального кода нет]
Пойдем в обратном хронологическом порядке и откатимся на несколько месяцев и 0.58 битов назад по отношению к статье.
Собственно, здесь по существу и расписана вся экспериметнальная постановка, на которой основывается статья с тернарной квантизацией.
Метод
Линейные слои заменяются на
BitLinear
, где элементы принимают только два значения -1 и 1. Если вес больше среднего элемента по матрице - то он 1, иначе -1. И общий масштаб равен среднему модулю веса. Максимально дешево и сердито 😈. Такая операция недифференцируема, потому используется STE. На этапе обучения авторы хранят полный тензор весов во float.Активации квантуются в 8 бит с помощью равномерной сетки.
Чтобы веса лучше квантовались, перед линейным слоем стоит LayerNorm.
Вычисление среднего значения для определения среднего значения по тензору требует синхронизации при model parallelism. И во избежание лишней коммуникации между процессами при распределенном обучении среднее считается по части матрицы, лежащей на данном процессе.
Странно, что они не рассматирвают поканальное квантование, или даже группами по 256: выразительность больше, а размер модели все еще не сильно отличается от 1 бита.
Далее авторы приводят табличку, показывающую насколько энергоэффективнее INT8 по сравнению с fp16 на разных техпроцессах. На случай, если Грета будет ревьюером.
Эксперименты
Обучают на смеси Pile, CommonCrawl, CC-Stories, RealNews модели размером от 125M до 6.7B. По перплексии полученные модели ожидаемо хуже бейзлайна в fp16, но зато, если нормализовать на энергопотребление, то BitNet смотрится весьма представлительно.
Обучение BitNet с STE требует большего learning rate для адекватной сходимости (~8e-4), на котором fp16 расходится.
По 0-шот бенчам якобы не слишком сильно уступают fp16 трансформеру, однако вопрос в том, насколько хорошо был затюнен сам бейзлайн, и сами бенчи были выбраны по-хитрому. BitNet 6.7B выдает 55.9% на бенчах, но при этом качество случайной модели 43.8% и относительный отрыв от рандом выглядит не таким большим.
Конкурентые PTQ подходы, стартующие с fp16 трансформера конкренто ломаются в низкой битности (тогда еще не вышли QuIP# и AQLM).
Вывод
С одной стороны, неплохо, что это уже как-то работает, но бенчи и бейзлайны были подобраны не слишком честно) BitNet1.58 выдает уже значительно более высокое качество, благодаря возможности принимать хотя бы 0-ое значение.
👍9
Забавный каламбур выйдет, если relaxml выпустят QuIP# версию свеженькой https://huggingface.co/CohereForAI/c4ai-command-r-v01. Модель от Cohere подвергнется Incoherence Processing.
huggingface.co
CohereLabs/c4ai-command-r-v01 · Hugging Face
We’re on a journey to advance and democratize artificial intelligence through open source and open science.
😁5
Маск долго тянул интригу, но таки к исходу недели выпустил Grok на волю.
https://github.com/xai-org/grok
1️⃣ Здоровенная херобора на 314B.
2️⃣ Код модели и инференса на jax+haiku.
3️⃣ 8 экспертов (на инференсе активируются 2).
4️⃣ Словарь - 128к токенов.
5️⃣ Модель идет с 8-битной квантизацией (что все равно потребует 4 A100, чтобы только уместить)
6️⃣ Длина контекста - 8к
7️⃣ Архитектура навскидку та же, что у Mixtral (Llama-подобный трансформер)
https://github.com/xai-org/grok
1️⃣ Здоровенная херобора на 314B.
2️⃣ Код модели и инференса на jax+haiku.
3️⃣ 8 экспертов (на инференсе активируются 2).
4️⃣ Словарь - 128к токенов.
5️⃣ Модель идет с 8-битной квантизацией (что все равно потребует 4 A100, чтобы только уместить)
6️⃣ Длина контекста - 8к
7️⃣ Архитектура навскидку та же, что у Mixtral (Llama-подобный трансформер)
🤯15
GaLore: Memory-Efficient LLM Training by Gradient Low-Rank Projection
[Статья][Код]
Введение
В связи со стремительным ростом размера моделей, все более острой становится проблема memory-efficient обучения LLM. По существу, рядовому пользователю доступны лишь parameter-efficient файнтьюны предобученных моделей. В разобранной ранее статье ReLoRA было предложено обучать несколько низкоранговых добавок и вливать их в веса. Однако, для достижения качества, не сильно уступающему обучению всей модели целиком, этап обучения всей модели целиком был необходим, то есть multi-GPU обучения все равно не избежать.
В этой статье был предложен подход, который позволил достичь с Llama-7b-подобной моделью качества близкого к полному обучению, доступный владельцам 1️⃣ GPU с 24Гб VRAM.
Метод
Суть метода довольно проста и не нова, по существу 👨🦳 .
Низкоранговые LoRA добавки неплохо работают на стадии дообучения, но эффективный pretrain требует заметать в процессе обучения пространство большой размерности. Однако, сами изменения весов могут (и авторы даже дают некоторое обоснование данному явлению) лежать в пространстве низкой размерности.
Отсюда мысль - проектировать градиенты и состояния оптимизатора в пространство низкой размерности. А именно делают следующее:
1️⃣ Считают градиент по весу на n-шаге
2️⃣ Считают его SVD разложение, откуда достают первые r векторов, отвечающих главным сингулярным значениям.
3️⃣ Проектируют на полученные подпространства состояния оптимизатора
В основе работы метода - предположение о том, что градиенты слабо меняются между соседними итерациями. Прикрутить его можно более-менее к любому стандартному градиентному алгоритму оптимизации - SGD, Adam (хоть исходный, хоть Adam8bit).
GaLore требует даже меньше памяти на линейный слой c n входными и m выходными нейронами, чем LoRA (с Adam).
🔴 LoRA :
🟢GaLore :
[Статья][Код]
Введение
В связи со стремительным ростом размера моделей, все более острой становится проблема memory-efficient обучения LLM. По существу, рядовому пользователю доступны лишь parameter-efficient файнтьюны предобученных моделей. В разобранной ранее статье ReLoRA было предложено обучать несколько низкоранговых добавок и вливать их в веса. Однако, для достижения качества, не сильно уступающему обучению всей модели целиком, этап обучения всей модели целиком был необходим, то есть multi-GPU обучения все равно не избежать.
В этой статье был предложен подход, который позволил достичь с Llama-7b-подобной моделью качества близкого к полному обучению, доступный владельцам 1️⃣ GPU с 24Гб VRAM.
Метод
Суть метода довольно проста и не нова, по существу 👨🦳 .
Низкоранговые LoRA добавки неплохо работают на стадии дообучения, но эффективный pretrain требует заметать в процессе обучения пространство большой размерности. Однако, сами изменения весов могут (и авторы даже дают некоторое обоснование данному явлению) лежать в пространстве низкой размерности.
Отсюда мысль - проектировать градиенты и состояния оптимизатора в пространство низкой размерности. А именно делают следующее:
1️⃣ Считают градиент по весу на n-шаге
2️⃣ Считают его SVD разложение, откуда достают первые r векторов, отвечающих главным сингулярным значениям.
3️⃣ Проектируют на полученные подпространства состояния оптимизатора
В основе работы метода - предположение о том, что градиенты слабо меняются между соседними итерациями. Прикрутить его можно более-менее к любому стандартному градиентному алгоритму оптимизации - SGD, Adam (хоть исходный, хоть Adam8bit).
GaLore требует даже меньше памяти на линейный слой c n входными и m выходными нейронами, чем LoRA (с Adam).
🔴 LoRA :
(mn + mr + nr)
параметров, (2mr + 2nr)
состояний оптимизатора🟢GaLore :
mn
параметров, (mr + 2nr)
состояний оптимизатора👍12🔥6
Эксперименты
Рассматривают две постановки
1️⃣ Предобучение на С4
2️⃣ Дообучение на GLUE
Обучают на C4 на бюджетах порядка 1-10B токенов, ибо авторы не слишком богатые 💸.
На предобучении GaLore лишь немного уступает стандартному обучению всей модели целиком и заметно опережает ReLoRA. Просто низкоранговые веса работают ожидаемо плохо.
GaLore хорошо совмещается с Adam8bit, давая значительную экономию в памяти и не просаживая качество. Экономия по памяти 63.3% по сравнению с bf16 Adam и 52.3% c 8bit Adam, соответственно.
Основные два параметра у алгоритма - 1️⃣ размерность низкорангового пространства и 2️⃣ частота обновления. Чем больше размерность - тем ближе алгоритм к Adam, но и прожорливее по памяти. Слишком часто обновлять матрицы проекции - вычислительно накладно и не очень хорошо по качеству, слишком редко - дешево, но плохо по качеству. Лучше всего работает обновление раз в ~100 шагов обучения (полагаю оптимум зависит от размера батча) и не увеличивает среднее время на шаг обучения.
Дообучение на GLUE дает примерно то же качество, что и LoRA при том же ранге.
Вывод
По ощущениям, хороший и полезный результат, с серьезными перспективами на практике. Интересно, насколько хорошо предложенный метод сработает на large-scale обучении порядка триллиона токенов. Правда, те, кто могут себе позволить себе обучать на триллионах токенов, имеют в распоряжении не один хост с high-end GPU…
Рассматривают две постановки
1️⃣ Предобучение на С4
2️⃣ Дообучение на GLUE
Обучают на C4 на бюджетах порядка 1-10B токенов, ибо авторы не слишком богатые 💸.
На предобучении GaLore лишь немного уступает стандартному обучению всей модели целиком и заметно опережает ReLoRA. Просто низкоранговые веса работают ожидаемо плохо.
GaLore хорошо совмещается с Adam8bit, давая значительную экономию в памяти и не просаживая качество. Экономия по памяти 63.3% по сравнению с bf16 Adam и 52.3% c 8bit Adam, соответственно.
Основные два параметра у алгоритма - 1️⃣ размерность низкорангового пространства и 2️⃣ частота обновления. Чем больше размерность - тем ближе алгоритм к Adam, но и прожорливее по памяти. Слишком часто обновлять матрицы проекции - вычислительно накладно и не очень хорошо по качеству, слишком редко - дешево, но плохо по качеству. Лучше всего работает обновление раз в ~100 шагов обучения (полагаю оптимум зависит от размера батча) и не увеличивает среднее время на шаг обучения.
Дообучение на GLUE дает примерно то же качество, что и LoRA при том же ранге.
Вывод
По ощущениям, хороший и полезный результат, с серьезными перспективами на практике. Интересно, насколько хорошо предложенный метод сработает на large-scale обучении порядка триллиона токенов. Правда, те, кто могут себе позволить себе обучать на триллионах токенов, имеют в распоряжении не один хост с high-end GPU…
🤔7
fp8 и с чем его едят
[Статья][Док в transformer.engine]
Введение
Невероятный прирост производительности каждого нового поколения Nvidia на графиках в презентациях GTC кроме объективного улучшения архитектуры обусловлен еще и переходом к типам все более низкой ⬇️ точности (что было остроумно подмечено Love. Death. Transformers.).
Как известно, инферить нейросетки с весами низкой точности можно и нужно. Но, вопрос в том, насколько сложно обучать в числах с плавающей точкой пониженной точности.
Наивное обучение в fp16, без automated mixed precision, как известно, нередко приводит к неприятным сюрпризам типа NaN в лоссах и градиентах. Градиенты могут быть слишком большими, чтобы представляться в fp16, либо слишком маленькими, и адаптивно подбираемый loss scale сдвигает гистограмму градиентов в нужный диапазон значений. Есть еще bf16 (поддерживаемый, начиная с архитектуры Ampere), который имеет более широкий диапазон, но большую погрешность представлений.
И в семействе Hopper добавили поддержку вычислений с fp8.
Метод
fp8 - на самое деле, не 1️⃣, а 2️⃣ типа.
E4M3 c 4 битами на экспоненту и 3 на мантиссу используется для весов и активаций, которые обычно лежат в сравнительно узком диапазоне и важнее точность представления, чем возможность принимать экстремальные значения. Бесконечность не представлена.
E5M2 с 5 битами на экспоненту и 3 на мантиссу используется для градиентов и состояний оптимизатора, где допустима большая погрешность в представлении и больше разброс принимаемых значений.
Обычный loss scaling как в half precision не работает, и приходится иметь для каждого тензора адаптивный масштаб (как в квантизации), чтобы загнать его в удобный диапазон. Определять его на лету накладно. И потому предлагается хранить некоторое скользящее среднее максимумов и на него масштабировать.
Эксперименты
Авторы тестируют эффективность обучения в fp8 на ImageNet-1k, LSTM на WMT и претрейне GPT-3 подобного трансформера на Pile.
fp8 почти везде смог показать конечное качество как half precision бейзлайн за исключением MobileNet-v2, где точность просела на 0.5%.
На языковых задачах fp8 модели достигают примерно того же качества, что и half precision.
В ablation показывают, что адаптивный масштаб для каждого тензора при конвертации bfloat16 модели в fp8 важен, иначе заметно проседает качество даже при оптимальном выборе сдвига экспоненты. Предобученный half-precision BERT без проблем представляется в fp8.
Вывод
fp8 тип выглядит вполне полезным и перспективным. Однако, обучение LLMок с ним, по всей видимости, требует дополнительной возни и несколько вагонов с H100 (и маленькую тележку). Потому на текущий момент, известные открытые модели обучались в half precision. Вероятно, OpenAI и Anthropic что-то пробовали шаманить в fp8, но кто об этом расскажет…
[Статья][Док в transformer.engine]
Введение
Невероятный прирост производительности каждого нового поколения Nvidia на графиках в презентациях GTC кроме объективного улучшения архитектуры обусловлен еще и переходом к типам все более низкой ⬇️ точности (что было остроумно подмечено Love. Death. Transformers.).
Как известно, инферить нейросетки с весами низкой точности можно и нужно. Но, вопрос в том, насколько сложно обучать в числах с плавающей точкой пониженной точности.
Наивное обучение в fp16, без automated mixed precision, как известно, нередко приводит к неприятным сюрпризам типа NaN в лоссах и градиентах. Градиенты могут быть слишком большими, чтобы представляться в fp16, либо слишком маленькими, и адаптивно подбираемый loss scale сдвигает гистограмму градиентов в нужный диапазон значений. Есть еще bf16 (поддерживаемый, начиная с архитектуры Ampere), который имеет более широкий диапазон, но большую погрешность представлений.
И в семействе Hopper добавили поддержку вычислений с fp8.
Метод
fp8 - на самое деле, не 1️⃣, а 2️⃣ типа.
E4M3 c 4 битами на экспоненту и 3 на мантиссу используется для весов и активаций, которые обычно лежат в сравнительно узком диапазоне и важнее точность представления, чем возможность принимать экстремальные значения. Бесконечность не представлена.
E5M2 с 5 битами на экспоненту и 3 на мантиссу используется для градиентов и состояний оптимизатора, где допустима большая погрешность в представлении и больше разброс принимаемых значений.
Обычный loss scaling как в half precision не работает, и приходится иметь для каждого тензора адаптивный масштаб (как в квантизации), чтобы загнать его в удобный диапазон. Определять его на лету накладно. И потому предлагается хранить некоторое скользящее среднее максимумов и на него масштабировать.
Эксперименты
Авторы тестируют эффективность обучения в fp8 на ImageNet-1k, LSTM на WMT и претрейне GPT-3 подобного трансформера на Pile.
fp8 почти везде смог показать конечное качество как half precision бейзлайн за исключением MobileNet-v2, где точность просела на 0.5%.
На языковых задачах fp8 модели достигают примерно того же качества, что и half precision.
В ablation показывают, что адаптивный масштаб для каждого тензора при конвертации bfloat16 модели в fp8 важен, иначе заметно проседает качество даже при оптимальном выборе сдвига экспоненты. Предобученный half-precision BERT без проблем представляется в fp8.
Вывод
fp8 тип выглядит вполне полезным и перспективным. Однако, обучение LLMок с ним, по всей видимости, требует дополнительной возни и несколько вагонов с H100 (и маленькую тележку). Потому на текущий момент, известные открытые модели обучались в half precision. Вероятно, OpenAI и Anthropic что-то пробовали шаманить в fp8, но кто об этом расскажет…
👍18🤔1
Появилась неофициальная версия Мистрали-7b, которая является с настоящий момент более-менее SOTA среди публичных моделей в легкой весовой категории. Однако, судя по замерам пользователей, новая версия не то, чтобы улучшилась по сравнению со своей предшественницей.
[Пост на Abstract.DL]
[Пост на Abstract.DL]
👍2
image.png
43.3 KB
По собственным замерам, наблюдаю небольшое улучшение перплексии на 8k контексте, и нестатзначимую просадку на 0-shot. Возможно, при конвертации пользователь с ником alpindale немного повредил модельку.
👍3
DenseFormer: Enhancing Information Flow in Transformers via Depth Weighted Averaging
[Статья] [Код]
Skip connections позволяют обучать по-настоящему глубокие сети. Впервые они появились в статьях про ResNet и UNet, и с тех пор было предложено множество их вариаций - DenseNet connections, CSP, и зоопарк вариаций. Тот же трансформер унаследовал структуру skip connections от ResNet.
В этой работе по существу воплотили DenseNet в трансформере.
Метод
DenseNet-like skip connections реализованы следующим образом: ключи и значения в данном блоке получаются как взвешенная сумма ключей и значений с этого и всех (или не только лишь всех) предыдущих блоков. Дополнительного оверхеда по памяти нет ❌, так как kv-кэши активации с прошлых блоков все равно придется сохранять для backpropagation или авторегрессивной генерации.
Чтобы воспроизводить поведение стандартного трансформера - веса с прошлых блоков инициализируются нулями.
Однако, все равно приходится делать массу сложений, что замедляет работу сети. Потому авторы предлагают две модификации:
1️⃣ Dilated DenseFormer. Считается взвешенная сумма только через k-слоев.
2️⃣ Periodic DenseFormer. Добавление kv проводится только для каждого k-го токена.
Обе модификации снижают объем вычислений, не снижая качество.
Эксперименты
Модели обучают OpenWebText и смотрят на перплексию на валидационной выборке. Бейзлайновые сети довольно глубокие (48 - 90 блоков) и узкие 8 голов по 64 канала. При том же числе параметров DenseFormer немного лучше трансформера по перплексии, но и медленнее. Потому авторы сравниваются еще и в сетапе с заданным временем инференса, и DenseFormer оказывается все еще эффективнее.
Dilated и Periodic опции заметно ускоряют модель, при этом не просаживая по качеству с полносвязным Denseformer.
Далее смотрят на величину выученных коэффициентов. Ожидаемо, наибольший вес имеют коэффициенты в данном блоке, но еще сильны skip connections с первым блоком. Многие веса малы по величине, тем не менее важны, и прунинг даже небольшой доли самых малых весов сажает качество.
Вывод
Дешевая и вроде бы эффективная настройка над трансформером. Однако постановка экспериментов изначально неблагоприятна для базовой модели, так как глубокие узкие модели имеют свойство тяжело обучаться. Вероятно, более широкий трансформер с тем же числом параметров отработал бы лучше. А для неглубоких сетей, скорее всего, выигрыш от конструкции незначителен. Да и много что, дающее выигрыш на малых экспериментах не воспроизводится на масштабе...
[Статья] [Код]
Skip connections позволяют обучать по-настоящему глубокие сети. Впервые они появились в статьях про ResNet и UNet, и с тех пор было предложено множество их вариаций - DenseNet connections, CSP, и зоопарк вариаций. Тот же трансформер унаследовал структуру skip connections от ResNet.
В этой работе по существу воплотили DenseNet в трансформере.
Метод
DenseNet-like skip connections реализованы следующим образом: ключи и значения в данном блоке получаются как взвешенная сумма ключей и значений с этого и всех (или не только лишь всех) предыдущих блоков. Дополнительного оверхеда по памяти нет ❌, так как kv-кэши активации с прошлых блоков все равно придется сохранять для backpropagation или авторегрессивной генерации.
Чтобы воспроизводить поведение стандартного трансформера - веса с прошлых блоков инициализируются нулями.
Однако, все равно приходится делать массу сложений, что замедляет работу сети. Потому авторы предлагают две модификации:
1️⃣ Dilated DenseFormer. Считается взвешенная сумма только через k-слоев.
2️⃣ Periodic DenseFormer. Добавление kv проводится только для каждого k-го токена.
Обе модификации снижают объем вычислений, не снижая качество.
Эксперименты
Модели обучают OpenWebText и смотрят на перплексию на валидационной выборке. Бейзлайновые сети довольно глубокие (48 - 90 блоков) и узкие 8 голов по 64 канала. При том же числе параметров DenseFormer немного лучше трансформера по перплексии, но и медленнее. Потому авторы сравниваются еще и в сетапе с заданным временем инференса, и DenseFormer оказывается все еще эффективнее.
Dilated и Periodic опции заметно ускоряют модель, при этом не просаживая по качеству с полносвязным Denseformer.
Далее смотрят на величину выученных коэффициентов. Ожидаемо, наибольший вес имеют коэффициенты в данном блоке, но еще сильны skip connections с первым блоком. Многие веса малы по величине, тем не менее важны, и прунинг даже небольшой доли самых малых весов сажает качество.
Вывод
Дешевая и вроде бы эффективная настройка над трансформером. Однако постановка экспериментов изначально неблагоприятна для базовой модели, так как глубокие узкие модели имеют свойство тяжело обучаться. Вероятно, более широкий трансформер с тем же числом параметров отработал бы лучше. А для неглубоких сетей, скорее всего, выигрыш от конструкции незначителен. Да и много что, дающее выигрыш на малых экспериментах не воспроизводится на масштабе...
🤔8👍4🔥2🐳1
Towards 1-bit Machine Learning Models
[Блогпост]
Спасибо за наводку https://www.tg-me.com/toshoseti
Сжатие и ускорение LLM нынче пользуется большим спросом, и потому существуют кожаные мешки, пытающиеся сорвать хайп на этой теме.. И вот недавно вышел воистину чудный образец.
Метод
1️⃣ Квантуют модель методом HQQ
2️⃣ Дообучают LoRA адаптер поверх квантованной модели
Все вместе называется HQQ+.
Эксперименты
Все эксперименты проводятся с Llama-2-7b. Для дообучения базовой модели берут 2.8k примеров из WikiText2, для instruction finetuning - cмесь из guanaco, orca-math, MetaMathQA, UltraFeedBack_binarized.
На базовой модели HQQ ломает полностью модель при 1-битном квантовании, но LoRA адаптер якобы выравнивает модель по качеству с 2-битным QuIP#. А 2-битная по перплексии даже лучше исходной! Переходим на 1 и 2-битные модели?
Но есть нюансы:
1️⃣ Сравнение проводится со старой версией QuIP#. Да и то, почему-то перплексия хуже, чем заявлено в официальном блоге. А новые версии AQLM и QuIP# достигают перплексии ~6.2 на wikitext2.
2️⃣ Нет замеров на каких-либо других бенчмарках (хоть c4 и 0-shotах из lm-eval-harness).
Потому наверняка просто имеем дело с оверфитом под датасет, а сами модели не рабочие где-либо еще.
При AQLM квантовании в 2 бита у нас тоже улучшилась перплексия по сравнению с fp16, но качество на 0-шотах было хуже, чем у базовой модели. Так что нихрена это не улучшение.
При instruction finetuning 1-bit HQQ снова ломает модель до уровня рандома (качество около 1 / число ответов). Но адаптер позволяет оторваться на 10% от уровня рандома. А 2-битное квантование уже близко по качеству к Llama-2-7b-chat.
Однако, снова нет сравнения с SOTA quantization methods, и бенчмарки вызывают вопросы. Llama-2-7b-chat на TruthfulQA имеет качество 57.04%, а здесь репортят 45.32%.
Выводы
По большей части лютый скам, но все же некоторая мораль есть. Адаптер поверх сжатой модели дает серьезную компенсацию даже для поломанной модели. Идея применить адаптер поверх квантованной модели не нова и ведет начало как минимум от QLoRA.
[Блогпост]
Спасибо за наводку https://www.tg-me.com/toshoseti
Сжатие и ускорение LLM нынче пользуется большим спросом, и потому существуют кожаные мешки, пытающиеся сорвать хайп на этой теме.. И вот недавно вышел воистину чудный образец.
Метод
1️⃣ Квантуют модель методом HQQ
2️⃣ Дообучают LoRA адаптер поверх квантованной модели
Все вместе называется HQQ+.
Эксперименты
Все эксперименты проводятся с Llama-2-7b. Для дообучения базовой модели берут 2.8k примеров из WikiText2, для instruction finetuning - cмесь из guanaco, orca-math, MetaMathQA, UltraFeedBack_binarized.
На базовой модели HQQ ломает полностью модель при 1-битном квантовании, но LoRA адаптер якобы выравнивает модель по качеству с 2-битным QuIP#. А 2-битная по перплексии даже лучше исходной! Переходим на 1 и 2-битные модели?
Но есть нюансы:
1️⃣ Сравнение проводится со старой версией QuIP#. Да и то, почему-то перплексия хуже, чем заявлено в официальном блоге. А новые версии AQLM и QuIP# достигают перплексии ~6.2 на wikitext2.
2️⃣ Нет замеров на каких-либо других бенчмарках (хоть c4 и 0-shotах из lm-eval-harness).
Потому наверняка просто имеем дело с оверфитом под датасет, а сами модели не рабочие где-либо еще.
This is a significant finding, as it suggests that quantization with HQQ+ not only reduces the memory footprint and computational requirements but can also potentially improve the model's language modeling performance.
При AQLM квантовании в 2 бита у нас тоже улучшилась перплексия по сравнению с fp16, но качество на 0-шотах было хуже, чем у базовой модели. Так что нихрена это не улучшение.
При instruction finetuning 1-bit HQQ снова ломает модель до уровня рандома (качество около 1 / число ответов). Но адаптер позволяет оторваться на 10% от уровня рандома. А 2-битное квантование уже близко по качеству к Llama-2-7b-chat.
Однако, снова нет сравнения с SOTA quantization methods, и бенчмарки вызывают вопросы. Llama-2-7b-chat на TruthfulQA имеет качество 57.04%, а здесь репортят 45.32%.
Выводы
По большей части лютый скам, но все же некоторая мораль есть. Адаптер поверх сжатой модели дает серьезную компенсацию даже для поломанной модели. Идея применить адаптер поверх квантованной модели не нова и ведет начало как минимум от QLoRA.
🤝5👍3
Пояснение к приколу выше.
Многие методы data-aware квантизации/прунинга зиждятся на forward хуках поверх nn.Linear, nn.Conv*d.
Многие методы data-aware квантизации/прунинга зиждятся на forward хуках поверх nn.Linear, nn.Conv*d.