llama.cpp server slots: параллельные запросы и контекст
На странице · 5 разделов
Параметр `--parallel` задаёт число слотов сервера llama.cpp, а не гарантированную скорость: при занятых слотах запросы могут ждать. Запустите одну и ту же GGUF-модель с одним, затем двумя слотами; сравните `/slots`, метрики отложенных запросов и задержку на одинаковой нагрузке. Фактическое поле `n_ctx` каждого слота проверяйте через API: общий `--ctx-size` нельзя автоматически считать доступным каждому запросу.
Срез исходников — 6 октября 2026 года. Исходный код llama.cpp закреплён на
5e03bdd(коммит 06.10.2026 00:42 UTC), файл Qwen3-0.6B GGUF — на HF-ревизии23749fe. Ни сервер, ни модель Modelium не запускал; результаты ниже описывают план проверки на вашей машине, а не наши измерения. s1 s5
Что такое слот и когда он нужен?
Слот — состояние обработки отдельного запроса в llama-server. Флаг -np, --parallel N задаёт число слотов (-1 означает auto), а --cont-batching включает совместную пакетную обработку активных последовательностей; в этой ревизии continuous batching включён по умолчанию. Это не обещание ускорения каждого ответа: результат зависит от модели, backend, доступной памяти, длины входов и конкуренции за вычисления. s1 s2
Для сервиса, который одновременно отвечает сотрудникам или агентам, полезно сравнить один и два слота на одной и той же задаче: запросы к локальной модели → собственное CPU/GPU-железо → llama-server → два одновременных обращения → ответ каждого и зафиксированные показатели очереди. Если требуется только одиночный интерактивный чат, больше слотов без замера не является улучшением. Код сервера ведёт очередь задач и состояние слотов раздельно. s1 s3
Как выбрать файл модели и подготовить стенд?
Воспроизводимый пример входных данных — уже скачанный Qwen3-0.6B-Q8_0.gguf из Qwen/Qwen3-0.6B-GGUF на ревизии 23749fefcc72300e3a2ad315e1317431b06b590a. Наличие именно этого файла видно в pinned API; карточка и файл LICENSE указывают Apache-2.0 для этого репозитория. Формат и версия не доказывают качество ответа или минимальный объём RAM/VRAM. Скачивание весов и запуск выполняет читатель в своей среде; перед корпоративным использованием проверьте лицензию своего файла и ограничения данных. s5 s6 s7
Подготовьте llama-server сборки, соответствующей вашей платформе, и локальный путь models/Qwen3-0.6B-Q8_0.gguf; общий гайд llama.cpp объясняет первоначальный запуск. Выполните сначала одиночный тест модели. Оставьте --host 127.0.0.1: не размещайте /slots, /metrics и API генерации на публичном интерфейсе без сетевой защиты. В текущем README loopback указан как адрес по умолчанию, а /health является публичным маршрутом даже при API-ключе. s1 s8
Как сравнить один и два слота?
Остановите первый экземпляр и запустите его с одним слотом: llama-server -m models/Qwen3-0.6B-Q8_0.gguf -c 8192 -np 1 --host 127.0.0.1 --port 8080 --no-webui --metrics. Опции -c и -np заданы явно: автоматический выбор слотов, адаптивная настройка памяти --fit и модельный лимит контекста могут повлиять на фактические значения, поэтому не выводите их только из команды. Если исполняемый файл лежит в каталоге сборки, используйте его путь. s1 s2
Проверьте готовность: curl -fsS http://127.0.0.1:8080/health. Затем сохраните curl -fsS http://127.0.0.1:8080/slots и curl -fsS http://127.0.0.1:8080/metrics в свои протоколы. В /slots ищите id, n_ctx и is_processing; не путайте n_ctx слота с максимальным контекстом обучения модели. В /metrics проверьте показатели llamacpp:requests_processing и llamacpp:requests_deferred: первый описывает обрабатываемые запросы, второй — отложенные на момент снятия метрик. Маршрут метрик доступен только после --metrics, а /slots по умолчанию включён и может быть отключён флагом --no-slots. s1 s2 s4 s8
Отправьте два одновременных одинаковых запроса POST /completion из разных клиентов, например с JSON {"prompt":"Кратко объясни разницу между тестовой заявкой и заказом.","n_predict":128,"stream":false}; формат prompt, n_predict и stream описан в README. Клиенты должны реально пересекаться по времени, иначе теста очереди нет. Запишите время начала и окончания каждого, ответы, текущее /slots и снимки /metrics во время обработки. Короткая модель и запрос могут закончиться слишком быстро: если пересечение не произошло, повторите нагрузку контролируемо, а не делайте вывод из пустой метрики. s1 s3 s4
Остановите сервер, запустите тот же файл и ту же команду, сменив только -np 1 на -np 2. Снова убедитесь в готовности, снимите /slots до нагрузки, повторите ту же пару запросов и сравните время каждого и оба показателя. Не включайте одновременно альтернативную модель, другой backend или cache-параметры: тогда эффект слотов будет неотделим от остальных изменений. Изменение requests_deferred — наблюдение очереди, не универсальный показатель производительности. s1 s2 s4
Почему число слотов меняет контекст?
--ctx-size 8192 задаёт контекст сервера, но не гарантирует 8192 токена каждому из двух слотов. Исходный n_ctx_slot() берёт реальный llama_n_ctx_seq(ctx_tgt) и дополнительно ограничивает его, если задан --kv-unified-per-slot, а также контекстом обучения модели. Режим unified KV, автоматические настройки и конкретная модель влияют на результат; поэтому после каждого перезапуска читайте фактическое n_ctx в /slots. Не подменяйте это поле простым делением 8192/2: в разных режимах распределение отличается. s1 s2
Если нужен явный верхний предел на слот, документация предлагает --kv-unified-per-slot N. При отсутствии -c она описывает выделение общего KV-пула исходя из числа слотов и N; если же -c меньше нужного пула, код предупреждает, что заданный cap может не иметь эффекта или доступный контекст будет меньше ожидаемого. Сначала проверьте память и поле n_ctx, затем увеличивайте контекст: размер GGUF не равен объёму памяти под KV-кеш. s1 s2
Какие ошибки считать сигналом остановки?
Если в /slots виден один слот после старта с -np 2, проверьте журнал фактических аргументов, версию бинарника и успешность загрузки модели: не выводите число слотов из исходной строки запуска. Если запросы с длинным текстом упираются в контекст, сократите вход или пересмотрите -c, -np и доступный KV-пул; код возвращает отдельный тип ошибки превышения контекста с n_ctx и числом prompt-токенов. Если запросы ждут, при реальном перекрытии времени сравните /metrics и состояние is_processing, а не делайте вывод только по двум готовым ответам. s1 s2 s4
Если увеличение слотов вызывает нехватку памяти, вернитесь к одному слоту или уменьшите контекст и повторите проверку; не приписывайте модели несуществующие минимальные требования. После теста завершите сервер штатно и сохраните конфигурацию, ревизию GGUF, сырые ответы /slots и /metrics, время запросов, условия железа и отрицательный результат при нём. Основной следующий шаг — поднять локальный llama.cpp, затем воспроизвести этот протокол на вашем файле и реальной длине запросов. s1 s2 s5
Источники
- llama.cpp: HTTP server README, параметры и endpoints — revision 5e03bdd8700948b9c41c54dd1b00f28a2aebc03f. Получено 06.10.2026.
- llama.cpp: расчёт slot context и состояние слота — revision 5e03bdd8700948b9c41c54dd1b00f28a2aebc03f. Получено 06.10.2026.
- llama.cpp: очередь серверных задач — revision 5e03bdd8700948b9c41c54dd1b00f28a2aebc03f. Получено 06.10.2026.
- llama.cpp: экспорт метрик сервера — revision 5e03bdd8700948b9c41c54dd1b00f28a2aebc03f. Получено 06.10.2026.
- Qwen3-0.6B-GGUF: карточка модели — revision 23749fefcc72300e3a2ad315e1317431b06b590a. Получено 06.10.2026.
- Qwen3-0.6B-GGUF: текст лицензии — revision 23749fefcc72300e3a2ad315e1317431b06b590a. Получено 06.10.2026.
- Qwen3-0.6B-GGUF: pinned repository metadata and files — revision 23749fefcc72300e3a2ad315e1317431b06b590a. Получено 06.10.2026.
- llama.cpp: маршруты HTTP сервера — revision 5e03bdd8700948b9c41c54dd1b00f28a2aebc03f. Получено 06.10.2026.