Параметры движка, которые важны
Большинство дефолтов движка нормальны для демо и неправильны для реального использования. Три-четыре ручки меняют результат: длина контекста, оффлоад на GPU, тип KV-кэша и flash attention. Всё остальное — тюнинг на полях. Эта страница использует имена флагов llama.cpp, с эквивалентами Ollama в конце — концепции переносятся на любой движок.
Длина контекста: ловушка молчаливого дефолта
Движки поставляют консервативные дефолты: llama.cpp исторически 512, затем 4096, Ollama 2048–4096 в зависимости от версии (на момент написания OLLAMA_CONTEXT_LENGTH приземляется около 4k). Тем временем ваша модель может нативно поддерживать 32k–128k. Вставьте документ на 20k токенов в контекст 4k — и случится одно из двух, оба плохих: жёсткая ошибка («запрос превышает доступный контекст») или молчаливое обрезание старейших сообщений. Ни одно сообщение об ошибке не объясняет себя новичку.
Разбор: вы загружаете контракт ~12k токенов плюс вопрос в дефолтное окно 4096. Движок держит самое свежее, выкидывает начало документа, и модель уверенно отвечает на вопросы о неправильной половине файла. Это выглядит как глупая модель; это обрезанный промпт.
Лечение механическое: передавайте размер контекста явно при каждом запуске, под реальные промпты плюс ожидаемый вывод, затем проверяйте, что лог старта показывает n_ctx = 16384 (или что вы выбрали). Корейская заметка: корейский текст часто токенизируется менее плотно, чем английский, в том же токенизаторе — страница корейского может стоить больше токенов, чем страница английского (см. токены), поэтому давление контекста приходит раньше, чем вы ждёте.
# ловушка: дефолты различаются по движкам и версиям
llama-server -m model.gguf # стартует с n_ctx = 4096 или около
# лечение: явно и с проверкой в логе старта
llama-server -m model.gguf -c 16384 # лог печатает: n_ctx = 16384
Оффлоад на GPU: n_gpu_layers
-ngl / --n-gpu-layers задаёт, сколько слоёв трансформера живут на GPU; используйте большое число вроде 99 (или -1 там, где поддерживается) в значении «все». Симптом частичного оффлоада характерен: 3–10 tok/s на машине с приличной GPU. Проверьте строкой лога загрузки, напр. offloaded 33/33 layers to GPU. Если VRAM не держит модель плюс KV-кэш, честные варианты — меньший квант, квантованный KV-кэш или меньше слоёв на GPU, — но знайте: каждый слой, оставшийся на CPU, тащит весь цикл в ритм CPU (см. скорость). Полу-оффлоад почти влезающей модели обычно хуже, чем шаг кванта вниз.
Проверьте и в другую сторону: -ngl 0 форсирует чистый CPU, и если это бежит с той же скоростью, что ваша «GPU»-конфигурация, GPU ничего не делала.
Потоки (только режим CPU)
В режиме CPU ставьте -t на число физических ядер, а не SMT-потоков: на чипе 8 ядер/16 потоков используйте 8. Больше потоков, чем физических ядер, вызывает конкуренцию и замедляет декодирование. Обработка промпта имеет отдельную ручку (--threads-batch); то же правило.
Память: mmap и --mlock
llama.cpp по умолчанию отображает файл модели в память (mmap): старт быстрый, нетронутые слои не стоят RAM. Компромисс: ОС может выселить страницы под давлением памяти, вызывая загадочные паузы спустя часы сессии. --mlock прибивает модель, чтобы её нельзя было выселить — полезно на загруженных машинах ценой запирания гигабайтов от всего остального. Ollama делает это внутренне; пользователи чистого llama.cpp на разделяемых машинах должны знать, что флаг существует.
Flash attention
-fa / --flash-attn снижает трафик памяти на шаге внимания и включён (или авто) по умолчанию в свежих сборках llama.cpp. Важнее всего на длинном контексте, а квантование V-кэша в текущих сборках его требует. Если свежая сборка капризничает на вашем GPU-бэкенде, это первый флаг для переключения — а на любой недавней сборке первое, что стоит проверить, — что он молча не выключился.
Квантизация KV-кэша
--cache-type-k q8_0 --cache-type-v q5_0 хранит KV-кэш в 8/5 битах вместо 16-битных float, срезая KV-память примерно вдвое или лучше при малой цене качества — что означает более длинный контекст в том же VRAM. Что такое KV-кэш и точная математика размера: KV-кэш.
Типичный выигрыш: q8_0 K плюс q5_0 V примерно уполовинивает KV с едва видимым изменением на чат-задачах — проверьте на своих нагрузках, прежде чем доверять.
Размер батча промпта
-b / --batch-size — размер куска для префилла (обработки промпта). Большие батчи дают более быстрый первый токен на длинных промптах ценой небольшого пика VRAM. Если длинные вставки медленно стартуют, поднимите его, прежде чем винить модель.
Растяжение контекста: rope scaling и YaRN
--rope-scaling yarn --rope-factor 2.0 растягивает модель с нативными 32k к 64k перемасштабированием позиционных частот. Работает, со склоном качества: деградация мала у нативного окна и растёт по мере растяжения за него. Для всего важного предпочитайте модель, чей нативный контекст уже покрывает потребность, растяжению меньшего окна (см. выбор модели).
На момент написания Ollama не открывает rope scaling в Modelfile; эксперименты с растянутым контекстом означают запуск llama.cpp напрямую.
Аннотированная строка запуска
llama-server -m qwen3-8b-q4_k_m.gguf --host 127.0.0.1 --port 8080 -c 16384 -ngl 99 -fa on -b 2048 --cache-type-k q8_0 --cache-type-v q5_0
| Флаг | Что делает | Осторожно |
|---|---|---|
-c 16384 |
Окно контекста (промпт + вывод делят его) | Никогда не надейтесь на дефолт; ставьте явно |
-ngl 99 |
Слои, оффложенные на GPU (99 = все) | Проверяйте строку лога offloaded N/N |
-fa on |
Flash attention | Авто по умолчанию в свежих сборках; нужен для кванта V-кэша |
-b 2048 |
Батч обработки промпта | Слегка поднимает пик VRAM; помогает TTFT |
--cache-type-k/-v |
dtype KV-кэша | Квантизация V требует flash attention |
--host 127.0.0.1 |
Привязка только к loopback | Правила экспозиции в обслуживании |
Эквиваленты Ollama
# на модель, в Modelfile:
PARAMETER num_ctx 16384
PARAMETER num_gpu 99
# или глобально, до старта сервиса:
export OLLAMA_CONTEXT_LENGTH=16384
export OLLAMA_FLASH_ATTENTION=1
export OLLAMA_KV_CACHE_TYPE=q8_0
Ollama пишет предупреждение в лог, когда запрос превышает num_ctx — прочитайте лог один раз после изменения любого из них. Изменения через переменные окружения требуют перезапуска сервиса.
Чтобы увидеть, что Ollama реально применила: ollama show model --modelfile печатает разрешённые параметры, а OLLAMA_DEBUG=1 заставляет сервис логировать реальные контекст и счётчики оффлоада.
Сэмплеры — не ручки движка
Температура, top-p, штраф за повторы — они формируют какой токен выбран, а не как быстро или сколько влезает в память. Они живут в сэмплировании. Если вывод странный, но скорость и память в порядке, вам нужна та страница, не эта.
Правило
Ставьте контекст явно. Проверяйте строкой лога — n_ctx = ... и offloaded N/N layers — каждый раз, когда меняете конфиг запуска. Дефолты настроены, чтобы первое демо стартовало, а не чтобы ваша нагрузка обслуживалась.
llm_load_tensors: offloaded 33/33 layers to GPU
n_ctx = 16384
Обе строки печатаются за секунды после запуска. Найдите их один раз — и конфигурация перестаёт быть фольклором.
Связанные разделы: скорость · KV-кэш · сэмплирование · развёртывание эндпоинта