Гайд · TNWS AI
Как увидеть занятые слоты llama.cpp server через /slots
Диагностируем конкурирующие запросы через GET /slots и отдельный код 503 при отсутствии свободного слота.
Задача и применимость
Поисковый вопрос: «почему llama.cpp запрос стоит в очереди как проверить slots». Отличить перегруженный сервер от ошибки отдельного промпта и настроить корректную обработку очереди. llama.cpp server с маршрутом /slots, который в официальном README включён по умолчанию и отключается --no-slots; сверено 20 сентября 2026 года. Не публикуйте этот диагностический endpoint без контроля доступа.
Пример рассчитан на уже имеющийся файл модели, полученный законным способом по условиям его лицензии. Здесь не утверждается, что любая GGUF-модель одинаково понимает русский язык или имеет один и тот же чат-шаблон. Фактический номер сборки узнавайте локально через llama-server --version и повторяйте контрольный опыт после обновления бинарника.
Что подтверждено документацией
GET /slots возвращает текущие состояния слотов, в том числе id, is_processing, n_ctx и параметры. Добавление ?fail_on_no_slot=1 приводит к HTTP 503, если свободного слота нет. Это не то же самое, что 503 /health при загрузке модели. Сервер умеет параллельное декодирование, но доступное число слотов и фактическая нагрузка зависят от конфигурации.
Порядок действий
- Проверьте готовность /health перед экспериментом с очередью.
- Вызовите GET /slots без параметров и запишите число слотов и is_processing.
- Отправьте несколько тестовых запросов к отдельному тестовому серверу с контролируемой нагрузкой.
- Повторите /slots?fail_on_no_slot=1, различите 200 и 503.
- Настройте ограниченную клиентскую очередь, время ожидания и повтор с задержкой только там, где безопасно.
Локальный запуск для описанного сценария (замените путь к файлу на ваш):
./build/bin/llama-server -m /models/your-chat-model.gguf --host 127.0.0.1 --port 8080
Готовый шаблон запроса и проверки
import json, urllib.error, urllib.request
base = "http://127.0.0.1:8080"
with urllib.request.urlopen(base + "/slots", timeout=5) as reply:
slots = json.load(reply)
busy = sum(bool(slot.get("is_processing")) for slot in slots)
print("Занятых:", busy, "из", len(slots))
try:
with urllib.request.urlopen(base + "/slots?fail_on_no_slot=1", timeout=5) as reply:
print("Свободный слот есть:", reply.status == 200)
except urllib.error.HTTPError as error:
if error.code != 503:
raise
print("Свободного слота сейчас нет")
Входные данные и ожидаемый результат
Вход: диагностический запрос к локальному серверу в момент, когда другие клиенты генерируют ответы. Ожидаемые проверяемые данные — список slots и число записей с is_processing=true. При исчерпании всех слотов запрос с fail_on_no_slot=1 должен вернуть 503; без нагрузки число занятых может быть нулём.
Почему важна именно эта проверка
Важно различать две причины кода 503. /health описывает готовность модели и может сообщать о загрузке, а /slots с fail_on_no_slot=1 описывает свободную ёмкость для нового запроса. В журнале обязательно храните путь endpoint вместе с кодом, иначе после нагрузки легко поставить неверный диагноз. Запрос /slots — мгновенный снимок состояния; между его ответом и следующим POST другой клиент может занять последний свободный слот. Поэтому нельзя использовать проверку слотов как жёсткую гарантию выделения ресурса.
Работа с реальными данными
is_processing=true показывает выполняемую работу, но не объясняет, плох ли промпт и сколько он ещё будет выполняться. Отдельно замеряйте длину входов, time-to-first-token и ограничение вывода. При росте очереди добавьте ограничение одновременных задач на уровне приложения, а не запускайте сотни проверок /slots в цикле. Безопасный повтор запроса требует учёта идемпотентности: генерация могла завершиться на сервере, хотя клиент прервал соединение. Ведите request ID в своём приложении, если результат записывается в базу или инициирует внешнее действие.
Проверка после изменения модели или нагрузки
Маршрут может раскрыть параметры и состояние запросов, поэтому его лучше оставлять доступным только администратору. Если сервер поднят с --no-slots, отсутствие endpoint не означает, что модель не запущена; проверьте параметры запуска. После обновления бинарника не завязывайте критическую логику на случайные дополнительные поля из JSON — используйте только документированные признаки и тестируйте реальную сборку. Чтобы оценить пропускную способность, дополните наблюдение /slots метриками и коротким нагрузочным тестом, заранее определив допустимые задержки.
Число серверных слотов настраивается параметром --parallel; README допускает автоматическое значение по умолчанию. Простое увеличение числа слотов может изменить память, распределение вычислений и задержку каждого ответа. Сначала получите базовую линию для одного и нескольких одновременно работающих клиентов, затем сравните p95 и число отложенных запросов при двух конфигурациях. Решение принимайте по нагрузочному тесту на конкретном GGUF и железе, а не по принципу «больше слотов всегда быстрее».
Критерии приёмки
- Получен массив слотов с признаком is_processing.
- 503 от /slots отличён от 503 от /health.
- Диагностический снимок не трактуется как бронь свободного слота.
Частые ошибки и чего не делать
- Не считать /slots системой резервирования слотов.
- Не выставлять диагностический endpoint наружу без ограничений.
- Не повторять бездумно неидемпотентное действие после тайм-аута.
Краткие ответы на вопросы
Когда /slots отвечает 503?
С параметром fail_on_no_slot=1 и без свободного слота.
Включён ли endpoint всегда?
По README он включён по умолчанию, но --no-slots его отключает.
Означает ли 200, что следующий запрос точно начнётся?
Нет, состояние может измениться сразу после проверки.
Официальные источники
Частые вопросы
Когда /slots отвечает 503?
С параметром fail_on_no_slot=1 и без свободного слота.
Включён ли endpoint всегда?
По README он включён по умолчанию, но --no-slots его отключает.
Означает ли 200, что следующий запрос точно начнётся?
Нет, состояние может измениться сразу после проверки.
Читайте также
Как ограничить генерацию llama.cpp через n_predict и проверить причину остановки
Используем native /completion и поля остановки, чтобы отличить заданный лимит от нормального конца ответа.
Как переранжировать найденные документы через llama.cpp /v1/rerank
Запускаем reranker GGUF, подаём список кандидатов и проверяем порядок и связь результата с исходными документами.
Как получить embeddings через llama.cpp /v1/embeddings и проверить pooling
Запускаем специализированную embedding-модель, кодируем две строки и проверяем размерность и числовой формат.
Комментарии
Пока тихо. Скажите первое слово