Как Ollama обрабатывает параллельные запросы

Понимание параллелизма и очереди в Ollama, а также настройка OLLAMA_NUM_PARALLEL для стабильной обработки параллельных запросов.

Содержимое страницы

В этом руководстве объясняется как Ollama обрабатывает параллельные запросы (конкурентность, очередь и ограничения ресурсов), и как настроить это с помощью переменной окружения OLLAMA_NUM_PARALLEL (и связанных параметров).

Для получения дополнительной информации о пропускной способности, задержке, VRAM и результатах тестирования (бенчмарках) в различных средах выполнения и на разном оборудовании, см. Производительность LLM: бенчмарки, узкие места и оптимизация.

Многоступенчатые агенты многократно увеличивают количество повторных попыток, когда выборка (сэмплирование) нестабильна; для информации о значениях по умолчанию для температуры, top_p и штрафов (penalty) для моделей класса Qwen и Gemma, см. Параметры агентного вывода для Qwen и Gemma.

пять прекрасных лам стоят на поле

Обработка конкурентных запросов

  • Параллельная обработка: Ollama поддерживает параллельную обработку запросов. Если в системе имеется достаточно доступной памяти (RAM для инференса на CPU, VRAM для инференса на GPU), несколько моделей могут быть загружены одновременно, и каждая загруженная модель может обрабатывать несколько запросов параллельно. Это контролируется переменной окружения OLLAMA_NUM_PARALLEL, которая задает максимальное количество параллельных запросов, которые каждая модель может обрабатывать одновременно. По умолчанию это значение установлено в 4 (или 1, в зависимости от доступности памяти), но его можно изменять.

  • Батчинг (группировка): Когда одновременно поступают несколько запросов к одной и той же модели, Ollama группирует их в батч и обрабатывает вместе. Это означает, что оба запроса обрабатываются параллельно, и пользователи будут видеть потоковую передачу ответов одновременно. Сервер не намеренно ожидает заполнения батча; обработка начинается, как только запросы становятся доступны.

Очередь и ограничения

  • Очередь: Если количество конкурентных запросов превышает настроенную степень параллелизма (например, запросов к модели больше, чем значение OLLAMA_NUM_PARALLEL), дополнительные запросы попадают в очередь. Очередь работает по принципу «первым пришел — первым обслужен» (FIFO).

  • Ограничения очереди: Максимальное количество запросов в очереди контролируется переменной OLLAMA_MAX_QUEUE (по умолчанию: 512). Если очередь заполнена, новые запросы получают ошибку 503, указывающую на перегрузку сервера.

  • Загрузка моделей: Количество различных моделей, которые могут быть загружены одновременно, контролируется переменной OLLAMA_MAX_LOADED_MODELS. Если запрос требует загрузки новой модели, а памяти недостаточно, Ollama разгрузит неиспользуемые модели, чтобы освободить место, и запрос будет находиться в очереди до тех пор, пока модель не будет загружена.

Пример сценария

Если два запроса к одной и той же модели поступают одновременно, а степень параллелизма сервера установлена не менее 2, оба запроса будут обработаны вместе в одном батче, и оба пользователя получат ответы одновременно. Если параллелизм установлен в 1, один запрос будет обработан немедленно, а другой будет ждать в очереди до завершения первого.

Если запросы предназначены для разных моделей и памяти достаточно, обе модели могут быть загружены, и запросы будут обработаны параллельно. Если же памяти недостаточно, может потребоваться разгрузить одну модель, и запрос будет поставлен в очередь.

Сводная таблица

Сценарий Результат
Два запроса, одна модель, достаточно параллелизма Оба обработаны параллельно (в одном батче)
Два запроса, одна модель, parallelism=1 Один обработан, второй в очереди до завершения первого
Два запроса, разные модели, достаточно памяти Обе модели загружены, запросы обработаны параллельно
Два запроса, разные модели, недостаточно памяти Один в очереди до освобождения памяти или разгрузки модели

В заключение можно сказать, что Ollama спроектирована для эффективной обработки нескольких одновременных запросов, при условии что сервер настроен для конкурентной работы и имеет достаточные ресурсы. В противном случае запросы ставятся в очередь и обрабатываются по порядку.

Если повышение значения OLLAMA_NUM_PARALLEL больше не позволяет удерживать стабильную задержку, а очередь продолжает расти при реальной нагрузке, это один из более явных сигналов, который стоит взвесить при решении о переходе на специализированный движок предоставления услуг (serving engine). Ollama к vLLM: когда мигрировать ваш локальный LLM-сервер разбирает это решение, включая непрерывный батчинг (continuous batching) и PagedAttention как механизмы, которые vLLM использует, чтобы предотвратить деградацию производительности при конкурентных запросах.

