Перейти к содержанию
Новое AiManual теперь в MAX Подписаться
Публикация AiManual

Promptchain: автоматическое управление загрузкой и выгрузкой LLM на одной GPU

Promptchain — Python-библиотека и MCP-сервер для автоматического переключения между локальными LLM на одной consumer GPU. Политики вытеснения LRU, приоритеты, а

Коротко

Что будет в материале

  1. 01

    Проблема: ручное управление памятью при работе с несколькими LLM

  2. 02

    Что такое Promptchain: единый интерфейс и политики вытеснения

  3. 03

    MCP-сервер Promptchain: интеграция с Claude Desktop, Claude Code и Hermes

  4. 04

    Практическое применение: сценарии и примеры кода

Работа с несколькими локальными LLM на одной видеокарте - постоянный компромисс между производительностью и удобством. Вы запускаете Gemma-4-4B для быстрой генерации текста, затем хотите переключиться на Qwen3-Coder 30B для сложного рефакторинга, но упираетесь в лимит VRAM. Приходится вручную выгружать первую модель, ждать освобождения памяти, загружать вторую - и так каждый раз. Promptchain решает эту проблему через автоматическое управление жизненным циклом моделей с настраиваемыми политиками вытеснения и встроенным MCP-сервером для интеграции с AI-агентами.

Библиотека берёт на себя рутину: отслеживает использование моделей, выгружает неактивные по стратегии LRU, защищает приоритетные модели от случайной выгрузки и позволяет атомарно подменять целые группы моделей одной командой. Разработчик получает единый интерфейс для работы с десятком локальных LLM без скриптов-костылей и ручного мониторинга памяти.

Проблема: ручное управление памятью при работе с несколькими LLM

Типичный сценарий: ML-инженер экспериментирует с тремя моделями на одной consumer GPU с 24 ГБ VRAM. Gemma-4-4B занимает 8 ГБ, Qwen3-Coder 30B в квантовании Int4 - 18 ГБ, а для вспомогательной модели остаётся 6 ГБ. При попытке загрузить четвёртую модель система падает с Out-of-Memory. Решение «в лоб» - написать shell-скрипт, который убивает процесс с предыдущей моделью и запускает новую. Но это ломает все активные сессии и требует ручного перезапуска контекста.

С ростом числа доступных локальных моделей проблема усугубляется. Gemma-4, Qwen3-Coder, DeepSeek-Coder, Llama-4 - каждая хороша под свою задачу, и держать их все в памяти одновременно физически невозможно. Разработчику нужен инструмент, который динамически управляет загрузкой и выгрузкой, не требуя постоянного внимания к цифрам в nvidia-smi.

Что такое Promptchain: единый интерфейс и политики вытеснения

Promptchain - Python-библиотека, предоставляющая слой абстракции над загрузкой и выгрузкой LLM. Вместо прямых вызовов к llama.cpp или vLLM вы работаете через объект Promptchain, который отслеживает состояние всех моделей и принимает решения об освобождении памяти на основе заданных политик. Библиотека не заменяет инференс-движки - она оркестрирует их работу, добавляя интеллектуальное управление ресурсами.

Ключевой механизм - политики вытеснения. Когда свободной VRAM недостаточно для загрузки новой модели, Promptchain автоматически выбирает, какую модель выгрузить, руководствуясь тремя стратегиями: LRU (наименее используемая выгружается первой), приоритеты (модели с высоким приоритетом остаются в памяти), атомарная подмена групп (быстрое переключение между наборами моделей без промежуточных состояний).

Политика LRU: автоматическая выгрузка неиспользуемых моделей

LRU (Least Recently Used) - стратегия по умолчанию. Promptchain отслеживает время последнего обращения к каждой загруженной модели. При нехватке памяти для новой модели библиотека выгружает ту, к которой дольше всего не было запросов. Это работает прозрачно: вы инициируете загрузку Qwen3-Coder 30B, а Promptchain сам определяет, что Gemma-4-4B не использовалась последние 15 минут, и освобождает её VRAM.

Пример с тремя моделями: в памяти находятся Gemma-4-4B (чат), Qwen3-Coder 30B (код) и Llama-4-8B (переводы). Вы активно работаете с чатом и кодом, а переводы запускали час назад. При попытке загрузить DeepSeek-Coder 33B для сложного рефакторинга Promptchain по LRU выгрузит Llama-4-8B, сохранив рабочие модели нетронутыми. Если памяти всё ещё не хватает - выгрузит следующую по времени неиспользования.

Приоритеты: защита критически важных моделей от выгрузки

