28 августа 2025 г. • Авторы: Дэниел и Майкл
28 августа 2025 г.
Авторы: Дэниел и Майкл
Мы рады представить поддержку Unsloth Flex Attention для обучения OpenAI gpt-oss, которая обеспечивает увеличение длины контекста более чем в 8 раз, снижение использования видеопамяти (VRAM) более чем на 50% и ускорение обучения более чем в 1,5 раза по сравнению со всеми существующими реализациями, включая те, что используют Flash Attention 3 (FA3). Unsloth Flex Attention позволяет проводить обучение с длиной контекста 60 тыс. токенов всего на 80 ГБ видеопамяти для BF16 LoRA. А также:
- Теперь вы можете экспортировать/сохранять вашу QLoRA-дообученную модель gpt-oss в форматы llama.cpp, vLLM, Ollama или HF.
- Мы исправили проблему, при которой потери при обучении gpt-oss стремились к бесконечности на GPU с поддержкой float16 (например, T4 в Colab).
- Мы исправили проблемы реализации gpt-oss, не связанные с Unsloth, в частности, обеспечив корректное применение swiglu_limit = 7.0 во время вывода MXFP4 в библиотеке transformers.
gpt-oss-20b
1xH100 80 ГБ
>8x
более длинный контекст
gpt-oss-20b
1xH100 80 ГБ
>1.7x
быстрее
gpt-oss-20b
1xH100 80 ГБ
>50%
меньше VRAM
🦥 Представляем Unsloth Flex Attention
С помощью Unsloth Flex Attention один GPU H100 с 80 ГБ видеопамяти может обрабатывать контекст длиной до 81 тыс. токенов с использованием QLoRA и 60 тыс. токенов с BF16 LoRA. Чем больше длина контекста, тем больше преимуществ вы получите от Unsloth Flex Attention. Для сравнения, все остальные реализации, не использующие Unsloth, ограничены 9 тыс. токенов контекста на GPU с 80 ГБ памяти и достигают лишь 15 тыс. с FA3. Однако FA3 не подходит для обучения gpt-oss, так как в нем отсутствует поддержка обратного прохода для «аттеншн-синков» (attention sinks). Поэтому, если вы ранее использовали FA3 для обучения gpt-oss, мы рекомендуем пока воздержаться от этого. Таким образом, максимальная длина контекста без Unsloth на 80 ГБ VRAM составляет ~9 тыс. токенов.
Обучение с Unsloth Flex Attention обеспечивает ускорение как минимум в 1,3 раза, причем выигрыш растет по мере увеличения длины контекста, достигая ускорения до 2 раз. Поскольку Flex Attention масштабируется вместе с контекстом, более длинные последовательности обеспечивают большую экономию как видеопамяти, так и времени обучения.
Огромное спасибо Рохану Панди за его реализацию Flex Attention, которая непосредственно вдохновила нас на разработку Unsloth Flex Attention.
📐 Реализация Flex Attention от Unsloth
Flex Attention чрезвычайно мощный инструмент, так как он предоставляет разработчику 2 пути настройки механизма внимания: модификатор оценок (f) и функцию маскирования (M). Модификатор оценок (f) позволяет изменять логиты внимания перед операцией softmax, а функция маскирования (M) позволяет пропускать операции, если они не нужны (например, при использовании скользящего окна внимания, которое видит только последние 128 токенов). Хитрость в том, что Flex Attention предоставляет быстро генерируемые ядра Triton с произвольными модификаторами оценок и функциями маскирования!
Это означает, что мы можем использовать Flex Attention для реализации «аттеншн-синков»! Реализация одного аттеншн-синка предусмотрена как в оригинальном репозитории OpenAI gpt-oss, так и в реализации HuggingFace transformers.
Используя некоторые визуализационные утилиты из репозитория Flex Attention на Github, мы можем это визуализировать. Предположим, длина последовательности равна 16, а скользящее окно — 5. Слева показан последний столбец синка (стандартная реализация), а справа — случай, когда мы перемещаем расположение синка на индекс 0 (наша реализация).
🕶️ Аттеншн-синки (Attention Sinks)
Модель GPT OSS от OpenAI использует чередующийся паттерн скользящего окна внимания, полного внимания, скользящего окна внимания и так далее (SWA, FA, SWA, FA и т. д.). Каждое скользящее окно учитывает только 128 токенов (включая текущий), поэтому объем вычислений значительно сокращается. Однако это также означает, что извлечение информации из длинного контекста и рассуждения становятся бесполезными из-за малого размера скользящего окна. Большинство лабораторий решают эту проблему, расширяя скользящее окно до 2048 или 4096 токенов. OpenAI использовала аттеншн-синки из статьи «Efficient Streaming Language Models with Attention Sinks», которая показывает, что можно использовать небольшое скользящее окно, если добавить глобальное внимание на первый токен! В статье приведена хорошая иллюстрация ниже:
В статье обнаружено, что механизм внимания, по-видимому, придает большой вес первым нескольким токенам (от 1 до 4), и при их удалении во время операции скользящего окна, поскольку мы видим только последние N (например, 128) токенов, эти «важные» первые токены исчезают.
Если мы построим график логарифмической перплексии (чем выше, тем хуже) и проведем вывод на длинном контексте после длины контекста предобученной модели, мы увидим, что перплексия резко возрастает (это плохо). Однако красная линия (аттеншн-синки) остается низкой, что очень хорошо!
💾 Новое: Сохранение в GGUF, vLLM после обучения gpt-oss
Теперь вы можете дообучать gpt-oss с помощью QLoRA и напрямую сохранять, экспортировать или объединять модель в llama.cpp, vLLM или HF — не только в Unsloth. Мы надеемся вскоре выпустить бесплатный ноутбук.
Ранее любая QLoRA-дообученная модель gpt-oss была ограничена использованием только в Unsloth. Мы устранили это ограничение, внедрив деквантование по требованию для базовых моделей MXFP4 (таких как gpt-oss) в процессе слияния LoRA. Это позволяет экспортировать вашу дообученную модель в формате bf16.
После дообучения вашей модели gpt-oss вы теперь можете объединить ее в 16-битный формат одной командой:
✨ Прямое дообучение gpt-oss
Мы также добавили поддержку прямого дообучения моделей gpt-oss, внедрив патчи, позволяющие загружать собственный квантованный формат MXFP4. Это позволяет загружать модель «openai/gpt-oss» с менее чем 24 ГБ видеопамяти и дообучать ее с помощью QLoRA. Просто загрузите модель, используя: model, tokenizer = FastLanguageModel.from_pretrained( #model_name = "unsloth/gpt-oss-20b-BF16", model_name = "unsloth/gpt-oss-20b", dtype = dtype, # None для автоопределения max_seq_length = max_seq_length, # Выберите любое для длинного контекста! load_in_4bit = True, # 4-битное квантование для уменьшения памяти full_finetuning = False, # [НОВОЕ!] У нас теперь есть полное дообучение! # token = "hf_...", # используйте, если работаете с закрытыми моделями)
🐛 Исправления ошибок для gpt-oss
Недавно мы сотрудничали с Hugging Face, чтобы решить проблемы с выводом, используя ядра OpenAI и обеспечив правильное применение swiglu_limit = 7.0 во время вывода MXFP4.
Основываясь на отзывах пользователей, мы обнаружили, что длительные сеансы обучения QLoRA (более 60 шагов) могут приводить к расхождению функции потерь и последующим ошибкам. Эта проблема возникала только на устройствах, которые не поддерживают BF16 и вместо этого переключаются на F16 (например, GPU T4). Важно отметить, что это не влияло на обучение QLoRA на GPU A100 или H100, а также на обучение LoRA на GPU f16.
После тщательного расследования мы привели поведение функции потерь при обучении в соответствие на всех конфигурациях GPU, включая те, что ограничены F16. Если вы ранее сталкивались с проблемами из-за этого, мы рекомендуем использовать наш новый обновленный ноутбук для gpt-oss!
📈 Бенчмарки gpt-oss-20b
Мы протестировали gpt-oss-20b и применили LoRA ко всем линейным слоям (Q, K, V, O, gate, up и down) с рангом = 32 и размером пакета (batch size) = 1. Мы дополнили все последовательности до определенной максимальной длины, чтобы имитировать рабочие нагрузки дообучения на длинном контексте.
gpt-oss-20b BF16 LoRA — Длина контекста vs. VRAM GPU
Длина контекста
Unsloth (+ Flex A)
Официальная поваренная книга + FA3
Официальная поваренная книга
1024
45.2
46.6
47.3
2048
45.94
49.7
51.3
4096
47.07
56.1
71.1
8192
49.27
68.7
OOM
16,384
OOM
OOM
32,768
63.73
OOM
OOM
61,234
OOM
OOM
💕 Спасибо!
Как обычно, огромное спасибо всем, кто использует и делится Unsloth — мы очень это ценим. 🙏
Как всегда, обязательно присоединяйтесь к нашей странице в Reddit и серверу в Discord, чтобы получить помощь или просто выразить свою поддержку! Вы также можете следить за нами в Twitter и подписаться на нашу рассылку на Substack.
Спасибо за прочтение!
Дэниел и Майкл Хан 🦥 28 августа 2025 г.