Ручная настройка llama.cpp - это тот самый ад, в который попадают все, кто хочет выжать максимум из своей видеокарты или процессора. Ты скачиваешь свежую GGUF-модель, например, ту же Llama 3.2 90B или Gemma3 27B, запускаешь с дефолтными флагами и... получаешь 2 токена в секунду. Начинаешь гуглить. Натыкаешься на форумы, где советуют -t 12 -c 4096 --mlock --no-mmap. Пробуешь. Лучше не становится. Тратишь целый день, перебирая комбинации -ngl, -b, -c. Результат? Угадай.
Проблема не в том, что параметров много. Проблема в том, что их влияние нелинейно и зависит от конкретной связки: модель + железо + задача. То, что работает для Qwen3.5-32B на RTX 4090, убьет производительность той же модели на Mac M3 Max.
Решение: делегируем поиск оптимума машине
Вместо того чтобы вручную играть в угадайку, мы создадим автономного AI-агента. Его задача - методом системного поиска (не полного перебора, это важно) находить конфигурацию, которая дает максимальные tokens/s для вашего конкретного пайплайна, будь то RAG-агент или простая инференс-задача.
Как это работает? Агент - это просто другой LLM (можно и ту же локальную модель через API) с промптом-инструкцией. Он анализирует результаты предыдущих запусков и генерирует новую команду для llama.cpp, пытаясь улучшить метрики. Мы автоматизируем цикл: предложение параметров -> выполнение бенчмарка -> сбор метрик -> анализ -> новое предложение.
1 Готовим полигон: llama.cpp и тестовый набор
Первое - убедись, что у тебя актуальная версия llama.cpp. На февраль 2026 года это v0.4.1 или новее. Собрать из исходников - обязательно, иначе рискуешь потерять оптимизации под новые инструкции CPU.
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
make clean && make -j8 LLAMA_CUDA=1 # для NVIDIA
# или make -j8 LLAMA_METAL=1 # для Apple Silicon
# или make -j8 LLAMA_VULKAN=1 # для AMD/Intel
Скачай модель в формате GGUF. Не бери первую попавшуюся - смотри на квантование. Для бенчмаркинга скорости я использую Q4_K_M как баланс между качеством и размером. Для начала подойдет любая модель от 7B до 20B параметров, например, Newelle 1.2 12B Q4_K_M.
Создай тестовый промпт. Не надо брать "The quick brown fox...". Возьми реальный кусок из твоего пайплайна. Если делаешь RAG-агента, как в этом гайде, используй типичный пользовательский запрос. Сохрани его в файл test_prompt.txt.
2 Создаем агента-оптимизатора
Агент - это скрипт на Python, который общается с LLM через API. Можно использовать OpenAI GPT-4.5-Turbo (если он уже вышел к 2026-му) или локальную модель через Ollama, но учти - ей нужна стабильность в генерации JSON. Я для таких задач взял GLM 4.5 Air 9B, настроенную специально, чтобы не зацикливалась в тул-коллах (спасибо этому материалу).
Промпт для агента - сердце системы. Он должен объяснить модельке:
- Цель: максимизировать tokens/s при сохранении стабильности.
- Параметры для настройки:
-t(треды),-c(контекст),-ngl(слои на GPU),-b(батч),--mlock,--no-mmap,--flash-attnи другие. - Ограничения: доступная оперативка, VRAM, тепловые пакеты.
- Формат ответа: строго JSON с новой конфигурацией и обоснованием.
# Пример промпта для агента-оптимизатора
AGENT_SYSTEM_PROMPT = """
Ты - AI-инженер, специализирующийся на оптимизации llama.cpp.
Тебе даны результаты предыдущего запуска бенчмарка:
- Модель: {model_name}
- Токенов в секунду: {tokens_per_sec}
- Использованная конфигурация: {previous_config}
- Ошибки (если были): {errors}
Доступное железо:
- CPU: {cpu_info}, потоков: {cpu_threads}
- GPU: {gpu_info}, VRAM: {vram_gb} GB
- RAM: {ram_gb} GB
Твоя задача: предложить СЛЕДУЮЩУЮ конфигурацию для теста, которая, по твоей гипотезе, увеличит tokens/s.
Ты можешь менять:
- Количество тредов (-t, от 1 до {cpu_threads})
- Размер контекста (-c, от 512 до 16384)
- Количество слоев на GPU (-ngl, от 0 до {max_layers})
- Размер батча (-b, от 1 до 512)
- Флаги: --mlock, --no-mmap, --flash-attn (если поддерживается)
Верни ответ ТОЛЬКО в формате JSON:
{
"reasoning": "Краткое обоснование, почему выбрал эти параметры",
"config": {
"threads": число,
"context": число,
"gpu_layers": число,
"batch_size": число,
"flags": ["--mlock", "--no-mmap"]
}
}
"""
3 Пишем цикл бенчмаркинга
Этот скрипт - рабочий мул. Он берет конфигурацию от агента, формирует команду llama.cpp, запускает ее, парсит вывод и сохраняет результаты. Критически важно ловить не только tokens/s, но и ошибки сегментации, превышение памяти, аномальные значения.
import subprocess
import json
import time
def run_llama_benchmark(config, model_path, prompt_path):
"""Запускает llama.cpp с заданной конфигурацией и возвращает метрики."""
cmd = [
'./main',
'-m', model_path,
'-t', str(config['threads']),
'-c', str(config['context']),
'-ngl', str(config['gpu_layers']),
'-b', str(config['batch_size']),
'-p', f"$(cat {prompt_path})",
'--log-disable',
]
cmd += config.get('flags', [])
try:
start = time.time()
result = subprocess.run(cmd, capture_output=True, text=True, timeout=120)
elapsed = time.time() - start
# Парсим вывод llama.cpp для извлечения tokens/s
# В последних версиях есть --verbose или --benchmark, используй их
output = result.stdout
tokens_per_sec = extract_tokens_per_sec(output) # Твоя функция парсинга
return {
'tokens_per_sec': tokens_per_sec,
'elapsed_time': elapsed,
'success': True,
'error': None
}
except subprocess.TimeoutExpired:
return {'success': False, 'error': 'timeout'}
except Exception as e:
return {'success': False, 'error': str(e)}
Цикл оптимизации прост: стартуем с базовой конфигурации, запускаем 10-20 итераций, каждый раз отправляя агенту историю результатов. Чтобы агент не предлагал одно и то же, храни хэши конфигураций.
Не делай агента жадным. Если он три раза подряд предлагает конфигурации, которые приводят к падению производительности или ошибкам, останови цикл и проанализируй логи. Возможно, ты уперся в физические ограничения железа.
4 Анализ результатов и стоп-критерии
Самый важный шаг - понять, когда остановиться. Я устанавливаю три стоп-критерия:
- Плато производительности: если за последние 5 итераций прирост tokens/s меньше 1%.
- Исчерпание бюджета: максимум 25 запусков (каждый запуск - время и энергия).
- Критическая ошибка: два запуска подряд с сегфолтом или исчерпанием памяти.
Собранные данные - золото. Построй простой график (можно matplotlib или даже текстовый) зависимости tokens/s от ключевых параметров. Часто выясняется, что -ngl имеет оптимальное значение не "все слои на GPU", а, скажем, 35 из 40, потому что дальше начинается трение между CPU и GPU.
Где все ломается: нюансы и грабли
Теперь о том, что тебе не расскажут в туториалах. Тонкости, которые я вынес, настраивая десятки моделей под разные задачи, от корпоративных RAG-агентов до компактных агентов на смартфонах.
| Параметр | Миф | Реальность |
|---|---|---|
-t (треды) |
Ставь равно количеству ядер CPU. | На современных гибридных процессорах (Intel 12+ gen, Apple M-series) часто оптимально количество performance-ядер + 1-2. E-ядра только мешают. |
--mlock |
Всегда используй для ускорения. | Фиксирует модель в RAM, предотвращая своппинг. Ускорения нет, но может предотвратить лаги при нехватке памяти. На системах с 32+ GB RAM часто бесполезен. |
--no-mmap |
Обязательно для NVMe дисков. | Загружает модель целиком в память. Нужен только если твой диск медленнее 1 GB/s или если ты запускаешь много инстансов одновременно. Иначе - просто трата RAM. |
| Квантование | Чем ниже битность (Q2, Q3), тем быстрее. | Да, но после Q4_K_M прирост скорости мизерный, а падение качества - существенное. Для агентов, где важна логика, не опускайся ниже Q4. Проверяй на своих данных, как в этом методе. |
Самая частая ошибка - игнорирование теплового троттлинга. Если ты гоняешь бенчмарки один за другим на ноутбуке, уже на 5-м запуске CPU/GPU упирается в температурный лимит и сбрасывает частоты. Результаты становятся бесполезными. Делай паузы 30-60 секунд между запусками или мониторь температуру.
А если нужно настроить не скорость, а качество?
Иногда задача - не максимизировать tokens/s, а добиться максимальной точности или стабильности генерации, особенно в мультиагентных системах. Здесь метрика другая - например, процент успешных выполнений задачи или оценка по чеклисту.
Тогда в цикл бенчмаркинга нужно встроить качественную оценку. Запускаешь модель с конфигурацией на наборе тестовых промптов, пропускаешь вывод через другую LLM-судью (это дорого) или простой эвристический анализатор. Агент будет оптимизировать под эту метрику. Подходы похожи на те, что используются в продвинутых мультиагентных системах.
Важно: автоматическая настройка параметров llama.cpp не заменит понимания, как работает инференс. Если ты не знаешь, зачем нужен флаг -eps или что такое rope scaling, даже самый умный агент не спасет. Это инструмент для инженера, а не волшебная палочка.
Что дальше? Собранные оптимальные конфигурации для разных моделей на твоем железе - это твоя личная база знаний. Сохрани ее в JSON. Когда выйдет новая модель, например, AgentCPM-Explore 2.0, ты не начнешь с нуля - возьмешь конфиг от похожей по размеру модели и дашь агенту дооптимизировать.
И последнее: этот агент - твой подчиненный. Не бойся его улучшать. Добавь возможность читать логи системного мониторинга (nvidia-smi, powermetrics). Научи его учитывать, запущен ли у тебя параллельно Chrome со 100 вкладками. Чем больше контекста о реальных условиях работы, тем точнее будут его рекомендации.
А если все это кажется слишком сложным, и ты хочешь просто запустить агента на смартфоне - смотри этот гайд. Но там свои ограничения, и автооптимизация будет скромнее.