LRU не различает важность моделей - для неё все равны. Приоритеты решают эту проблему. Вы назначаете модели числовой приоритет, и Promptchain никогда не выгрузит высокоприоритетную модель, пока есть низкоприоритетные кандидаты. Модель с приоритетом 100 останется в памяти даже при простое в несколько часов, если есть что выгрузить с приоритетом 10.

Практический кейс: продакшен-сервер обрабатывает запросы через Gemma-4-4B с приоритетом 100 и параллельно экспериментирует с новыми моделями с приоритетом 10-20. Когда экспериментальная модель запрашивает память, Promptchain выгружает другие низкоприоритетные модели, но никогда не трогает продакшен-инстанс. Это устраняет риск случайно обрушить работающий сервис при тестировании новых LLM.

Атомарная подмена групп: быстрое переключение между сценариями

Разработчики часто работают в режиме контекстных переключений: утром - кодинг с Qwen3-Coder 30B и DeepSeek-Coder 6.7B, днём - анализ данных с Llama-4-8B и Gemma-4-4B. Ручная выгрузка двух моделей и загрузка двух других - четыре операции с ожиданием. Атомарная подмена групп выполняет это одной командой: Promptchain одновременно выгружает все модели из группы «кодинг» и загружает все модели из группы «аналитика».

Механизм гарантирует консистентность: не возникнет ситуации, когда одна модель уже выгружена, а для загрузки новой не хватило памяти из-за того, что вторая ещё занимает VRAM. Promptchain рассчитывает необходимый объём памяти до начала операции и либо выполняет полную подмену, либо сообщает о невозможности - без промежуточных состояний, которые могут привести к OOM.

MCP-сервер Promptchain: интеграция с Claude Desktop, Claude Code и Hermes

Встроенный MCP-сервер (Model Context Protocol) выводит автоматизацию на новый уровень - теперь управлять моделями могут сами AI-агенты. Claude Code, анализируя задачу, определяет, какая LLM подходит для её решения, и через MCP-интерфейс запрашивает загрузку нужной модели. Разработчику не нужно вручную переключать модели - агент делает это сам на основе контекста.

MCP-сервер Promptchain реализует стандартные методы протокола: list_models возвращает доступные модели с их статусом (загружена/выгружена), load_model инициирует загрузку с учётом политик вытеснения, unload_model принудительно выгружает модель. Агенты получают программный контроль над жизненным циклом LLM без необходимости писать обёртки и парсить вывод консоли.

Настройка MCP-сервера для Claude Desktop

Интеграция с Claude Desktop требует добавления Promptchain в конфигурационный файл MCP-клиента. После настройки Claude Desktop получает доступ к управлению моделями через стандартный интерфейс инструментов. Агент может самостоятельно решить, что для задачи генерации кода нужен Qwen3-Coder 30B, загрузить его, выполнить задачу и освободить память для следующих операций.

{
  "mcpServers": {
    "promptchain": {
      "command": "python",
      "args": ["-m", "promptchain.mcp_server"],
      "env": {
        "PROMPTCHAIN_CONFIG": "/path/to/config.yaml"
      }
    }
  }
}

Конфигурационный YAML-файл описывает доступные модели, их расположение, параметры загрузки и политики вытеснения. Promptchain подхватывает этот конфиг при старте MCP-сервера и предоставляет агентам актуальный список моделей с метаданными.

Использование с Claude Code и Hermes

Claude Code, работающий в терминале, получает те же возможности через MCP-протокол. При запуске сложной задачи агент анализирует промпт, определяет оптимальную модель и через Promptchain загружает её. После завершения задачи модель может быть выгружена автоматически по политике LRU или оставлена в памяти для последующих запросов.

Hermes, специализированный агент для управления инструментами, использует Promptchain как один из доступных ресурсов. В мультиагентных сценариях Hermes может координировать загрузку моделей для других агентов, выступая диспетчером GPU-памяти. Это особенно полезно в сценариях, где несколько агентов конкурируют за ограниченные ресурсы одной видеокарты. Опыт перехода между моделями для агентов-кодеров показывает, что правильный выбор роли модели критичен для скорости цикла сборки - Gemma3-31B и Qwen3.6-27B демонстрируют принципиально разную эффективность в ролях кодера и ревьюера.

Практическое применение: сценарии и примеры кода

Promptchain устанавливается через pip и не требует сложной настройки для базовых сценариев. Библиотека работает с популярными инференс-движками, поддерживающими Python API, и абстрагирует детали их вызовов за единым интерфейсом.

Быстрый старт: установка и первое переключение моделей

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

pip install promptchain
from promptchain import PromptChain

