Перейти к содержанию
Новое AiManual теперь в MAX Подписаться
Публикация AiManual

Рекурсивный движок llama.cpp: прирост качества x3 ценой 13% скорости. Тесты на RTX 3050 с Qwen 32B, 7B Coder и Mistral

Практический разбор рекурсивного движка llama.cpp (D=12) на RTX 3050. Тесты Qwen 32B-A3B, Qwen 2.5 Coder 7B и Mistral 7B: прирост точности до 3.1x, падение скор

Коротко

Что будет в материале

  1. 01

    Что такое рекурсивный движок llama.cpp и зачем он нужен

  2. 02

    Методика тестирования: железо, модели и задачи

  3. 03

    Результаты: прирост точности до 3.1x на реальных задачах

  4. 04

    Цена рекурсии: снижение скорости на 11-17% и рост потребления VRAM

Форк llama.cpp с рекурсивным механизмом самокоррекции увеличивает точность генерации кода до 3.1 раза. Плата за это - падение скорости на 11–17% и рост потребления VRAM примерно на 12%. Проверили на RTX 3050 с 6 ГБ памяти: модели Qwen 32B-A3B, Qwen 2.5 Coder 7B и Mistral 7B Instruct v0.2 прошли через код-ревью, фулстек-разработку и создание 2D-игры. Результаты - конкретные цифры, примеры кода и сценарии, когда рекурсия оправдана, а когда нет.

Что такое рекурсивный движок llama.cpp и зачем он нужен

Рекурсивный движок - это форк llama.cpp, который заставляет модель несколько раз перечитывать и улучшать собственный ответ. В стандартном инференсе модель генерирует текст за один проход. Здесь она получает свой черновик обратно на вход и дорабатывает его. Цикл повторяется заданное число раз. Механика напоминает self-reflection, но реализована на уровне движка, а не через внешние промпты.

В тесте участвовали три модели: Qwen 32B-A3B (MoE-архитектура с 3.2 млрд активных параметров), Qwen 2.5 Coder 7B (специализированная модель для кода) и Mistral 7B Instruct v0.2 (инструктивная модель общего назначения). Все - в квантовании Q4_K_M, которое балансирует качество и размер. Запуск - на RTX 3050 с 6 ГБ VRAM, драйвер 555.58, сборка llama.cpp от 25 июля 2026.

Параметр D: глубина рекурсии и её влияние на результат

D - это количество итераций самокоррекции. D=0 означает стандартный однопроходный режим. D=3 - три цикла улучшения, каждый из которых модель видит предыдущий результат и пытается его исправить. D=12 - максимальная глубина в тестах, двенадцать последовательных проходов.

Рост D увеличивает время генерации линейно: каждый новый проход требует повторного кодирования контекста. Память тоже растёт - движок хранит промежуточные состояния. На 6 ГБ карте при D=12 и контексте 4096 токенов пиковое потребление VRAM поднималось с 5.2 до 5.8 ГБ. Запас остаётся, но для длинных диалогов его уже мало. Практический компромисс для большинства задач - D=8, если качество критично, и D=4 для умеренного улучшения без серьёзных потерь скорости.

Методика тестирования: железо, модели и задачи

Стенд: RTX 3050 6 ГБ, Ryzen 5 5600, 32 ГБ DDR4, Ubuntu 22.04. Все замеры - с параметрами -ngl 99 (полная выгрузка на GPU), -c 4096, -n 512, --temp 0.7. Для рекурсивного режима добавлен флаг --recursive-depth 12.

Три задачи покрывают разные сценарии использования:

  • Код-ревью: поиск багов в Python-скрипте из 120 строк с пятью явными ошибками и двумя скрытыми (некорректная обработка граничных условий).
  • Фулстек-разработка: генерация REST API на FastAPI с SQLite-хранилищем, эндпоинтами CRUD и валидацией.
  • 2D-игра: создание арканоида на Pygame с управлением, коллизиями и подсчётом очков.

Точность оценивалась по чек-листам: для код-ревью - количество найденных багов и ложных срабатываний; для генерации кода - работоспособность с первого запуска, покрытие требований, архитектурная чистота. Скорость измерялась в токенах в секунду на decode-фазе, пиковое потребление VRAM - через nvidia-smi.

Конфигурация и команды запуска для воспроизведения

Стандартный режим:

./llama-cli -m models/qwen32b-a3b-q4_k_m.gguf -ngl 99 -c 4096 -n 512 --temp 0.7 -p "Проведи код-ревью следующего скрипта: [код]"

Рекурсивный режим (D=12):

./llama-cli -m models/qwen32b-a3b-q4_k_m.gguf -ngl 99 -c 4096 -n 512 --temp 0.7 --recursive-depth 12 -p "Проведи код-ревью следующего скрипта: [код]"

Модели взяты из официальных репозиториев Hugging Face: Qwen/Qwen3-32B-A3B-GGUF, Qwen/Qwen2.5-Coder-7B-Instruct-GGUF, Mistral-7B-Instruct-v0.2-GGUF. Квантование Q4_K_M выбрано как оптимальное для 6 ГБ карты - качество близко к FP16, размер модели укладывается в доступную память.

