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

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

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

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

Быстрые ссылки: Что такое OLLAMA_NUM_PARALLEL? · Быстрые рецепты настройки · Как работает очередь · Устранение неполадок · См. также: Шпаргалка по командам Ollama CLI

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

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

пять замечательных лам стоят на поле

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

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

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

Очереди и лимиты

  • Очередь: Если количество одновременных запросов превышает настроенную параллельность (например, больше OLLAMA_NUM_PARALLEL запросов для модели), дополнительные запросы помещаются в очередь. Очередь работает по принципу FIFO (first-in, first-out — первый пришел, первый ушел).

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Использовать подкачку на диск (сильно снижая производительность)
  • Возвращать ошибки “недостаточно памяти” (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.

Аппаратные улучшения

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

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

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

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

  • Используйте nvidia-smi (GPU) и htop (CPU/ОЗУ) для выявления узких мест
  • При ошибках памяти:
  • Перейдите на квантованные модели
  • Уменьшите количество конкурентных запросов
  • Увеличьте пространство подкачки (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, но могут увеличить задержку и нагрузку на память.
  • Более низкие значения уменьшают конкуренцию и могут улучшить стабильность, но запросы будут чаще помещаться в очередь.

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

Linux / macOS (служба systemd или оболочка):

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, см. раздел Ollama CLI в шпаргалке, а также примеры команд для 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). Многие проблемы с “Ollama работает медленно” на самом деле связаны с очередями и накладными расходами на соединения.

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

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

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

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

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

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

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

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

Вывод

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

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

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

Подписаться

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