Как 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 использует как группировку, так и параллельное выполнение для эффективной обработки множества запросов. Группировка объединяет запросы для одновременной обработки, а параллельное выполнение позволяет нескольким запросам (или моделям) работать одновременно. Оба метода зависят от системной памяти и настраиваются для оптимальной производительности.
Полезные ссылки
- Справочник Ollama
- Перемещение моделей Ollama в другой диск или папку
- Как Ollama использует производительность и эффективные ядра Intel CPU
- Ollama Space
- Самохостинг Perplexica с Ollama
- Тестирование Deepseek-r1 на Ollama
- Как Ollama обрабатывает параллельные запросы
- Тестирование Deepseek-r1 на Ollama
- Справочник Python
- Python Space
- Переоценка текстовых документов с Ollama и моделью Qwen3 Embedding - на Go