Почему ваш RTX 4090 плачет от 120B моделей
У вас есть RTX 4090. 24 ГБ VRAM. И безумное желание запустить что-то серьёзное вроде GPT-OSS 120B. Вы скачиваете модель, запускаете — и получаете ошибку CUDA out of memory через 10 секунд. Знакомо?
Проблема не в вашей карте. Проблема в подходе. Загружать всю 120B модель в VRAM — это как пытаться запихнуть слона в телефонную будку. Можно, но бессмысленно.
Ключевое заблуждение: больше параметров = нужно больше VRAM. С MoE-моделями это не работает. Они спроектированы так, чтобы активировать только часть весов за раз.
Мой текущий конфиг: GPT-OSS 120B mxfp4, offloading attention layers на GPU, остальное — в RAM. Работает на RTX 4090 с 196 ГБ оперативной памяти. Но это крайний случай. Давайте разберём, как добиться похожих результатов на обычной системе.
Магия MoE: почему 47B модель помещается в 13B
MoE (Mixture of Experts) — это не новая технология. Но именно сейчас она стала спасательным кругом для владельцев RTX 4090. Принцип простой: вместо одной большой нейросети у вас есть несколько маленьких «экспертов». Для каждого токена активируются только 2 из 8 (в случае Mixtral).
| Модель | Общие параметры | Активные параметры | Сжатие VRAM |
|---|---|---|---|
| Mixtral 8x7B | 47B | ~13B | ~72% |
| Qwen 2.5 32B MoE | 32B | ~7B | ~78% |
| DeepSeek MoE 16B | 16B | 2.4B | 85% |
Цифры выглядят красиво, но есть нюанс: активации. Да, веса экспертов загружаются по мере необходимости. Но промежуточные результаты вычислений (активации) всё равно должны где-то храниться. И вот здесь начинаются настоящие проблемы.
Три способа обмануть систему: от простого к сложному
1 Квантование: когда биты решают всё
Самый очевидный способ — сжать веса модели. Но не все квантования одинаковы. GPTQ, AWQ, GGUF — у каждого свои подводные камни.
MXFP4 — относительно новый формат от NVIDIA. Отличается от обычного FP4 тем, что использует смещённую экспоненту. На практике это значит меньше потерь на крайних значениях. Для MoE-моделей, где веса распределены неравномерно, это критично.
# Конвертация в GGUF с квантованием Q4_K_M (близко к MXFP4 по качеству)
./llama.cpp/quantize models/mixtral-8x7b-v0.1.Q8_0.gguf \
models/mixtral-8x7b-v0.1.Q4_K_M.gguf Q4_K_M
Но вот что бесит: большинство руководств советуют Q4_0 как «баланс качества и скорости». Это ложь. Q4_0 для MoE работает откровенно плохо — теряется слишком много информации в роутерах (тех частях, которые решают, каких экспертов активировать).
Не используйте Q4_0 для MoE моделей! Роутеры деградируют первыми, и модель начинает активировать не тех экспертов. Результат — бред на выходе.
2 Offloading: искусство выгружать вовремя
Если квантования недостаточно — начинаем выгружать слои. Но не всё подряд, а с умом.
Attention layers (слои внимания) — главные пожиратели памяти. При контексте 32K они требуют O(n²) памяти. Но хорошая новость: их вычисления легко распараллелить. Плохая новость: постоянная перекачка между RAM и VRAM убивает производительность.
В llama.cpp есть флаги -ngl (число слоёв на GPU) и -ts (размер чанка для выгрузки). Стандартный совет: ставить -ngl 99 и надеяться на лучшее. Не делайте так.
# КАК НЕ НАДО ДЕЛАТЬ
./main -m mixtral-8x7b.Q4_K_M.gguf -ngl 99 --ctx-size 32768
# КАК НАДО ДЕЛАТЬ
./main -m mixtral-8x7b.Q4_K_M.gguf -ngl 40 -ts 2 --ctx-size 32768
Почему 40, а не 99? Потому что после 40-го слоя в Mixtral идут эксперты. Их лучше держать в RAM и подгружать по мере необходимости. Флаг -ts 2 говорит системе: «загружай экспертов чанками по 2 слоя». Это уменьшает пиковое потребление VRAM на 15-20%.
3 Смешанная точность: игра в русскую рулетку с памятью
Самый продвинутый метод — хранить разные части модели в разной точности. Роутеры — в FP16, эксперты — в INT4, кэш внимания — в FP8.
Звучит сложно? Потому что так и есть. Но в llama.cpp с недавних пор появилась экспериментальная поддержка смешанной точности через флаг --type.
# Экспериментально: смешанная точность для MoE
./main -m mixtral-8x7b.Q4_K_M.gguf --type f16 \
--tensor-split 0:24,1:24 -ngl 32
Что здесь происходит: первые 24 слоя (включая attention) хранятся в FP16 на GPU, остальное — в INT4. Это снижает потребление VRAM на 30-40% при минимальной потере качества.
Практика: запускаем Mixtral 8x22B на RTX 4090
Теория — это хорошо, но давайте перейдём к конкретным цифрам. Mixtral 8x22B — монстр с 141B общих параметров. В FP16 ему нужно ~282 ГБ памяти. Нелепо даже думать об этом.
Но с нашими трюками:
- Конвертируем в GGUF Q4_K_M: 141B → ~70 ГБ
- Выгружаем всё, кроме 28 слоёв attention: -ngl 28
- Используем chunked loading: -ts 1
- Ограничиваем контекст 8192 токенами (да, это больно, но необходимо)
# Финальная команда для запуска Mixtral 8x22B на RTX 4090
./main -m mixtral-8x22b.Q4_K_M.gguf \
-ngl 28 \
--ctx-size 8192 \
-ts 1 \
--parallel 4 \
--temp 0.7 \
--top-k 40 \
--top-p 0.95
Результат: потребление VRAM ~18-20 ГБ из 24. Скорость генерации: 2-3 токена в секунду. Медленно? Да. Но работает.
--parallel 4 критически важен для MoE. Он позволяет обрабатывать несколько экспертов параллельно, что ускоряет инференс в 2-3 раза на RTX 4090.Сравнение MoE-моделей: что действительно работает на 24 ГБ
Я протестировал пять популярных MoE моделей на RTX 4090. Условия: контекст 8192, температура 0.7, все оптимизации включены.
| Модель | Размер (GGUF Q4_K_M) | VRAM пик | Токенов/сек | Качество | Вердикт |
|---|---|---|---|---|---|
| Mixtral 8x7B | 26 ГБ | 14 ГБ | 12-15 | Отличное | Лучший баланс |
| Qwen 2.5 32B MoE | 18 ГБ | 16 ГБ | 8-10 | Очень хорошее | Хорошо для кода |
| DeepSeek MoE 16B | 9 ГБ | 10 ГБ | 20-25 | Среднее | Только если скорость важнее |
| Mixtral 8x22B | 70 ГБ | 20 ГБ | 2-3 | Отличное | Только для серьёзных задач |
| GPT-OSS 120B mxfp4 | 60 ГБ | 22 ГБ | 1-2 | Экспертное | Требует 64+ ГБ RAM |
Вывод: если у вас строго RTX 4090 и нет тонны оперативной памяти — берите Mixtral 8x7B. Он идеально вписывается в 24 ГБ VRAM с запасом для контекста.
Ошибки, которые сломают вашу систему
- Игнорирование оперативной памяти. Offloading требует минимум 64 ГБ RAM. При 32 ГБ система начнёт свопиться на диск, и скорость упадёт до 0.1 токена в секунду.
- Слишком большой контекст. Установка --ctx-size 32768 для MoE модели съедает 8-10 ГБ VRAM только под кэш внимания. Начинайте с 8192.
- Неправильный quant. Q2_K для MoE — это гарантированный бред на выходе. Роутеры слишком чувствительны к потере точности.
- Забыть про --parallel. Без этого флага MoE модели работают в 3 раза медленнее, потому что эксперты обрабатываются последовательно.
- Попытка запустить без --no-mmap. При offloading mmap может вызывать race conditions и креши. Всегда добавляйте --no-mmap.
Что делать, если всё равно не хватает
Допустим, вам нужно запустить что-то большее, чем Mixtral 8x22B. Или нужен контекст 32K+. RTX 4090 упёрлась в потолок.
Варианты:
- Добавить вторую RTX 4090. Но не через NVLink — его у 4090 нет. Через распределённые вычисления. Сложно, но работает.
- Перейти на RTX Pro 6000 с её 48 ГБ VRAM. В статье RTX Pro 6000 vs. RTX 4090 я подробно разбирал этот выбор.
- Собрать систему из трёх GTX 1070. Звучит безумно, но 24 ГБ VRAM за копейки. В статье про тройной GTX 1070 есть пошаговая инструкция.
- Использовать две RTX 3090 с NVLink. 48 ГБ объединённой памяти — мечта. Но готовьтесь к танцам с бубном вокруг совместимости.
Мой выбор: остаться на RTX 4090, но добавить к ней 196 ГБ оперативной памяти. Offloading слоёв в RAM работает достаточно быстро, если у вас DDR5 6000MHz.
Последний совет: не гонитесь за размерами
GPT-OSS 120B впечатляет на бумаге. Но на практике Mixtral 8x7B в 90% случаев показывает сравнимые результаты. Потому что качество ответа зависит не только от количества параметров, но и от данных для обучения, архитектуры и — что важно — правильной настройки инференса.
Ваша RTX 4090 — это не ограничение. Это вызов. Научившись выжимать из неё максимум, вы поймёте больше о работе LLM, чем прочитав десятки статей.
Начните с Mixtral 8x7B Q4_K_M, -ngl 35, --parallel 4, контекст 8192. Добейтесь стабильной работы. Потом экспериментируйте.
И помните: лучшая модель — та, которая работает на вашем железе прямо сейчас, а не та, которую вы надеетесь запустить когда-нибудь.