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

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

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

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

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

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

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

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

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

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

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

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

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

  • Ограничения очереди: Максимальное количество запросов в очереди контролируется переменной 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 (первый пришел — первый обслужен), если память не может быть выделена немедленно.
  • Размер очереди контролируется OLLAMA_MAX_QUEUE (по умолчанию: 512 запросов).
  • Если очередь достигает максимальной емкости, новые запросы получают ошибки 503 «Сервер перегружен».

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

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

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

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

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

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

  • Переносить данные на диск (сильно ухудшая производительность)
  • Возвращать ошибки «нехватка памяти»
  • Крашнуть экземпляр модели в крайних случаях
Контроль конфигурации Назначение Значение по умолчанию
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, но могут увеличить задержку и нагрузку на память.
  • Более низкие значения снижают конкуренцию и могут улучшить стабильность, но запросы будут чаще попадать в очередь.

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

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

Linux / macOS (служба systemd или 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 и среднюю загрузку
  • 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 слишком высоко

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

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

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

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

Ollama: Объединение запросов в пакеты vs Параллельное выполнение

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

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

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

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

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

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

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

Итог

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

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

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

Подписаться

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