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

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

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

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

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

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

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

  • Параллельная обработка: Ollama поддерживает параллельную обработку запросов. Если в системе достаточно доступной памяти (ОЗУ для вывода на 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, один запрос обрабатывается сразу, а второй ставится в очередь до завершения первого.

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

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

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

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

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

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

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

  • Новые запросы помещаются в очередь FIFO (First-In, First-Out), когда память не может быть немедленно выделена.
  • Размер очереди контролируется 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. Улучшения оборудования

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

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

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

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

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

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

# Используйте квантованную модель с ускорением на 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: Батчинг запросов против параллельного выполнения

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

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

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

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

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

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

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

Итог

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

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

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