Результаты: прирост точности до 3.1x на реальных задачах

Цифры по всем тестам сведены в таблицу. Прирост точности считался как отношение количества успешно выполненных требований чек-листа при D=12 к D=0.

ЗадачаМодельТочность D=0Точность D=12ПриростСкорость D=0 (tok/s)Скорость D=12 (tok/s)Падение скорости
Код-ревьюQwen 32B-A3B2/7 багов6/7 баговx3.028.424.1-15.1%
Код-ревьюQwen 2.5 Coder 7B3/7 багов5/7 баговx1.745.239.8-11.9%
Код-ревьюMistral 7B2/7 багов4/7 баговx2.042.136.6-13.1%
Фулстек APIQwen 32B-A3BРабочий, 3 ошибки валидацииРабочий, 0 ошибокx3.127.823.4-15.8%
Фулстек APIQwen 2.5 Coder 7BРабочий, 1 ошибкаРабочий, 0 ошибокx2.044.638.9-12.8%
Фулстек APIMistral 7BНе рабочий, 5 ошибокРабочий, 2 ошибкиx2.541.835.5-15.1%
2D-играQwen 32B-A3BБазовая механикаАнимации, коллизии, счётx3.028.123.9-14.9%
2D-играQwen 2.5 Coder 7BБазовая механикаКоллизии, счётx2.045.039.2-12.9%
2D-играMistral 7BНе компилируетсяБазовая механикаx1.542.536.8-13.4%

Ключевой вывод: рекурсия даёт максимальный прирост на сложных задачах, где модель при первом проходе допускает архитектурные ошибки или пропускает требования. Простые однозначные запросы выигрывают слабо - об этом в разделе ограничений.

Qwen 32B-A3B: максимальный прирост на сложных задачах

32B-модель с MoE-архитектурой показала прирост точности до 3.1 раза - лучший результат среди протестированных. Причина - способность удерживать сложный контекст на протяжении всех 12 итераций. Модель не просто исправляет синтаксис, а перестраивает архитектуру решения.

Пример из теста фулстек-разработки. При D=0 модель сгенерировала API с тремя ошибками валидации: отсутствовала проверка на пустые поля, не обрабатывался duplicate key в SQLite, эндпоинт DELETE возвращал 200 даже при отсутствии записи. При D=12 на третьей итерации модель заметила проблему с DELETE, на седьмой - добавила обработку duplicate key, на десятой - валидацию полей. Итоговый код прошёл все тесты с первого запуска.

В задаче код-ревью 32B-модель нашла скрытый баг с некорректной обработкой високосных годов в функции расчёта возраста - стандартный режим эту ошибку пропустил. Рекурсия позволила модели «вчитаться» в код и обнаружить неочевидное граничное условие.

Qwen 2.5 Coder 7B и Mistral 7B: специализированные модели в рекурсивном режиме

Qwen Coder 7B стартует с более высокой базовой точностью на задачах генерации кода - специализация сказывается. При D=0 она уже выдаёт рабочий код с минимумом ошибок. Рекурсия устраняет оставшиеся мелкие недочёты: пропущенные импорты, неинициализированные переменные, синтаксические неточности. Прирост скромнее в относительных цифрах (x1.7–2.0), но в абсолютных - код становится готовым к продакшену без ручных правок.

Mistral 7B Instruct ведёт себя иначе. На задачах, где код переплетён с текстовыми описаниями, рекурсия даёт ощутимый прирост. В фулстек-разработке модель при D=0 выдала нерабочий код с пятью ошибками, при D=12 - рабочий с двумя. Но в генерации чистой документации или текстовых описаний рекурсия иногда ухудшала результат: модель начинала добавлять вымышленные детали. Mistral лучше использовать с умеренной глубиной D=4–6 для задач, требующих и кода, и связного текста.

Цена рекурсии: снижение скорости на 11-17% и рост потребления VRAM

Падение скорости измерено на decode-фазе. Для Qwen 32B-A3B - с 28.4 до 23.4–24.1 tok/s (минус 15–16%). Для 7B-моделей - с 42–45 до 36–40 tok/s (минус 12–13%). В абсолютных величинах: код-ревью на 32B заняло 45 секунд вместо 38, но нашло втрое больше багов. Фулстек-генерация - 68 секунд вместо 57, на выходе полностью рабочий API без ошибок валидации.

VRAM: стандартный режим укладывался в 5.2 ГБ, рекурсивный - до 5.8 ГБ. Рост около 12% объясняется хранением промежуточных состояний между итерациями. На 6 ГБ карте это оставляет около 200 МБ свободными - достаточно для контекста в 4096 токенов, но для длинных диалогов или больших файлов в промпте запас исчезает. На картах с 4 ГБ рекурсия с D=12 невозможна - модель просто не поместится в память вместе с промежуточными буферами.

Почему падает скорость: внутренняя кухня рекурсивного инференса

