Перестаньте перезагружать сервер. Включайте модели на лету
Запускаете одну модель в llama.cpp? Отлично. Пытаетесь переключиться на другую? Приготовьтесь к ритуалу: остановить сервер, убить процесс, подождать, пока память очистится, загрузить новую модель, снова запустить сервер. Знакомо? Разработчики llama.cpp наконец-то услышали ваши стоны и выпустили Router Mode. Это не просто фича - это смена парадигмы.
Что умеет Router Mode? Всё, что вы хотели, но боялись спросить
Представьте себе диспетчерскую. Вместо одного поезда на одном пути у вас есть депо с локомотивами разных моделей. Диспетчер (роутер) смотрит на запрос и говорит: "Этому пассажиру нужен экспресс, а этому - грузовой состав". Именно так работает Router Mode.
| Что делает | Как это выглядит на практике |
|---|---|
| Динамическая загрузка моделей | Отправляете запрос с именем модели - сервер загружает её, если ещё не загружена |
| LRU вытеснение | Если память заканчивается - роутер выгружает наименее используемые модели |
| OpenAI-совместимый API | Работает с любыми клиентами, которые умеют в OpenAI API (а их большинство) |
| Мультипроцессная архитектура | Каждая модель живёт в отдельном процессе. Упала одна - остальные работают |
Звучит здорово? Это потому что так и есть. Но есть нюансы, о которых стоит знать до того, как вы броситесь переписывать все свои скрипты.
Запускаем роутер: от теории к практике за 5 минут
1Собираем или качаем
Если у вас уже стоит llama.cpp - обновите репозиторий и пересоберите. Если нет - скачайте свежий билд с поддержкой Router Mode. Не пытайтесь использовать версии старше октября 2024 - там этого просто нет.
Проверьте флаги компиляции. Убедитесь, что собрали с поддержкой сервера. Если собираете с нуля - не забудьте про -DLLAMA_BUILD_SERVER=ON.
2Готовим модели
Router Mode работает только с GGUF. Не пытайтесь запихнуть туда оригинальные веса PyTorch или Safetensors - не выйдет. Конвертируйте всё в GGUF или качайте готовые. Положите модели в удобную директорию. Например, ~/models/. Запомните путь.
3Запускаем сервер
Вот самая важная команда. Запускаете сервер в режиме роутера с указанием пути к моделям:
./server --host 0.0.0.0 --port 8080 --router --model-path ~/models/ --n-gpu-layers 99
Что здесь важно? Флаг --router включает собственно режим роутера. --model-path указывает, где искать модели. Остальные флаги - как в обычном сервере. Хотите ограничить память? Добавьте --parallel 4 --ctx-size 4096. Настроили? Сервер запущен. Теперь самое интересное.
Как отправить запрос и не сломать всё
OpenAI-совместимый API - это здорово. Но как указать, какую модель использовать? Всё просто - через поле "model" в запросе. Только имя модели должно совпадать с именем файла (без расширения .gguf).
Допустим, у вас в папке ~/models/ лежат файлы llama-3.2-3b.Q4_K_M.gguf и mistral-7b-v0.3.Q5_K_M.gguf. Хотите запросить что-то у Mistral? Отправляете POST на /v1/completions с таким телом:
{
"model": "mistral-7b-v0.3.Q5_K_M",
"prompt": "Объясни, как работает Router Mode в llama.cpp",
"max_tokens": 500
}
Сервер видит, что модели mistral-7b-v0.3.Q5_K_M нет в памяти. Загружает её. Обрабатывает запрос. Возвращает ответ. Всё прозрачно. Хотите переключиться на Llama? Просто поменяйте поле "model" на "llama-3.2-3b.Q4_K_M". Никаких перезагрузок. Никаких танцев с бубном.
Имена моделей чувствительны к регистру! Mistral-7B-v0.3.Q5_K_M и mistral-7b-v0.3.q5_k_m - это разные модели для роутера. Используйте точное имя файла.
А что с альтернативами? Есть же LM Studio и Ollama
Сравнивать Router Mode с другими инструментами - это как сравнивать швейцарский нож с кухонным комбайном. У каждого свои задачи.
| Инструмент | Плюсы | Минусы | Кому подходит |
|---|---|---|---|
| llama.cpp Router Mode | Минимальные требования, полный контроль, мультипроцессность, LRU-кеш | Только GGUF, нет GUI, нужно знать командную строку | Разработчикам, энтузиастам, тем, кто хочет максимальной гибкости |
| LM Studio | Красивый интерфейс, простой запуск, встроенный чат | Тяжелее, меньше контроля, проприетарные элементы | Тем, кто хочет работать с моделями без кодинга |
| Ollama | Простая установка, свой формат моделей, активное сообщество | Свой API (не полностью OpenAI-совместимый), меньше моделей | Начинающим, тем, кто ценит простоту |
Router Mode в llama.cpp - это инструмент для тех, кому нужен контроль. Нужно запустить сервер на старой машине с 8 ГБ ОЗУ и переключаться между тремя моделями? Llama.cpp справится. Хотите интегрировать его в свою систему через OpenAI API? Без проблем. Нужно, чтобы сервер работал неделями без перезагрузки? Router Mode именно для этого и создан.
Под капотом: как роутер не превращает вашу память в швейцарский сыр
Мультипроцессная архитектура - вот что отличает Router Mode от простой загрузки моделей в одном процессе. Каждая модель живёт в отдельном процессе. Зачем? Представьте, что одна модель "упала" с ошибкой. В обычном сервере это означало бы крах всего приложения. В Router Mode упадёт только один процесс. Остальные модели продолжат работать. Главный процесс (роутер) перезапустит упавший воркер.
LRU-кеширование (Least Recently Used) - вторая важная фича. У вас 32 ГБ ОЗУ, а модели по 8-10 ГБ каждая. Загрузите четыре - память закончится. Router Mode следит за использованием: если нужно загрузить новую модель, а память заполнена, он выгружает ту, к которой дольше всего не обращались. Не самую большую. Не самую старую. Ту, которую забыли. Это умно.
Кому действительно нужен Router Mode? (Спойлер: не всем)
Если вы запускаете одну модель и меняете её раз в неделю - Router Mode вам, скорее всего, не нужен. Простой сервер справится. Но есть сценарии, где без роутера просто не обойтись.
- Мультитенантные приложения: Вы разрабатываете SaaS, где разные пользователи хотят разные модели. Один - кодогенерацию, другой - творческое письмо, третий - анализ данных. Router Mode позволяет обслуживать всех без перезагрузок.
- Тестирование и сравнение моделей: Нужно прогнать один и тот же промпт через пять разных моделей и сравнить результаты? Загружайте, тестируйте, выгружайте. Вручную это заняло бы часы.
- Ресурсо-ограниченные среды: Мало памяти, но нужно много моделей? LRU-кеширование позволяет хранить в памяти только то, что используется прямо сейчас. Остальное - на диске.
- Интеграции с агентскими фреймворками: Современные AI-агенты часто переключаются между специализированными моделями. NVIDIA NeMo Agent Toolkit или LangChain могут отправлять запросы к разным моделям в зависимости от задачи. Router Mode делает это прозрачным.
А вот если вам нужна простота и красивый интерфейс - посмотрите на LM Studio. Если хотите что-то совсем простое - Ollama. Router Mode - для тех, кто готов копаться в настройках ради контроля и гибкости.
Чего не хватает? (Разработчики, если читаете - вот список пожеланий)
Router Mode - отличный шаг вперёд. Но идеальных инструментов не бывает. Вот что хотелось бы видеть в будущем.
- Приоритизация моделей: Сейчас LRU вытесняет наименее используемые. Но что если мне нужно, чтобы одна модель всегда оставалась в памяти, даже если к ней не обращались час? Нет такой настройки.
- Предзагрузка: Хочу указать, какие модели загрузить при старте сервера. Сейчас всё загружается по требованию, что создаёт задержку при первом запросе.
- Мониторинг: Как узнать, какие модели сейчас в памяти, сколько памяти каждая занимает, сколько запросов обработала? Придётся писать свои скрипты.
- Более гибкое кеширование: LRU - хорошо, но иногда нужны другие стратегии. Например, вытеснение самых больших моделей или моделей, которые дольше всего грузились.
Несмотря на это, Router Mode уже сейчас - самый мощный способ управлять несколькими моделями в llama.cpp. Если вы до сих пор перезагружаете сервер - остановитесь. Попробуйте роутер. Однажды настроив, вы забудете о проблемах с переключением моделей. Серьёзно.
Router Mode активно развивается. Следите за обновлениями в репозитории llama.cpp. Новые фичи появляются почти каждый месяц.
А если вы хотите пойти ещё дальше и распределить вычисления между несколькими машинами, посмотрите на llama.cpp RPC-server. Вместе с Router Mode это даёт невероятную гибкость. Но это уже тема для отдельной статьи.