# Инициализация с конфигурацией GPU
chain = PromptChain(
    gpu_memory_limit="22GB",
    eviction_policy="lru"
)

# Загрузка первой модели
chain.load("gemma-4-4b", path="/models/gemma-4-4b.Q4_K_M.gguf")
response = chain.generate("gemma-4-4b", "Объясни, что такое квантование")

# Загрузка второй модели - первая выгрузится автоматически при нехватке памяти
chain.load("qwen3-coder-30b", path="/models/qwen3-coder-30b.Q4_K_M.gguf")
code = chain.generate("qwen3-coder-30b", "Напиши Python-скрипт для парсинга JSON")

# Явная выгрузка, когда модель больше не нужна
chain.unload("qwen3-coder-30b")

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

Настройка политик: LRU, приоритеты, атомарная подмена

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

# Загрузка с приоритетом - эта модель не будет выгружена,
# пока есть кандидаты с меньшим приоритетом
chain.load(
    "gemma-4-4b",
    path="/models/gemma-4-4b.Q4_K_M.gguf",
    priority=100
)

# Экспериментальная модель с низким приоритетом
chain.load(
    "experimental-model",
    path="/models/experimental.Q4_K_M.gguf",
    priority=10
)

# Определение группы для атомарной подмены
chain.define_group("coding", ["qwen3-coder-30b", "deepseek-coder-6.7b"])
chain.define_group("analysis", ["llama-4-8b", "gemma-4-4b"])

# Атомарная подмена: выгружается группа coding, загружается analysis
chain.swap_groups(from_group="coding", to_group="analysis")

При работе с большими моделями критично эффективно использовать доступную VRAM. Проблема кэширования запросов к LLM, рассмотренная в анализе Cache-Hunter, показывает, что нестабильные компоненты системного промпта могут приводить к сбросу кэша и неоправданному росту затрат памяти. Promptchain, управляя жизненным циклом моделей централизованно, помогает минимизировать такие потери за счёт сохранения состояния между переключениями.

Ограничения и когда Promptchain не подходит

Promptchain - новый инструмент, и на момент написания статьи для него отсутствуют независимые бенчмарки и детальные сравнения с альтернативами. Разработчикам, принимающим решения на основе цифр, стоит учитывать этот фактор и проводить собственное тестирование под свои сценарии.

Возможные задержки при подмене моделей зависят от скорости загрузки весов с диска в VRAM. Для моделей размером 30+ ГБ в квантованном виде загрузка может занимать десятки секунд даже на быстром NVMe. Атомарная подмена групп не ускоряет физическую загрузку - она гарантирует консистентность, но не сокращает время ожидания. В сценариях, требующих мгновенного переключения, может потребоваться держать модели в памяти постоянно, что возвращает к исходной проблеме нехватки VRAM.

Зависимость от конкретных GPU и драйверов также накладывает ограничения. Promptchain работает поверх существующих инференс-движков и наследует их системные требования. Если llama.cpp или vLLM не поддерживают вашу видеокарту, библиотека не сможет с ней работать. Для устаревших GPU архитектур Kepler, Maxwell и Pascal существуют отдельные патчи, восстанавливающие работу современных фич - например, патч для llama.cpp исправляет крахи MTP на GPU без поддержки BF16.

Сценарии с очень большими моделями, требующими точного контроля над распределением памяти (например, кастомное распределение слоёв между GPU и CPU), остаются за рамками возможностей Promptchain. Библиотека ориентирована на потребительские видеокарты с типичными сценариями переключения между моделями, а не на кластерные конфигурации с многомерным шардированием.

Заключение: Promptchain как инструмент для эффективной работы с LLM

Promptchain убирает рутину управления памятью при работе с несколькими локальными LLM. Политики вытеснения LRU и приоритетов автоматизируют то, что раньше требовало скриптов и постоянного мониторинга. Атомарная подмена групп упрощает контекстные переключения между сценариями работы. MCP-сервер интегрирует управление моделями в экосистему AI-агентов, позволяя Claude Code, Claude Desktop и Hermes самостоятельно выбирать и загружать нужные LLM под задачу.

Для разработчиков, которые ежедневно переключаются между несколькими моделями на одной видеокарте, библиотека предлагает практическое решение реальной проблемы. Производительность современных моделей продолжает расти - GLM-5.2 на 8× GB10 уже показывает 1200 токенов/с prefill и 33-54 токен/с decode, а значит, потребность в эффективной оркестрации нескольких моделей на ограниченном железе будет только увеличиваться. Promptchain закрывает этот класс задач без переусложнения инфраструктуры.

Подписаться на канал