gonzo-обзоры ML статей – Telegram
gonzo-обзоры ML статей
24.1K subscribers
2.72K photos
2 videos
3 files
1.34K links
Авторы:
Гриша Сапунов, ранее руководитель разработки Яндекс-Новостей, ныне CTO Intento. Области интересов: AI/ML/DL, биоинформатика.
Лёша Тихонов, ранее аналитик в Яндексе, автор Автопоэта, Нейронной Обороны... Области интересов: discrete domain, NLP, RL.
Download Telegram
The first prize in generative art should be this
🔥77😁40🥱1🤝1
Cramming: Training a Language Model on a Single GPU in One Day
Jonas Geiping, Tom Goldstein
Статья: https://arxiv.org/abs/2212.14034
Код: https://github.com/JonasGeiping/cramming

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

В отличие от традиционного scale up, здесь делают scale down. Это безусловно важное направление, потому что в случае успеха позволяет больше вовлечься в современные работы исследователям-одиночкам или академии, обычно обделёнными мощными вычислительными ресурсами уровня Гугла.

Заодно такое исследование помогает оценить концептуальный прогресс за пределами просто наращивания мощностей.

Итак, каков setup?

- Обучают BERT-подобный трансформер на задачу MLM (masked language model) с нуля.
- Нигде в пайплайне нельзя использовать существующие предобученные модели (дистилляция запрещена).
- Можно использовать любые входные тексты (не только то, на чём обучался оригинальный BERT) кроме использующихся затем в downstream задачах, при условии, что они не отбирались какой-то предобученной моделью.
- Скачивание и препроцессинг текстов (фильтрация, токенизация) не учитываются в вычислительном бюджете (если используется какой-то representation learning типа эмбеддингов, то это должно быть учтено в бюджете).
- Обучение происходит на одном GPU в течение 24 часов.
- Перформанс на downstream задачах оценивается на GLUE (не Super GLUE). Необходимый файнтюнинг в бюджете не учитывается.

В работе пробовали GPU RTX2080Ti 2018 года, а также более современные RTX A4000, A6000 2020 года. Комп был с 4 ядрами и 32 Гб памяти.

При имплементации Берта пробовали много разных улучшений, для отбора лучшего не применяли каких-либо специализированных имплементаций чего-либо, только PyTorch + nvFuser (JIT-компилятор, делающий в рантайме fusion ядер для GPU, https://pytorch.org/blog/introducing-nvfuser-a-deep-learning-compiler-for-pytorch/). В качестве бейзлайна rotary embeddings и pre-norm.Только после выбора лучшего варианта уже добавили эффективную реализацию внимания FlashAttention (https://arxiv.org/abs/2205.14135) (хотя если я правильно понял дальше, она ничего особо не дала).

Интересно, что тип трансформера и его размер не сильно влияют на конечное значение лосса через 24 часа. У более тяжёлых моделей лосс уменьшается быстрее на каждое обновление по градиенту. Зато у мелких более высокий throughput, и они обрабатывают больше токенов за тот же бюджет.

Так как scaling laws связывают per-token перформанс модели с её размером, то, по мнению авторов, большие архитектурные изменения вроде как к большим улучшениям качества не приводят (хотя мне неочевидно, почему при существенном архитектурном изменении параметры этих законов не изменятся). Так, отсекли за отсутствие улучшений funnel transformer, выкидывание FFN-слоёв, добавление рекурретности (я так понял они под этим подразумевали модель по типу ALBERT с повторением слоя с одним и тем же набором параметров) и в том числе с обучением через BPTT, и перекройку архитектуры в deep-narrow.

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

В блоке внимания отключили bias для QKV. Пытались сделать меньше голов внимания, но в итоге всё равно оставили 12. Софтмакс не заменили, стандартный MHSA оставили, замена на новые эффективные не помогла (в том числе на FLASH или на Фурье). Rotary embeddings вроде как давали небольшое преимущество, но были медленнее.

В feedforward блоке тоже убрали bias -- размер модели особо не меняет, но ускоряет вычисления. В остальном почти не меняли, активацию оставили GELU. Какие-то небольшие улучшения были от gated linear units (GLU), но вроде как по коду в итоге оно не используется (или они GLU и GELU смешивают?).

Для позиционных эмбеддингов взяли scaled sinusoidal positional embeddings. Разделение входных и выходных не дало ничего, факторизация входных тоже.
👍31🔥6
Pre-normalization c LayerNorm лучше, чем post. Другие варианты этой модификации или RMSNorm не улучшили ничего.

Нелинейную голову убрали, decoder bias тоже, сделали sparse token prediction и выиграли в памяти.

Также потюнили гиперпараметры (какую долю токенов скрывать), оптимизаторы, но оставили Adam. Сделали простую one-cycle learning rate треугольником с максимумом посередине.

Сделали агрегацию микро-батчей, когда градиенты считаются на каждом батче размера до 96, но агрегируются и апдейтят параметры только на каждый 16 или 42 батч (потому что с точки зрения лосса или качества на downstream задаче оптимальный батч сильно больше 96). Ещё и сделали постепенное увеличение числа агрегируемых микро-батчей. Дропаут на предобучении отключили.

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

Данные свежая англ. Википедия и bookcorpus + lower-case, strip accents & non-ascii. Токенизатор WordPiece со словарём 2^15 (меньшие работали хуже, а больший не лучше). SentencePiece с униграммами или BPE тоже не лучше. Нарезали на последовательности длины 128, батчи были от 64 до 96. При ограниченном вычислительном бюджете получилось достаточно сэмплов для одной эпохи без повторного обращения к любому элементу данных.

Можно поменять методы очистки, а можно и источник сменить. Пробовали на подмножествах The Pile и C4. The Pile оказался лучше с точки зрения качества на MNLI, но в принципе есть куда улучшать дедупликации, фильтрации и сортировки, особенно для C4. Про сортировку интересно, помогает отсортировать по убыванию средней частотности токена, так что сначала оказываются вероятные последовательности, а до маловероятных не добираемся. Также постепенное увеличение батча до 4096 к концу обучения особенно хорошо на C4. Вероятно, оба изменения помогают бороться с флуктуациями в распределении данных.

Далее систематически исследовали перформанс на GLUE без WNLI как в оригинальной работе про Берт.

Сравнивали с чекпойнтом 1) полноценного обученного Берта, 2) модели обученной по рецепту Берта, но в пределах заданного бюджета, 3) другой работы (https://arxiv.org/abs/2104.07705) про обучение BERT малой кровью. Перформанс неожиданно крутой, в среднем не сильно отстаёт от полного Берта. На некоторых датасетах даже превосходит.

По абляциям показали, что в среднем около 2 процентных пунктов по усреднённому GLUE даёт модификация архитектуры, 1 п.п. изменения в данных, и пол п.п. изменение процедуры обучения.

Если полученный рецепт теперь отскейлить вверх на 8 A6000 в течение 48 часов, это даёт бюджет примерно 30% оригинального BERT и 1.5% RoBERTa, при этом существенно превосходя по качеству первый и попадая в диапазон второй.

Работает в общем зубрёжка. Можно, получается, и дома на выходных обучать.

И ещё, кажется, такие эксперименты можно и нужно проводить автоматизированно, каким-нибудь эволюционным алгоритмом или даже через нечто типа network architecture search (NAS). По идее, большой запуск NAS в режиме cramming может быть на порядки эффективнее старых подходов (но это не точно, надо внимательно считать).
👍34🌭1
This media is not supported in your browser
VIEW IN TELEGRAM
7🔥7
Дались всем эти пальцы...
🔥45😐4😁3