Режим маршрутизации Llama-Server — динамическое переключение моделей без перезапуска
Запуск и замена моделей LLM без перезагрузки.
Долгое время у llama.cpp была явная ограничение:
можно было обслуживать только одну модель на процесс, и для переключения требовался перезапуск.
Эта эпоха закончилась.
Недавние обновления принесли режим маршрутизатора в llama-server, предложив то, что больше соответствует ожиданиям от современных локальных сред исполнения LLM:
- динамическая загрузка моделей
- выгрузка по требованию
- переключение на уровне запроса
- без перезапуска процесса

Иными словами: поведение, подобное Ollama, но без «трёх колёс».
Если вы всё ещё выбираете между локальными средами исполнения, облачными API и самохостингом, обзор
размещения LLM станет хорошей отправной точкой.
Предварительные требования
Режим маршрутизатора требует свежей сборки llama-server — примерно после середины 2024 года. В старых сборках нет флага --models.
Варианты установки (менеджер пакетов, готовые бинарники или полная сборка из исходников с поддержкой CUDA) описаны в
быстром старте llama.cpp.
После установки llama-server убедитесь, что ваша сборка поддерживает режим маршрутизатора:
llama-server --help | grep -i models
Если флаг --models появился, всё в порядке. Если его нет, обновитесь до более новой сборки.
Мой текущий вывод справки по моделям:
-cl, --cache-list показать список моделей в кэше
Префикс/Суффикс/Середина) так как некоторые модели предпочитают это. (по умолчанию: отключено)
модели с динамическим разрешением (по умолчанию: читать из модели)
модели с динамическим разрешением (по умолчанию: читать из модели)
модели для эмбеддингов (по умолчанию: отключено)
--models-dir PATH директория, содержащая модели для сервера-маршрутизатора (по умолчанию: отключено)
(env: LLAMA_ARG_MODELS_DIR)
--models-preset PATH путь к INI-файлу с предустановками моделей для сервера-маршрутизатора
(env: LLAMA_ARG_MODELS_PRESET)
--models-max N для сервера-маршрутизатора, максимальное количество моделей для одновременной загрузки
(env: LLAMA_ARG_MODELS_MAX)
--models-autoload, --no-models-autoload
для сервера-маршрутизатора, автозагрузка моделей (по умолчанию:
(env: LLAMA_ARG_MODELS_AUTOLOAD)
Что на самом деле делает режим маршрутизатора
Режим маршрутизатора превращает llama-server в диспетчер моделей.
Вместо привязки к одной модели через -m, сервер:
- запускается без загруженной модели
- получает запрос с указанием модели
- загружает эту модель, если она ещё не в памяти
- выполняет инференс
- по желанию выгружает модель после ответа или держит её тёплой для следующего запроса
Ключевая идея
Вы больше не запускаете:
./llama-server -m model.gguf
Вы запускаете:
./llama-server --models models.ini --port 8080
И позволяете серверу решать что загружать и когда, основываясь на том, что запрашивает клиент.
Это важно, потому что это означает, что один постоянный процесс может обслуживать целый флот моделей, при этом клиенты выбирают нужную модель для каждой задачи — модель для кода, для чата, для суммаризации — без каких-либо накладных расходов на координацию с вашей стороны.
Конфигурация: определение ваших моделей
Здесь всё ещё немного сыровато.
Пока нет полностью стабильного официального формата, но текущие сборки поддерживают определения моделей в стиле INI через файл конфигурации.
Пример models.ini
[llama3]
model = /opt/models/llama-3-8b-instruct.Q5_K_M.gguf
ctx-size = 8192
ngl = 35
threads = 8
[mistral]
model = /opt/models/mistral-7b-instruct-v0.3.Q4_K_M.gguf
ctx-size = 4096
ngl = 20
threads = 8
[qwen]
model = /opt/models/qwen2.5-coder-7b-instruct.Q5_K_M.gguf
ctx-size = 16384
ngl = 35
threads = 8
Каждое имя секции становится идентификатором модели, который клиенты используют в поле "model" своих API-запросов.
Ключевые параметры конфигурации
| Параметр | Что контролирует |
|---|---|
model |
Абсолютный путь к файлу GGUF |
ctx-size |
Размер контекстного окна в токенах. Большие значения потребляют больше VRAM. |
ngl |
Количество GPU-слоёй для разгрузки. Установите 0 для работы только на CPU; увеличивайте до достижения лимитов VRAM. |
threads |
CPU-поток для слоёв, оставшихся на CPU. |
Выбор правильного значения ngl зависит от доступной VRAM вашей видеокарты — для выбора GPU и анализа аппаратной экономики руководство по вычислительному оборудованию будет полезным справочником. Чтобы отслеживать потребление VRAM в реальном времени при настройке, см. инструменты мониторинга GPU для Linux.
Запуск сервера с конфигурацией
./llama-server --models /opt/llama.cpp/models.ini --port 8080
Убедитесь, что сервер запустился корректно:
curl http://localhost:8080/v1/models | jq '.data[].id'
Вы должны увидеть список идентификаторов моделей, соответствующих именам секций из вашего models.ini.
Примечание о стабильности
Интерфейс конфигурации INI всё ещё развивается:
- флаги могут меняться между коммитами
- некоторые параметры распознаются только определёнными конфигурациями сборки
- документация отстает от реализации
Фиксируйте конкретный коммит llama.cpp, если вам нужна воспроизводимость между перезапусками.
Использование API: переключение моделей по запросу
После запуска сервера переключение моделей происходит через стандартный OpenAI-совместимый API. Просто установите поле "model".
Список зарегистрированных моделей
curl http://localhost:8080/v1/models
Запрос завершения — первая модель
curl http://localhost:8080/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "llama3",
"messages": [
{"role": "user", "content": "Объясни режим маршрутизатора в одном абзаце"}
]
}'
Переключение на другую модель — тот же эндпоинт, тот же порт
curl http://localhost:8080/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "qwen",
"messages": [
{"role": "user", "content": "Напишите функцию на Python для чтения CSV-файла"}
]
}'
Сервер прозрачно обрабатывает цикл выгрузки/загрузки. Ваш клиентский код не меняется — меняется только поле model.
Пример на Python
Если вы используете клиент openai для Python:
from openai import OpenAI
client = OpenAI(base_url="http://localhost:8080/v1", api_key="not-needed")
# Используем модель для кода
response = client.chat.completions.create(
model="qwen",
messages=[{"role": "user", "content": "Напишите HTTP-обработчик на Go"}],
)
print(response.choices[0].message.content)
# Переключаемся на чат-модель — тот же клиент, другое имя модели
response = client.chat.completions.create(
model="llama3",
messages=[{"role": "user", "content": "Какая столица Австралии?"}],
)
print(response.choices[0].message.content)
Что происходит внутри
Когда приходит запрос на qwen, а в данный момент загружена llama3:
llama3выгружается из VRAM- веса
qwenсчитываются с диска и загружаются в VRAM - выполняется инференс
- следующий запрос определяет, нужно ли держать
qwenзагруженной или снова переключиться
Это напрямую отвечает на частый вопрос:
Как локальный сервер LLM может переключать модели без перезапуска
Динамически загружая модели по запросу, а не привязываясь к ним при старте.
Служба systemd: готовая к продакшену настройка
Создание отдельного пользователя и директорий
sudo useradd --system --shell /usr/sbin/nologin --home-dir /opt/llama.cpp llm
sudo mkdir -p /opt/llama.cpp/models
sudo chown -R llm:llm /opt/llama.cpp
Скопируйте бинарник и конфигурацию моделей на место:
sudo cp build/bin/llama-server /opt/llama.cpp/
sudo cp models.ini /opt/llama.cpp/
/etc/systemd/system/llama-server.service
[Unit]
Description=Llama.cpp Router Server
After=network.target
[Service]
Type=simple
User=llm
WorkingDirectory=/opt/llama.cpp
ExecStart=/opt/llama.cpp/llama-server --models /opt/llama.cpp/models.ini --port 8080
Restart=always
RestartSec=5
Environment=LLAMA_LOG_LEVEL=info
[Install]
WantedBy=multi-user.target
Включение и запуск
sudo systemctl daemon-reload
sudo systemctl enable llama-server
sudo systemctl start llama-server
Проверка и просмотр логов
sudo systemctl status llama-server
journalctl -u llama-server -f
При успешном запуске вы увидите строки, указывающие, что сервер слушает порт и регистр моделей загружен. Быстрая проверка:
curl -s http://localhost:8080/v1/models | jq '.data[].id'
Теперь у вас есть постоянная служба с автоматическим перезапуском и централизованным переключением моделей — без необходимости ручного управления процессами. Если вы хотите применить тот же паттерн к другим бинарникам, размещение любого исполняемого файла как службы Linux описывает общий подход.
Флаг --metrics в llama-server открывает эндпоинт, совместимый с Prometheus. Для дашбордов, специфичных для llama.cpp, запросов PromQL и правил оповещения см. руководство по мониторингу инференса LLM. Для более широкой настройки наблюдаемости руководство по наблюдаемости охватывает полный стек.
Ограничения, которые нужно понимать
Режим маршрутизатора действительно полезен, но он имеет компромиссы, о которых нужно знать перед использованием в продакшене.
Только одна модель в памяти одновременно
Даже если в models.ini определено несколько моделей, в VRAM в любой момент времени резидентна только одна модель на воркер. Переключение означает полный цикл выгрузки и перезагрузки.
- переключение означает перезагрузку
- скачок задержки неизбежен
- для типичной модели 7B с квантованием Q5 перезагрузка может занять 3–10 секунд в зависимости от скорости диска и пропускной способности VRAM
Это отвечает на ещё один ключевой вопрос:
Поддерживает ли llama.cpp одновременную работу нескольких моделей
Не совсем. Он поддерживает множество определений, но не одновременную резидентность. Если вам нужно, чтобы две модели действительно работали параллельно, вам нужны два процесса на двух разных GPU.
Для измеренного потребления VRAM и токенов в секунду для разных размеров моделей бенчмарки производительности LLM дают полную картину. Для чисел, специфичных для llama.cpp на GPU с 16 ГБ VRAM — плотные и MoE модели при разных размерах контекста — см. бенчмарки llama.cpp для 16 ГБ VRAM.
Отсутствует умная кэшизация
В отличие от Ollama, который поддерживает тёплый пул и выгружает модели на основе давности использования:
- нет автоматической стратегии выгрузки моделей
- нет фоновой предварительной подготовки
- нет приоритетной очереди для часто используемых моделей
Если вы отправляете чередующиеся запросы для llama3 и mistral, каждый запрос будет вызывать перезагрузку. Это фундаментальная цена за более тесную работу с «железом».
Задержка непредсказуема для смешанных нагрузок
Хорошо организованный workload, использующий одну модель постоянно, будет быстрым. Нагрузка, чередующая несколько моделей, будет медленной. Планируйте логику маршрутизации клиента соответствующим образом — группировать запросы по моделям, где это возможно.
Конфигурация нестабильна
Поддержка INI существует и работает в большинстве последних сборок, но она не полностью стандартизирована. Флаги и названия параметров менялись между версиями. Если вы обновляете llama-server, протестируйте ваш models.ini против новой сборки перед развёртыванием.
Llama.cpp против Ollama: честное сравнение
| Характеристика | llama.cpp router | Ollama |
|---|---|---|
| Динамическая загрузка | Да | Да |
| Переключение моделей | Да | Да |
| Встроенный регистр | Частичный (INI) | Да (на основе pull) |
| Управление памятью | Базовое | Продвинутое |
| Выгрузка моделей | Отсутствует | На основе TTL |
| Качество UX | Низкое | Высокое |
| Совместимость API OpenAI | Да | Да |
| Контроль | Максимальный | Мнение-ориентированный |
| Стабильность конфигурации | Экспериментальное | Стабильное |
Личное мнение
Выбирайте режим маршрутизатора llama.cpp, если вам нужно:
- максимальный контроль над параметрами времени выполнения для каждой модели
- минимальные накладные расходы на процессы
- прямой доступ к флагам llama.cpp без абстракций
- базу для создания собственных инструментов
Выбирайте Ollama, если вам нужно:
- стабильный и отполированный опыт
- автоматическое скачивание моделей и управление версиями
- умное удержание и выгрузка без настройки
- всё включено с первого дня
Оба варианта правильны. Выбор зависит от того, сколько вы хотите контролировать самостоятельно.
Если вы выбираете Ollama, шпаргалка команд Ollama CLI охватывает повседневные команды. Для более широкого сравнения, включающего vLLM, LM Studio и LocalAI, см. как сравниваются разные локальные среды исполнения в 2026 году.
Llama.cpp против llama-swap
llama-swap — это внешний оркестратор, который работает перед одним или несколькими экземплярами llama-server:
- перехватывает запросы и проверяет поле
model - запускает соответствующий процесс
llama-serverдля этой модели - завершает неактивные экземпляры после настраиваемого тайм-аута
- проксирует запрос, когда модель готова
Для практической настройки см. быстрый старт llama-swap.
Ключевое отличие
| Аспект | режим маршрутизатора | llama-swap |
|---|---|---|
| Встроенный | Да | Нет (отдельный бинарник) |
| Зрелость | Экспериментальный | Более стабильный |
| Гибкость | Ограниченная | Высокая |
| Уровень контроля | Внутренний | Внешний прокси |
| Конфигурация на модель | Файл INI | Файл YAML |
| Модель процессов | Один процесс | Один процесс на модель |
Когда использовать llama-swap
llama-swap обеспечивает изоляцию на уровне процессов для каждой модели, что означает, что сбой в одном экземпляре модели не влияет на другие. Он также позволяет каждой модели работать с полностью независимыми флагами llama-server.
Используйте его, если вам нужны:
- лучший контроль жизненного цикла и изоляция
- более умная логика переключения с настраиваемыми тайм-аутами простоя
- более предсказуемая задержка (у каждой модели есть тёплый процесс после первой загрузки)
- стабильность для продакшена сегодня, а не в будущем
Когда встроенного режима маршрутизатора достаточно
Используйте встроенный маршрутизатор, если вам нужны:
- отсутствие внешних зависимостей
- один процесс для управления
- более простое развёртывание (один бинарник, один файл конфигурации)
- минимальный стек для разработки или однопользовательских установок
Финальные мысли
Режим маршрутизатора — значительный шаг вперёд для llama-server.
Он отвечает на давний запрос:
Что такое режим маршрутизатора в сервере llama.cpp
Это недостающий слой, который превращает статичный бинарник в динамическую службу инференса — один процесс, способный обрабатывать запросы для целого каталога моделей.
Но он не завершён.
Сегодня это:
- достаточно мощное для реальных нагрузок
- многообещающее как основа для более сложной маршрутизации
- немного сырое на краях конфигурации и стабильности
Если ваша нагрузка предсказуема и вы можете группировать запросы по моделям, режим маршрутизатора работает хорошо уже сегодня. Если вам нужна надёжность уровня продакшена и изоляция на уровне моделей, выбирайте llama-swap, пока встроенная реализация не достигнет зрелости.
В любом случае вы получаете поведение, похожее на Ollama, без сокрытия механизмов.