Обработка недостатка памяти

Когда Ollama сталкивается с недостатком памяти для обработки входящих запросов, она использует комбинацию механизмов очередей и стратегий управления ресурсами для поддержания стабильности:

Очередь запросов

  • Новые запросы помещаются в очередь FIFO (First-In, First-Out), когда память не может быть выделена немедленно.
  • Размер очереди контролируется переменной OLLAMA_MAX_QUEUE (по умолчанию: 512 запросов).
  • Если очередь достигает вместимости, новые запросы получают ошибку 503 «Сервер перегружен».

Управление моделями

  • Активные модели могут быть выгружены из памяти, когда они становятся неактивными (idle), чтобы освободить ресурсы для запросов в очереди.
  • Количество одновременно загруженных моделей ограничивается переменной OLLAMA_MAX_LOADED_MODELS (по умолчанию: 3 × количество GPU или 3 для CPU).

Оптимизация памяти

  • Попытки батчинга запросов для одной и той же модели для максимальной эффективности использования памяти.
  • Для инференса на GPU требуется полное выделение VRAM на модель — частичная загрузка не поддерживается.

Сценарии сбоя

Критическое исчерпание памяти: Когда даже запросы в очереди превышают доступные ресурсы, Ollama может:

  • Переходить на диск (page to disk), что резко снижает производительность
  • Возвращать ошибки «недостаток памяти» (out of memory)
  • Вызывать сбой (краш) экземпляра модели в крайних случаях
Параметр настройки Назначение Значение по умолчанию
OLLAMA_MAX_QUEUE Максимальное количество запросов в очереди 512
OLLAMA_NUM_PARALLEL Параллельные запросы на загруженную модель 4 (или 1 при ограничении)
OLLAMA_MAX_LOADED_MODELS Максимальное количество одновременно загруженных моделей 3 × количество GPU или 3

Администраторам следует мониторить использование памяти и настраивать эти параметры на основе возможностей своего оборудования. Обработка недостатка памяти становится критически важной при запуске больших моделей (7B+ параметров) или обработке нескольких конкурентных запросов.

Стратегии оптимизации Ollama

Включите ускорение GPU с помощью export OLLAMA_CUDA=1 и настройте потоки CPU через export OLLAMA_NUM_THREADS=84. Улучшения оборудования

  • RAM: 32 ГБ и более для моделей 13B, 64 ГБ и более для моделей 70B
  • Накопители: NVMe SSD для более быстрой загрузки/замены моделей
  • GPU: NVIDIA RTX 3080/4090 с 16 ГБ VRAM и более для больших моделей

Операционные стратегии

  • Батчинг запросов: Обрабатывайте несколько запросов одновременно, чтобы амортизировать накладные расходы на память
  • Автоматическая разгрузка моделей: Позволяет Ollama удалять неактивные модели из памяти
  • Кэширование часто используемых моделей: Держите общие модели в памяти постоянно

Мониторинг и устранение неполадок

  • Используйте nvidia-smi (GPU) и htop (CPU/RAM) для выявления узких мест
  • Для ошибок памяти:
  • Перейдите на квантованные модели
  • Уменьшите количество конкурентных запросов
  • Увеличьте размер swap-пространства

Пример рабочего процесса оптимизации:

### Используйте квантованную модель с ускорением GPU
export OLLAMA_CUDA=1
ollama run llama2:7b-q4_0 --context-size 2048

### Ограничьте количество загруженных моделей и параллельных запросов
export OLLAMA_MAX_LOADED_MODELS=2
export OLLAMA_NUM_PARALLEL=4

Эти настройки могут уменьшить использование памяти на 30–60%, сохраняя при этом качество ответа, что особенно полезно при запуске нескольких моделей или обработке большого объема запросов.

Переменная окружения OLLAMA_NUM_PARALLEL

OLLAMA_NUM_PARALLEL контролирует, сколько запросов Ollama будет выполнять параллельно. Если вы отправляете несколько запросов на один и тот же сервер Ollama, этот параметр во многом определяет, будут ли они выполняться конкурентно или выстроиться в очередь.

  • Более высокие значения могут увеличить пропускную способность при условии, что у вас достаточно CPU/GPU/VRAM, но могут увеличить задержку и нагрузку на память.
  • Более низкие значения уменьшают конкуренцию (contention) и могут улучшить стабильность, но запросы будут чаще ставиться в очередь.

