Автонастройка llama.cpp: AI-агент для оптимизации параметров модели | AiManual
AiManual Logo Ai / Manual.
02 Фев 2026 Гайд

Автоматическая настройка llama.cpp: как заставить AI-агента искать оптимальные параметры для любой модели

Пошаговый гайд по созданию AI-агента для автоматического бенчмаркинга и поиска лучших параметров llama.cpp под ваше железо. Экономьте часы ручной настройки.

Ручная настройка 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, пытаясь улучшить метрики. Мы автоматизируем цикл: предложение параметров -> выполнение бенчмарка -> сбор метрик -> анализ -> новое предложение.

💡
Это не магия, а прикладное применение идей из автономного бенчмаркинга LLM. Мы берем агента, который умеет тестировать модели, и затачиваем его под тонкую настройку одного движка.

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 Анализ результатов и стоп-критерии

Самый важный шаг - понять, когда остановиться. Я устанавливаю три стоп-критерия:

  1. Плато производительности: если за последние 5 итераций прирост tokens/s меньше 1%.
  2. Исчерпание бюджета: максимум 25 запусков (каждый запуск - время и энергия).
  3. Критическая ошибка: два запуска подряд с сегфолтом или исчерпанием памяти.

Собранные данные - золото. Построй простой график (можно 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 вкладками. Чем больше контекста о реальных условиях работы, тем точнее будут его рекомендации.

А если все это кажется слишком сложным, и ты хочешь просто запустить агента на смартфоне - смотри этот гайд. Но там свои ограничения, и автооптимизация будет скромнее.