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

Настройка ollama для выполнения параллельных запросов.

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

Когда сервер Ollama получает два запроса одновременно, его поведение зависит от настройки и доступных системных ресурсов.

пять потрясающих лам в поле

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

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

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

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

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

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

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

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

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

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

Таблица с резюме

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

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

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

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

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

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

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

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

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

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

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

Критический исчерпание памяти: Когда даже запросы в очереди превышают доступные ресурсы, 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 с 16ГБ+ видеопамяти для крупных моделей

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

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

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

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

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

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

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

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

Ollama: Группировка запросов vs параллельное выполнение

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

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

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

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

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

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

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

Вывод

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

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