Гайд · TNWS AI

Как ограничить параллельные AI-запросы в Gradio и избежать переполнения памяти

4 мин—

Настраиваем concurrency_limit и max_size, измеряем очередь и отделяем нагрузочную защиту от авторизации.

Задача и применимость

Русскоязычный вопрос: «как ограничить количество одновременных запросов к llm gradio queue». Применимо к Gradio ChatInterface с ресурсоёмким локальным модельным сервером; конкретные значения очереди — тестовый бюджет, а не универсальная настройка для всех GPU. Руководство Gradio проверено 20 сентября 2026 года. Реальную доступную память и число модельных процессов измеряйте на своей машине до увеличения параллелизма.

Что подтверждено производителем

ChatInterface имеет concurrency_limit; документация указывает значение default по умолчанию и связь с default_concurrency_limit метода queue(), который равен 1 по умолчанию. queue(max_size=...) ограничивает число ожидающих заявок; при заполнении новый запрос не добавляется и пользователь получает ошибку. Установка числа обработчиков выше не делает одну GPU быстрее.

Порядок действий

  1. Измерьте потребление памяти на одном модельном запросе и продолжительность ответа.
  2. Для первого запуска оставьте не более одного одновременного вызова inference-функции.
  3. Поставьте небольшой max_size очереди и проверьте заполнение тестовыми клиентами.
  4. Зафиксируйте время ожидания и время модели по отдельности.
  5. Повышайте concurrency_limit только если измерения показывают запас памяти и повышение пропускной способности.

Готовый шаблон

Сохраните пример в отдельном файле Python. В коде нет реального секрета или скрытого вызова модели: если подключён внешний API, его адрес и параметры указаны явно. Установите gradio в отдельном окружении; дополнительные пакеты требуются только там, где они импортированы в примере.

import time
import gradio as gr

def simulate_model(message, history):
    time.sleep(2)  # заменить реальным вызовом локальной модели
    return "Обработано: " + message

demo = gr.ChatInterface(simulate_model, concurrency_limit=1,
                        title="Контроль очереди")
demo.queue(max_size=3).launch(server_name="127.0.0.1")

Вход и ожидаемый результат

Тест: откройте несколько независимых вкладок и почти одновременно отправьте сообщения «A», «B», «C». Функция sleep занимает около двух секунд для каждого успешно принятого запроса; при concurrency_limit=1 модельная функция не выполняется для всех заявок одновременно. При превышении максимума очереди часть новых заявок получит отказ. Точные границы и время зависят от момента отправки и запуска сервера; фиксируйте реальные наблюдения.

Проверка контракта

Параллельный инференс резко меняет расход памяти, особенно при длинных контекстах, больших изображениях и разных параметрах генерации. Если одиночная модель уже почти заполняет GPU, concurrency_limit=4 способен привести не к четырём быстрым ответам, а к падению процесса. Сначала соберите p95 задержки на контрольных промптах разной длины. Учитывайте не только веса, но и память под KV-cache и активные запросы. Настройка очереди даёт управляемое ожидание, не увеличивая физические ресурсы.

Работа с данными пользователя

max_size — механизм обратного давления. Для пользовательского продукта важнее честно показать «очередь заполнена, попробуйте позже», чем заставить человека ждать неопределённо долго. Проверьте текст ошибки в реальном браузере, а не только отсутствие исключений в терминале. Мониторинг должен различать отказ до очереди, ожидание и время самого inference: иначе легко ошибочно начать менять модель, когда причиной стала перегрузка UI. Если прокси устанавливает собственный тайм-аут, тестируйте и его.

Что проверить перед развёртыванием

Ограничение параллельных запросов не предотвращает злоупотребление одним клиентом: тот может снова и снова посылать задачи, занимая очередь. Для открытого доступа необходимы отдельная аутентификация, лимит частоты и стоимость запроса по ресурсам. И наоборот, увеличение max_threads касается threadpool синхронных функций и не равнозначно параметру concurrency_limit для события. Не копируйте фиксированные значения из статьи в production без нагрузочного эксперимента на вашей модели и длине контекста.

Для эксплуатационного отчёта заведите четыре колонки: время отправки, время входа в fn, время выхода из fn, результат HTTP/UI. Разность первых двух приближает ожидание, следующих — выполнение. Пометка «модель успела ответить» не гарантирует приемлемого UX, если пользователь уже закрыл вкладку. Установите разумную политику прекращения работы отменённых запросов на стороне модельного сервера; очередь Gradio сама не проектирует ваш механизм отмены.

Составьте нагрузочный профиль из трёх типов вопросов: короткий до одной строки, длинный документ и запрос с потенциально большим ответом. Для каждого измерьте время в очереди, пик VRAM и процент успешных завершений. Настройка, работающая на коротком запросе, может падать при нескольких длинных. Если появляется отказ на max_size, выдавайте понятную причину и интервал повторной попытки только когда он подтверждён измерениями; придуманное время ожидания подорвёт доверие. Следите за остановленными браузерными сеансами и ресурсами, которые модель продолжает занимать.

Критерии приёмки

  1. При нескольких вкладках фактически активен не более одного callback.
  2. Переполненная очередь выдаёт понятную ошибку.
  3. Ожидание и время модели записаны раздельно.

Типичные ошибки и чего не делать

  • Не повышать concurrency без измерения памяти.
  • Не путать очередь с защитой от злоупотреблений.
  • Не считать threadpool и ограничение inference одной настройкой.

FAQ

Что делает concurrency_limit=1?

Ограничивает одновременные исполнения функции чата.

Что делает max_size?

Ограничивает число ожидающих запросов.

Ускорит ли большой лимит GPU?

Не обязательно; проверяйте измерением.

Официальные источники

Частые вопросы

Что делает concurrency_limit=1?

Ограничивает одновременные исполнения функции чата.

Что делает max_size?

Ограничивает число ожидающих запросов.

Ускорит ли большой лимит GPU?

Не обязательно; проверяйте измерением.

Читайте также

Комментарии

Пока тихо. Скажите первое слово