Когда ваша MoE-модель еле ползёт на T4
Вы собрали архитектуру из 8 экспертов, развернули DeepSpeed, включили ZeRO-3... и получили 2 токена в секунду. Знакомо? Стандартные пайплайны для обучения разреженных моделей — тот ещё цирк: routing через PyTorch ops жрёт VRAM, top-k селекция тормозит, а gradient checkpointing превращает backward в ад.
К середине 2026 года ситуация сжалась до одной проблемы: как выжать максимум из скромного T4, не покупая H100? Ответ пришёл оттуда, откуда его ждали меньше всего — от опенсорс-сообщества. Новый фреймворк PyTorch MoE/MoD Training Framework (лицензия Apache 2.0) предлагает кастомные CUDA-ядра, которые переписывают все узкие места, и встройку в DeepSpeed, которая не требует танцев с бубном.
Ключевая метрика: ускорение до 7x на T4 в режиме mixed precision для моделей с 16 экспертами и top-2 gating. Без потери точности. С открытым кодом. И это не маркетинг — это результаты бенчмарков на реальных датасетах.
На прошлых выходных я переписал свой старый проект с чистым PyTorch на этот фреймворк. Результат: loss сходится быстрее, а GPU utilisation подскочила с 35% до 88%. Рассказываю, как оно устроено и почему вам, вероятно, стоит сделать то же самое.
Что внутри коробки: от custom kernels до DeepSpeed-интеграции
Фреймворк не пытается переизобрести велосипед. Он решает три конкретные задачи, которые душат MoE-обучение:
- Routing и gating — кастомный CUDA-кернел для вычисления softmax по экспертам и top-k selection. Вместо того чтобы гонять данные через Python-циклы и PyTorch scatter, он делает всё за один launch.
- Dispatch и combine — перекладывание токенов между экспертами. Стандартный F.linear с маскировкой превращается в fused kernel, который читает/пишет в буферы напрямую.
- Backward через разреженные операции — градиенты для gating и dispatch считаются в одном ядре, без сохранения промежуточных тензоров. Экономия VRAM до 40%.
Всё это завёрнуто в модуль moe_ops, который можно импортировать как обычную PyTorch-библиотеку. Но главная фишка — прямая интеграция с DeepSpeed. Фреймворк использует deepspeed.moe как бэкенд для распределённого обучения, но подменяет стандартные ядра на свои. Это значит, что ZeRO-3, expert parallelism и pipeline parallelism работают без изменений, но быстрее.
Сравнение с альтернативами: почему не Megablocks и не Tutel?
Рынок MoE-фреймворков к 2026 году ожидаемо поделился на три лагеря:
- Megablocks — крутой, но требует H100 или A100 с поддержкой блоковых матричных операций. На T4 его ядра неэффективны.
- Tutel от Microsoft — хорошо документирован, но привязан к их собственному распределённому бэкенду. Интеграция с DeepSeed? Забудьте.
- FastMoE — легковесный, но без кастомных кернелов. Проигрывает в скорости на routing-heavy архитектурах.
Новый фреймворк занимает нишу «работает на T4 из коробки, дружит с DeepSeed». Его ядра написаны на CUDA C++ с плюшками вроде warp-level primitives для top-k. На A100, конечно, тоже быстрее, но главная аудитория — владельцы карточек среднего сегмента. В этом он перекликается с подходом Unsloth, который ускоряет MoE в 12 раз на Triton — только тут упор на CUDA и DeepSeed.
Ещё один важный момент: фреймворк поддерживает не только Mixture of Experts, но и Mixture of Depths (MoD) — архитектуру, где часть токенов пропускает слой целиком. Ядра для MoD тоже кастомные, и они позволяют обучать модели с 50% разреженностью без потери качества. Для тех, кто следил за эволюцией архитектур вроде DeepSeek, это манна небесная (читайте «MoE — архитектурный стандарт китайских моделей»).
Как это выглядит на практике: переезд за вечер
Допустим, у вас есть стандартная MoE-модель на Hugging Face Transformers, построенная через MixtralConfig с num_local_experts=8. Чтобы перевести её на новый фреймворк, нужно:
- Установить
pip install moe-framework(пакет на PyPI). - Заменить модуль
MixtralSparseMoeBlockнаmoe_kernels.FastMoEBlock. - В DeepSeed config прописать
"moe": {"kernel": "moe_framework"}.
Всё. Остальной код (forward, loss, optimizer) не трогаете. На T4 с 16GB я получил прирост 5.3x на batch size 4, sequence length 2048. При этом memory footprint уменьшился на 30% — теперь можно набивать больше данных.
Предупреждение: если вы используете старые версии PyTorch (<1.13), некоторые ядра могут не собраться. Фреймворк требует CUDA 11.8+ и PyTorch 2.0+. Лучше обновиться заранее — поведение backward может отличаться.
Теперь о грустном. Документация пока сыровата: есть README с примерами и Jupyter notebook, но todo-листы в коде пугают. Если вы не знакомы с CUDA-программированием, отладка кастомных кернелов при ошибках может стать квестом. Я потратил час, чтобы разобраться, почему не компилируется moe_backward на sm_75 (T4 — compute capability 7.5). Оказалось, нужно вручную передать флаг -arch=sm_75. Мелочь, но неприятная.
С другой стороны, если вы уже читали разбор победителей хакатона PyTorch по оптимизации GPU kernels, то поймёте логику авторов: они собрали best practices в один фреймворк. Это видно по структуре кода — ядра написаны с расчётом на производительность, а не на читаемость. Но для продакшена это идеально.
Кому фреймворк спасёт жизнь (а кому нет)
Идеальный сценарий: вы исследователь или инженер, у которого есть бюджет на аренду T4 или RTX 3090, нужно обучить MoE-модель с 8-64 экспертами, и вы готовы потратить полдня на установку. Фреймворк даст 3-7x ускорение и снизит порог входа — не придётся писать собственные кернелы.
Если же вы работаете в крупной компании с доступом к H100 и используете внутренние решения (например, от NVIDIA NeMo), то овчинка выделки не стоит. H100 и так быстро считает разреженные операции — прирост будет 10-20%, не больше. Но для стартапов и академических групп фреймворк — настоящий бриллиант. Особенно если вы уже сталкивались с узкими местами обучения MoE на T4 и знаете, как это больно.
Отдельно отмечу поддержку MoD — это редкая фича. Большинство фреймворков её игнорируют, а зря: комбинация MoE и MoD позволяет обучать модели с плотностью вычислений как у 3B, но с качеством 7B. В одном из моих экспериментов на датасете SlimPajama loss после 10k шагов был на 0.02 ниже, чем у плотного аналога. Невероятно, но факт.
Неочевидный совет: используйте вместе с ZeRO-Infinity
Фишка, которую мало кто заметил: фреймворк оптимизирован не только под T4, но и под offloading CPU. Если у вас мало VRAM (например, 8GB T4), включите DeepSpeed ZeRO-Infinity — он сбрасывает параметры экспертов на CPU. Кастомные ядра корректно работают с offloaded тензорами, и вы можете обучать модель с 16 экспертами и 7B параметров даже на такой крохе. Правда, скорость упадёт в 2-3 раза, но процесс не остановится.
Прогноз на ближайшие полгода: этот фреймворк может стать стандартом де-факто для MoE-обучения на Consumer GPU. Он уже обогнал Tutel по звёздам на GitHub (за месяц — 1.2k). Если авторы докрутят документацию и добавят поддержку Triton (как в Unsloth), то мы получим инструмент, который сделает разреженные модели доступными каждому.