Память, в частности, масштабируется по формуле OLLAMA_NUM_PARALLEL * OLLAMA_CONTEXT_LENGTH: четыре параллельных слота с настройкой контекста 32K резервируют KV-кэш так, как будто была загружена одна последовательность 128K, даже до того, как какой-либо запрос начнет его использовать. На видеокарте с 16 ГБ этот расчет бюджета памяти обычно важнее, чем поведение очереди — см. KV-кэш на GPU с 16 ГБ для полного бюджета VRAM и о том, почему OLLAMA_NUM_PARALLEL=1 обычно является правильной отправной точкой для одной сессии с длинным контекстом.

Как установить OLLAMA_NUM_PARALLEL

Linux / macOS (системный сервис или shell):

export OLLAMA_NUM_PARALLEL=2
ollama serve

Разовый запуск (префикс только для этой команды):

OLLAMA_NUM_PARALLEL=2 ollama serve

Docker (пример):

docker run --rm -e OLLAMA_NUM_PARALLEL=2 -p 11434:11434 ollama/ollama

Как выбрать значение

Начните с 1–2 для одного GPU / ограниченного VRAM, затем постепенно увеличивайте, отслеживая:

  • Использование VRAM GPU (OOM / выгрузки)
  • Использование CPU и среднюю нагрузку (load average)
  • p95 задержку ваших типовых запросов
  • Уровень ошибок / таймаутов

Если вы оптимизируете конкретную страницу для использования CLI, см. раздел CLI Ollama в шпаргалке, а также примеры команд для ollama serve, ollama ps и ollama run.

Быстрые рецепты настройки

Приоритет стабильности

  • OLLAMA_NUM_PARALLEL=1
  • Используйте меньшие / квантованные модели
  • Предпочитайте более короткие размеры контекста

Приоритет пропускной способности

  • OLLAMA_NUM_PARALLEL=2 (или выше, если у вас есть запас мощности)
  • Рассматривайте батчинг запросов на уровне клиента
  • Убедитесь, что достаточно VRAM и потоков CPU

«У меня кончается VRAM, когда поступают два запроса»

  • Уменьшите OLLAMA_NUM_PARALLEL
  • Используйте модель с более агрессивным квантованием
  • Уменьшите длину контекста / максимальное количество токенов

Устранение неполадок

Симптомы того, что OLLAMA_NUM_PARALLEL установлен слишком высоко

  • Запросы периодически завершаются с ошибкой под нагрузкой
  • Часто происходят OOM на GPU / разгрузка моделей
  • Пики задержки, когда поступает второй запрос

Симптомы того, что OLLAMA_NUM_PARALLEL установлен слишком низко

  • CPU/GPU используется недополучно
  • Задержки в очереди составляют большую часть общего времени ответа

Совет: Если вы также управляете своим клиентом, добавьте повторные попытки с джиттером (jitter) и поддерживаемые соединения (keep-alive connections). Многие проблемы с «Ollama работает медленно» на самом деле связаны с очередью + накладными расходами на соединение.

Ollama: батчинг запросов против параллельного выполнения

Батчинг в Ollama относится к практике группировки нескольких входящих запросов и обработки их как единого блока. Это позволяет более эффективно использовать вычислительные ресурсы, особенно при работе на оборудовании, которое выигрывает от параллелизованных операций (таком как GPU).

Когда одновременно поступают несколько запросов к одной и той же модели, Ollama может обработать их вместе в одном батче, если это позволяет память. Это увеличивает пропускную способность и может снизить задержку для каждого запроса, поскольку модель может использовать оптимизированные матричные операции над батчем.

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

Параллельное выполнение в Ollama означает обработку нескольких запросов одновременно, либо для одной модели, либо для разных моделей, в зависимости от доступной памяти и конфигурации.

Ollama поддерживает два уровня параллелизма:

  • Загрузка нескольких моделей: Если доступно достаточно памяти, несколько моделей могут быть загружены и обслуживать запросы одновременно.
  • Параллельные запросы на модель: Каждая загруженная модель может обрабатывать несколько запросов параллельно, это контролируется настройкой OLLAMA_NUM_PARALLEL (по умолчанию 1 или 4, в зависимости от памяти).

Когда запросы превышают лимит параллелизма, они выстраиваются в очередь (FIFO) до значения OLLAMA_MAX_QUEUE.

Итог

Ollama использует как батчинг, так и параллельное выполнение для эффективной обработки нескольких запросов. Батчинг группирует запросы для одновременной обработки, а параллельное выполнение позволяет нескольким запросам (или моделям) работать конкурентно. Оба метода зависят от системной памяти и настраиваются для оптимальной производительности.

Для получения дополнительных бенчмарков, настройки конкурентности и рекомендаций по производительности, загляните в наш центр Производительность LLM: бенчмарки, узкие места и оптимизация.

Полезные ссылки

Подписаться

Получайте новые материалы про системы, инфраструктуру и AI engineering.