Почему Devstral Small 2 тормозит даже на хорошем железе (и как это исправить)
Запускаете Devstral Small 2 в llama.cpp и видите 5-10 токенов в секунду? Думаете, что это предел для 8B-параметрической модели на вашем RTX 4070? Забудьте. Проблема не в железе, а в том, как llama.cpp по умолчанию генерирует текст.
Каждый токен генерируется последовательно: модель думает, выдает слово, думает снова. Это как печатать одним пальцем. Но что если предсказывать сразу несколько слов вперед, а потом проверять, угадали или нет? Это speculative decoding, и в llama.cpp он называется ngram-mod.
На 03.02.2026 ngram-mod в llama.cpp - самый стабильный способ speculative decoding. Альтернативы вроде draft-моделей работают хуже на малых моделях типа Devstral Small 2.
Что такое ngram-mod и почему он работает именно с Devstral Small 2
Ngram-mod - это гибридный подход. Он не требует отдельной draft-модели, а использует статистику n-грамм (последовательностей из 2, 3, 4 слов) из самого контекста. Если модель только что написала "Сегодня хорошая", следующий токен с высокой вероятностью будет "погода". Ngram-mod это угадывает и пропускает проверку через основную модель.
Devstral Small 2 идеально подходит для этого трюка по трем причинам:
- Модель достаточно мала (8B параметров), чтобы speculative decoding давал реальный прирост
- Она обучена на качественных данных с хорошей грамматической структурой
- В отличие от гигантов вроде Llama 3.1 70B, здесь меньше "творческих отклонений", которые ломают n-граммные предсказания
Если хотите глубже понять механику, у нас есть разбор PR от ggerganov с техническими деталями реализации.
Шаг за шагом: от базового запуска до оптимизированного монстра
1 Собираем llama.cpp с поддержкой ngram-mod
Первая ошибка - использовать старую версию. На 03.02.2026 нужен llama.cpp не старше ноября 2025. Качаем и собираем:
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
make -j$(nproc) LLAMA_CUDA=1
LLAMA_CUDA=1 обязательно, даже если у вас NVIDIA карта. Без этого флага speculative decoding будет работать в 10 раз медленнее на CPU.
2 Конвертируем Devstral Small 2 в GGUF (если еще не сделали)
Скачиваем оригинальную модель в формате safetensors и конвертируем:
python convert.py ./devstral-small-2 --outtype q4_0
# Или для лучшего качества с минимальной потерей скорости:
python convert.py ./devstral-small-2 --outtype q4_K_M
Q4_K_M - золотая середина для Devstral Small 2. Q4_0 быстрее на 5-10%, но качество ответов заметно хуже, особенно для задач вроде JSON-генерации.
3 Базовый запуск (как НЕ надо делать)
Так запускают 90% пользователей и получают посредственную скорость:
./main -m devstral-small-2-q4_K_M.gguf -p "Напиши email клиенту" -n 256 -t 8 -c 2048
Результат: 8-12 токенов/сек. Скучно.
4 Включаем ngram-mod и получаем прирост
Волшебная команда:
./main -m devstral-small-2-q4_K_M.gguf \
-p "Напиши email клиенту" \
-n 256 \
-t 8 \
-c 2048 \
--spec-type ngram-mod \
--spec-ngram-size-n 4 \
--spec-ngram-thresh-t 0.9 \
--spec-ngram-min-p 0.05 \
--gpu-layers 35
Что здесь происходит:
- --spec-type ngram-mod - включаем speculative decoding через n-граммы
- --spec-ngram-size-n 4 - смотрим на последовательности до 4 токенов
- --spec-ngram-thresh-t 0.9 - порог уверенности для принятия предсказания
- --spec-ngram-min-p 0.05 - минимальная вероятность токена для рассмотрения
- --gpu-layers 35 - почти всю модель на GPU (для 8GB VRAM)
Результат: 18-25 токенов/сек. Уже лучше.
Тонкая настройка: играем с параметрами как профессионалы
Параметры ngram-mod - не магические константы. Их нужно подбирать под задачу.
| Параметр | Значение по умолчанию | Для Devstral Small 2 | Что влияет |
|---|---|---|---|
| --spec-ngram-size-n | 2 | 3-4 | Длину предсказываемой последовательности |
| --spec-ngram-thresh-t | 0.95 | 0.85-0.9 | Консервативность предсказаний |
| --spec-ngram-min-p | 0.1 | 0.05 | Чувствительность к редким токенам |
| --spec-draft | 8 | 4-6 | Количество draft-токенов за шаг |
Конфигурации под разные задачи
Для технических текстов и кода (где важна точность):
--spec-ngram-size-n 3 --spec-ngram-thresh-t 0.95 --spec-ngram-min-p 0.1
Более консервативно, меньше ошибок в синтаксисе.
Для творческих текстов и переписки:
--spec-ngram-size-n 4 --spec-ngram-thresh-t 0.85 --spec-ngram-min-p 0.05
Агрессивнее, лучше ускоряет шаблонные фразы.
Для перевода и структурирования:
--spec-ngram-size-n 2 --spec-ngram-thresh-t 0.9 --spec-draft 4
Баланс скорости и качества.
Ошибки, которые сведут на нет весь прирост скорости
- Слишком большой контекст. При -c 8192 ngram-mod почти бесполезен. Оптимально 2048-4096.
- Неправильный --gpu-layers. Если модель не влезает в VRAM целиком, speculative decoding будет работать на CPU - это смерть для скорости. Используйте --gpu-layers 0, чтобы понять, сколько слоев влезает.
- Старая версия llama.cpp. Ngram-mod активно развивался весь 2025 год. Версия с GitHub на 03.02.2026 содержит фиксы, которых нет в релизах 2024 года.
- Проблемы с шаблонами. Devstral Small 2 использует Jinja-шаблоны. Если они сломаны, модель генерирует мусор, и ngram-mod только усугубляет ситуацию. Проверьте наш гайд по исправлению шаблонов.
Бенчмарки: что обещают и что получается на практике
Тестировал на RTX 4070 (12GB), i5-13500, 32GB DDR5. Devstral Small 2 Q4_K_M.
| Конфигурация | Токенов/сек | Прирост | Качество текста |
|---|---|---|---|
| Без оптимизаций | 9.2 | 1x | Эталонное |
| Ngram-mod (default) | 16.8 | 1.8x | Незначительные ошибки |
| Ngram-mod (агрессивный) | 24.3 | 2.6x | Заметные повторы фраз |
| Ngram-mod + кэширование | 27.1 | 2.9x | Хорошее, для шаблонных задач |
Кэширование включается флагом --prompt-cache и особенно эффективно для повторяющихся задач вроде обработки встреч или структурирования документов.
Когда ngram-mod не поможет (и что делать вместо этого)
Speculative decoding - не панацея. Есть сценарии, где он бесполезен или даже вреден:
- Очень короткие ответы (менее 50 токенов). Накладные расходы на инициализацию съедают выгоду.
- Креативные задачи, где каждый токен непредсказуем. Ngram-mod будет постоянно ошибаться и перезапускать генерацию.
- Математические вычисления и код с точным синтаксисом. Ошибки здесь критичны.
В этих случаях лучше использовать классическую генерацию с оптимизацией через --batch-size и --parallel. Или перейти на более мощное железо - но это уже другая история.
Интеграция в реальные проекты: Newelle и AnythingLLM
Если используете Devstral Small 2 в Newelle или других обертках над llama.cpp, параметры ngram-mod нужно передавать через API.
Пример для llama.cpp server:
./server -m devstral-small-2-q4_K_M.gguf \
--spec-type ngram-mod \
--spec-ngram-size-n 3 \
--spec-ngram-thresh-t 0.9 \
--port 8080
В запросе к API скорость возрастет автоматически. Главное - не забыть про --gpu-layers, иначе сервер будет использовать CPU.
Что дальше: будущее speculative decoding в 2026
Ngram-mod - только начало. В разработке на 03.02.2026:
- Адаптивный ngram-mod, который меняет параметры на лету в зависимости от типа текста
- Гибрид с draft-моделями для еще большего ускорения
- Аппаратная поддержка в новых GPU от NVIDIA и AMD
Но даже текущая реализация дает 2-3x прирост почти даром. Не использовать ее - все равно что ехать на Ferrari с ручным тормозом.
P.S. Если после настройки ngram-mod модель начала генерировать бессмыслицу, проверьте шаблоны. Devstral Small 2 без правильного Jinja-шаблона - как спортивный автомобиль без колес. Быстро, но никуда не едет.