Когда видеокарта — это роскошь, а модель нужна сейчас
Вы скачали Minimax 2.1, посмотрели на требования в 70+ ГБ VRAM, и поняли, что ваш RTX 4090 — это просто дорогая игрушка. GPU нет, а модель запустить надо. Знакомая ситуация? Я провел неделю, тестируя эту 67-миллиардную махину на чистом процессоре, и вот что выяснил.
CPU-инференс — не компромисс, а отдельная дисциплина. Здесь свои правила, свои подводные камни и своя математика. Если на GPU вы выбираете между скоростью и качеством, то на CPU выбор стоит между «вообще запустится» и «не запустится». Особенно когда речь о модели размером с небольшой город.
Важно: Запуск Minimax 2.1 на CPU — это не про скорость. Это про доступность. Если вам нужно 100 токенов в секунду, идите покупать 8xH100. Если нужно просто работать — читайте дальше.
Почему квантование на CPU критичнее, чем на GPU
На GPU вы теряете точность, но получаете скорость. На CPU вы теряете точность, чтобы модель вообще поместилась в оперативку. Разница принципиальная.
Minimax 2.1 в FP16 весит около 70 ГБ. Даже если у вас 128 ГБ RAM (а у большинства — 64 или 32), после вычета системы, браузера и двадцати вкладок Chrome остается около 50-60 ГБ. Модель не влезет.
1 Математика памяти: что влезет, а что нет
Давайте посчитаем честно. У вас 64 ГБ DDR5. Система съедает 4 ГБ. Фоновые процессы — еще 2. Остается 58 ГБ. Модель в q8_0 занимает 40 ГБ. Кажется, влезет? Нет, потому что llama.cpp требует дополнительной памяти для кэша контекста. На 8K контекста это еще 4-5 ГБ. Итого — 45 ГБ. Вроде ок? Забыли про то, что память фрагментирована. На практике нужно минимум 10% запаса.
| Квант | Размер модели | Минимум RAM | Комфортно |
|---|---|---|---|
| q8_0 | ~40 ГБ | 48 ГБ | 64 ГБ+ |
| q6_k | ~32 ГБ | 40 ГБ | 48 ГБ+ |
| q5_k_m | ~28 ГБ | 36 ГБ | 42 ГБ+ |
| q4_k_m | ~22 ГБ | 30 ГБ | 36 ГБ+ |
Видите проблему? q8_0 требует 64 ГБ RAM для комфортной работы. У большинства пользователей именно столько. Но «комфортно» — это когда можно параллельно открыть браузер. Если вы готовы закрыть все и медитировать над черным экраном терминала — хватит и 48 ГБ.
Тестовая стенка: железо против математики
Я собрал три конфигурации, которые есть у реальных пользователей:
- Конфигурация A: i7-13700K, 64 ГБ DDR5-6000, Windows 11
- Конфигурация B: Ryzen 7 7800X3D, 32 ГБ DDR5-5600, Ubuntu 22.04
- Конфигурация C: Старый добрый i9-10900K, 128 ГБ DDR4-3200, Windows 10
Почему именно такие? Первая — топовый игровой ПК, который сейчас у половины стримеров. Вторая — популярная сборка для разработки. Третья — рабочая станция, которая тянет со времен пандемии.
2 Методика тестирования: как мерить то, что еле ползет
Я ненавижу синтетические бенчмарки. Они показывают цифры, которые не имеют отношения к реальности. Поэтому тестировал так:
- Запускал модель через llama.cpp с флагом
-ngl 0(никаких слоев на GPU) - Давал задачу на генерацию кода на Python (50-100 токенов)
- Замерял время генерации и потребление памяти
- Повторял 5 раз, отбрасывал выбросы
- Параллельно следил за загрузкой CPU и пропускной способностью RAM
Внимание: Флаг -ngl 0 критически важен. Без него llama.cpp попытается загрузить часть модели в VRAM, даже если вы этого не хотите. Если видеокарты нет — получите ошибку. Если есть — модель частично уйдет туда, и тест будет нечистым.
Цифры, от которых хочется плакать (или радоваться)
| Квант | Конфигурация A (DDR5-6000) |
Конфигурация B (DDR5-5600) |
Конфигурация C (DDR4-3200) |
Качество кода* |
|---|---|---|---|---|
| q8_0 | 1.8-2.1 t/s | 1.5-1.8 t/s | 0.9-1.2 t/s | 98% |
| q6_k | 2.4-2.8 t/s | 2.0-2.3 t/s | 1.2-1.5 t/s | 90-92%** |
| q5_k_m | 3.2-3.8 t/s | 2.7-3.2 t/s | 1.6-2.0 t/s | 95-97% |
| q4_k_m | 4.5-5.2 t/s | 3.8-4.3 t/s | 2.2-2.8 t/s | 85-88% |
*Качество оценивал по решению 20 задач из HumanEval, сравнивая с эталоном FP16.
**Q6_K показал нестабильность — об этом я писал в статье «MiniMax M2.1 и Q6_K: как квантование ломает логику модели».
Видите эти цифры? 1.8 токена в секунду на топовом DDR5. Это примерно 108 токенов в минуту. Один абзац текста. За минуту.
DDR5 против DDR4: стоит ли апгрейд?
Разница между DDR5-6000 и DDR4-3200 — примерно 2x в скорости. Но это в синтетике. В реальности, с Minimax 2.1, разница 1.8x. Почему?
Потому что llama.cpp упирается не только в пропускную способность, но и в латентность. И в способность процессора параллельно грузить данные и считать матричные умножения. DDR5 быстрее, но не настолько, чтобы ради одной модели менять всю систему.
Q6_K: почему он странный на CPU тоже
В моей предыдущей статье про кванты для кодинга я уже писал про проблемы Q6_K на GPU. На CPU они проявляются иначе.
Модель не «ломается» в классическом понимании. Она начинает делать странные вещи при определенных условиях. Например, генерирует код с правильным синтаксисом, но с математической ошибкой в вычислениях. Или теряет контекст в середине длинного ответа.
На CPU это заметнее, потому что скорость и так низкая. Ждешь 30 секунд ответа, получаешь ерунду. Обидно.
3 Мой выбор: q5_k_m для работы, q4_k_m для экспериментов
После недели тестов я остановился на двух вариантах:
Для реальной работы: q5_k_m. 28 ГБ против 40 у q8_0. Скорость в 1.8 раза выше. Качество падает на 3-5%, но для большинства задач это незаметно. Главное — помещается в 32 ГБ RAM с небольшим запасом.
Для экспериментов и прототипов: q4_k_m. 22 ГБ — запустится даже на 32 ГБ системы. Скорость еще выше. Качество хуже, но для мозгового штурма, черновиков, генерации идей — достаточно.
Q8_0 оставьте для эстетов с 128 ГБ RAM. Q6_K — для мазохистов, которые любят непредсказуемость.
Оптимизации, которые реально работают
Запустить модель — полдела. Заставить ее работать быстрее — искусство.
# Базовый запуск (медленно, но стабильно)
./main -m minimax-2.1.Q5_K_M.gguf -ngl 0 -t 16 --mlock
# С включенным AVX2 (если процессор поддерживает)
./main -m minimax-2.1.Q5_K_M.gguf -ngl 0 -t 16 --mlock -c 4096 --threads 16 --batch-size 512
# Максимальная оптимизация для многоядерных систем
./main -m minimax-2.1.Q5_K_M.gguf -ngl 0 -t 24 --mlock -c 8192 --threads 24 --batch-size 1024 --keep 30
Ключевые флаги:
-t— количество потоков. Ставьте количество физических ядер, не логических. Hyper-Threading иногда мешает.--mlock— фиксирует модель в RAM, предотвращает своппинг на диск (критично для скорости).--batch-size— размер батча. Больше = быстрее, но требует больше RAM. Начинайте с 512.-c— размер контекста. 4096 хватит для большинства задач. Больше — больше RAM.
Ошибки, которые совершают все (и вы тоже)
Ошибка №1: Запускать с флагом -ngl 1 «на всякий случай». Если видекарты нет — получите ошибку. Если есть — модель уйдет туда, и теряется смысл CPU-тестирования.
Ошибка №2: Не использовать --mlock. Без этого флага операционная система может выгружать части модели в своп на диск. Скорость упадет в 10-100 раз.
Ошибка №3: Думать, что больше потоков = быстрее. После определенного предела (обычно 1.5x от физических ядер) производительность падает из-за накладных расходов.
Что в итоге?
Запускать Minimax 2.1 на CPU можно. Но нужно понимать, зачем. Это не для продакшена, где нужна скорость. Это для исследований, экспериментов, ситуаций, когда GPU нет, а модель нужна.
Мой совет: если у вас 64 ГБ RAM — берите q5_k_m. Если 32 ГБ — q4_k_m. Если 128 ГБ — можете попробовать q8_0, но готовьтесь к скорости 2 токена в секунду.
И помните: DDR5 дает прирост, но не радикальный. Основной лимит — не пропускная способность памяти, а вычислительная мощность CPU. Пока у нас не появятся процессоры с тысячами AI-ядер, как у GPU, быстрым CPU-инференс не станет.
P.S. Если интересно, как эта же модель ведет себя на GPU с разными квантами — посмотрите мой разбор про квантование для программирования. Там цифры повеселее.