Когда 4K контекста уже мало
Представь, что твоя RL-модель читает техническую документацию в 100 страниц. Или анализирует историю чата за месяц. Или пытается понять логику кодовой базы. Стандартные 4K токенов — это примерно 8 страниц текста. Смешно.
До вчерашнего дня обучение моделей с подкреплением на длинных контекстах требовало либо кластера GPU, либо магии с оффлоадингом, либо кучу компромиссов. Команда Unsloth только что выкатила обновление GRPO, которое меняет правила игры.
Что они сделали и почему это работает
Технически, Unsloth применили три ключевые оптимизации, которые вместе дают мультипликативный эффект. Не просто сложили — перемножили.
1 Кастомные CUDA ядра для внимания
Вместо стандартного Flash Attention 2 (который, честно говоря, уже не так flash) они написали свои ядра, специализированные под паттерны доступа в GRPO. Обычно внимание вычисляет scores для всех токенов сразу. В RL-тренировке нам часто нужно только для последних N токенов — тех, где модель принимала решения.
Их ядра умеют "отсекать" вычисления для контекста, который не влияет на градиенты. Звучит просто, но реализация — ад из индексов и shared memory.
Если интересно, как вообще пишутся такие ядра, у нас есть отдельная статья про кастомные CUDA ядра. Спойлер: овчинка стоит выделки, но только если ты готов потратить месяц на отладку.
2 Динамический оффлоадинг активаций
Тут гениально просто. Вместо того чтобы хранить все активации для всего контекста в VRAM (что при 380K токенов съедает десятки гигабайт), они вычисляют, какие части точно понадобятся для обратного прохода, а какие можно выгрузить в CPU RAM и подгрузить обратно по мере необходимости.
Латентность? Да, есть. Но они компенсируют это асинхронными pre-fetch операциями. Пока GPU считает forward pass для одного чанка, CPU уже готовит следующий.
3 Float8 training без потерь
Float8 — не bfloat16 и даже не fp16. Это 8 бит на число. В теории — катастрофа для градиентов. На практике — они добавили loss scaling, который адаптируется динамически, и quantization, которая учитывает распределение значений в RL-обучении.
Ключевой трюк: они квантуют в float8 только те тензоры, которые участвуют в матричных умножениях для attention. Веса модели остаются в bfloat16. Такой гибридный подход.
Цифры, которые заставят тебя пересмотреть свои планы
| Контекст | Обычный GRPO (VRAM) | Unsloth GRPO (VRAM) | Ускорение |
|---|---|---|---|
| 4K токенов | 24 GB | 3.2 GB | 7.5x |
| 32K токенов | OOM на 24GB | 8.1 GB | ∞ (работает vs не работает) |
| 128K токенов | Даже не мечтай | 22 GB | — |
| 380K токенов | Фантастика | 48 GB (на A100) | — |
Цифра 380K — не случайная. Это примерно 760 страниц текста. Или вся "Война и мир". На одном GPU. Без шуток.
С чем сравнивать? Да почти не с чем
Альтернативы есть, но они либо дороже, либо сложнее, либо просто другие.
- TRL + PPO — классика, но PPO требует в 3-4x больше памяти на те же контексты. И нестабильнее.
- Пакетный GRPO на нескольких GPU — если у тебя есть кластер, можешь разбить контекст на части и распределить. Но синхронизация градиентов между картами съедает половину выигрыша. У нас есть инженерный гайд по этой теме, если интересно.
- Полный оффлоадинг на CPU — теоретически можно засунуть всё в оперативку. Но тогда обучение будет идти со скоростью 1 итерация в час. Не смешно.
- Методы вроде ZAGORA — хороши для больших моделей (70B+), но для 7B-13B моделей overhead слишком большой. Про ZAGORA мы уже писали.
Unsloth GRPO — это решение для одного GPU. Один карта, один разъем, одна проблема (решенная).
Кому это нужно прямо сейчас
Не всем. Если твоя модель отвечает на вопросы из пары абзацев — тебе хватит и стандартных 4K. Но вот кому стоит срочно качать обновление:
- Разработчикам coding assistants — теперь можно дать модели на обучение целый файл на 2000 строк и сказать "найди баги". Или даже несколько файлов. FrogMini нервно курит в сторонке.
- Создателям исследовательских агентов — агент читает несколько научных статей (каждая по 10-20 страниц), делает выводы, формулирует гипотезы. Раньше это требовало сложных систем с RAG. Теперь можно просто скормить тексты в контекст.
- Тем, кто fine-tune'ит модели для анализа логов — недельные логи приложения легко укладываются в 200-300K токенов.
- Энтузиастам, у которых только одна карта — например, RTX 4090 с 24GB. Раньше максимальный контекст был 32K с танцами с бубном. Теперь — 128K комфортно, 256K если потерпеть латентность.
Кстати, если у тебя Mac с Apple Silicon, проверь Unsloth-MLX. Там своя экосистема, но принципы те же.
Как начать использовать (без кода, обещаю)
Unsloth выложили всё на GitHub. Колаб-ноутбуки, примеры, документацию. Самый простой способ — взять их готовый ноутбук для GRPO и заменить в нём одну строчку:
Вместо обычного импорта GRPOTrainer — импортируйте UnslothGRPOTrainer. Всё. Остальной код остаётся таким же, как в нашем гайде по обучению 7B моделей на Colab.
Параметры для длинного контекста задаются через max_length. Хочешь 128K — поставь max_length=131072. Система сама подстроит чанкинг и оффлоадинг.
Важный нюанс: чем длиннее контекст, тем меньше batch size ты сможешь использовать. При 380K токенах batch size=1. Но это нормально — каждый пример уже содержит кучу информации.
Что будет дальше? Мой прогноз
Через месяц все основные RL-фреймворки скопируют эти оптимизации. TRL, Axolotl, LLama-Factory — все добавят поддержку длинного контекста через аналогичные трюки.
Но пока Unsloth на полгода впереди. Их кастомные ядра заточены именно под их имплементацию GRPO, и переписать их под PPO или другой алгоритм — нетривиально.
Самое интересное: теперь можно экспериментировать с truly long-context RLHF. Что если дать модели не просто пару примеров хорошего/плохого ответа, а целую историю взаимодействия с пользователем? Или документацию по API + примеры использования + чат с вопросами?
Это меняет игру для создания специализированных ассистентов. Не тех, что "помогают вообще", а тех, что знают твою кодобазу, твои процессы, твою документацию. И учатся на твоих коррекциях.
Мой совет: если ты задумывался о fine-tuning'е модели под свои нужды, но откладывал из-за "а как же длинные контексты?" — проблема решена. Бери и делай. На Colab бесплатно, на своей карте — тем более.
Осталось только придумать, чем заполнить эти 380K токенов. Может, начать с стратегии масштабирования для твоего проекта?