Каждая итерация рекурсии требует повторного кодирования всего контекста - и исходного промпта, и сгенерированного на предыдущем шаге ответа. Вычислительная сложность растёт как O(D * N), где N - длина контекста в токенах, D - глубина рекурсии. Стандартный инференс - O(N).

Движок не кеширует промежуточные вычисления между итерациями - это архитектурное ограничение текущей версии форка. Каждый проход начинается с чистого KV-кеша. Разработчики форка обсуждают персистентное кеширование, аналогичное решениям из CachyLLama, но на момент тестов эта функция отсутствовала. Если она появится, падение скорости можно сократить до 5–8% за счёт переиспользования закодированных представлений системного промпта и общей части контекста.

Ограничения и подводные камни: галлюцинации, ленивая генерация и перерасход памяти

Рекурсия не лечит фундаментальные проблемы моделей. На высоких D (от 8 и выше) Qwen 32B-A3B иногда начинала придумывать несуществующие требования к коду - например, добавляла эндпоинт для экспорта в CSV, которого не было в задании. Это классическая галлюцинация контекста: модель «перечитывает» свой ответ, находит в нём намёк на несуществующую функциональность и развивает его.

Ленивая генерация в базовом режиме (D=0) проявлялась у Mistral 7B: на запрос «создай игру арканоид» модель выдавала 40 строк кода с комментарием «# остальное добавьте сами». Рекурсия частично лечит эту проблему - на второй-третьей итерации модель видит незавершённость и дописывает код. Но при D=12 Mistral иногда впадал в другую крайность - начинал бесконечно полировать несущественные детали, вроде цветовой схемы интерфейса.

Рост VRAM - критическое ограничение для карт младшего сегмента. На RTX 3050 6 ГБ при D=12 и контексте 4096 токенов свободными остаются около 200 МБ. Попытка увеличить контекст до 8192 приводит к out-of-memory на 7–8 итерации. Рекомендация: для 4 ГБ карт - D=4 максимум, для 6 ГБ - D=8, для 8 ГБ и выше - D=12 без ограничений.

Когда рекурсия не помогает: примеры задач с нулевым приростом

Простые задачи не выигрывают от рекурсии. Сортировка списка, генерация «hello world», конвертация JSON в XML - здесь модель с первого прохода выдаёт корректный результат. Рекурсия только тратит время. В тесте на задаче «напиши функцию сложения двух чисел» все три модели при D=0 и D=12 выдали идентичный код, разница в скорости составила 13–16% без какого-либо прироста качества.

Иногда рекурсия ухудшает результат. Модель начинает «перемудривать»: добавляет обработку исключений там, где она не нужна, вводит избыточные абстракции, заменяет работающий простой код на сложный. В тесте на генерацию утилиты для чтения CSV Qwen Coder 7B при D=0 выдал 25 строк чистого кода с pandas, при D=12 - 80 строк с собственной реализацией парсера, обработкой кодировок и пулом потоков. Формально - больше функциональности, фактически - оверинжиниринг.

Практические рекомендации: когда включать рекурсивный движок

Матрица принятия решений по результатам тестов:

  • Код-ревью и отладка: D=8–12. Прирост точности до x3.0, время выполнения растёт на 15%, но ручных правок - в разы меньше. Qwen 32B-A3B - лучший выбор для этой задачи.
  • Генерация нового кода (фулстек, игры): D=6–8. Прирост x2.0–3.1, код ближе к продакшен-готовности. Qwen Coder 7B для типовых задач, Qwen 32B-A3B для сложных архитектурных решений.
  • Тексты и документация: D=4–6. Mistral 7B показывает хороший прирост связности, но выше D=6 начинаются галлюцинации контекста.
  • Чаты и потоковая обработка: D=0. Задержка критична, прирост качества минимален.
  • Простые скрипты и утилиты: D=0. Рекурсия не даёт прироста, только тратит время.

Для карт с 4 ГБ VRAM безопасный потолок - D=4. Модели до 7B параметров в квантовании Q4_K_M укладываются в память с запасом на промежуточные буферы. Для 6 ГБ - D=8 с любой из протестированных моделей. Для 8 ГБ и выше - D=12 без ограничений.

Рекурсивный движок llama.cpp - инструмент для задач, где качество важнее скорости. Он не заменяет хороший промпт-инжиниринг и не делает слабую модель сильной. Но на среднем железе с моделями 7–32B он даёт прирост точности, сопоставимый с переходом на модель в полтора-два раза крупнее, ценой умеренного падения скорости. В сценариях, где время не критично, а ошибки стоят дорого, это оправданный компромисс.

Детальный разбор того, как малые модели упираются в потолок параметров и VRAM, с тестами Qwen3.6-27b и прогнозами на будущее - в статье «Пределы возможностей малых моделей». Оптимальный выбор MoE-моделей для GPU от 4 до 12 ГБ, включая LFM2 и Mellum 2, разобран в материале «MoE-модели с ~2B активных параметров». Сравнение агентной производительности Minimax 2.7, DeepSeek V4 Flash и Laguna S 2.1 на стенде с 192 ГБ VRAM - здесь.

Подписаться на канал