Streamlit 앱에서 모델 스와핑 코어를 분리하여 Python 라이브러리 및 MCP 서버로 구현: LM Studio, Ollama
요약
LM Studio, Ollama 등 다양한 로컬 LLM 백엔드 간의 VRAM 관리를 통합하는 Python 라이브러리 'promptchain'을 소개합니다. 모델 스와핑 로직을 독립된 라이브러리와 MCP 서버로 구현하여 에이전트가 직접 GPU 자원을 제어할 수 있게 합니다.
핵심 포인트
- 다양한 로컬 백엔드(LM Studio, Ollama 등)를 위한 통합 VRAM 제어 기능 제공
- 우선순위 및 LRU 기반의 명시적인 모델 상주(Residency) 관리
- MCP 서버 구현을 통해 Claude Code 등 에이전트가 직접 모델 로드/언로드 가능
- 선제적 로딩(Preload) 및 원자적 로드/언로드 기능 지원
얼마 전, 저는 작은 로컬 drafter를 더 큰 coder에 연결하는 Streamlit 앱을 이곳에 공유한 적이 있습니다. 이를 구축하면서 가장 유용했던 부분은 사실 모델 스와핑 (model swaps)을 처리하는 백엔드 로직이라는 것을 깨달았습니다. 이것이 저의 특정 불편함을 해결해 주었기에, 이를 독립된 라이브러리와 MCP 서버로 분리했습니다: promptchain (MIT 라이선스, alpha v0.1). 이 라이브러리가 해결하는 문제: LM Studio, Ollama, llama-swap과 같은 백엔드들은 모두 각자의 자동 방출 (automatic eviction)을 처리하지만, 서로 통신하지는 않습니다. 여러 백엔드에 걸쳐 작업을 수행할 경우, VRAM을 명시적으로 제어할 수 있는 통합 클라이언트를 제공하는 것이 아무것도 없습니다.
pip install promptchain
작동 방식은 다음과 같습니다:
python
from promptchain import ModelManager, Endpoint
mgr = ModelManager(policy="auto", max_resident=1, idle_unload=300)
mgr.register("drafter", Endpoint("lmstudio", "gemma-4-4b"))
mgr.register("coder", Endpoint("ollama", "qwen3-coder:30b"), priority=10)
with mgr.use("coder") as m:
# 필요 시 drafter를 먼저 방출합니다
for tok in m.stream(user_message="write fizzbuzz in rust"):
print(tok, end="")
코드는 주의해서 사용하십시오.
기본 서버 동작 이상의 기능:
- 명시적 VRAM 제어: 모델 수 또는 VRAM 예산에 따라 상주 (residency)를 제한합니다. 우선순위가 가장 낮은 모델을 먼저 방출하고, 그 다음 LRU (Least Recently Used) 방식으로 전환합니다.
- 선제적 로딩 (Proactive loading): 모델을 고정 (pin, 절대 방출 안 함)하거나, 백그라운드에서 다음 모델을 사전 로드 (preload)하거나, 원자적 언로드/로드 (atomic unloads/loads)를 수행할 수 있습니다.
- 통합 API: 로컬 및 클라우드 백엔드 전반에 걸쳐 하나의 stream() 인터페이스를 제공합니다 (클라우드 모델은 VRAM 계산을 건너뜁니다).
- 편의 기능 (Quality of Life): <think> 태그를 자동으로 제거하고, Hermes 도구 호출 (tool calls)을 파싱하며, 서버가 실제로 보고하는 상태(/api/ps 등)와 상태를 자동으로 일치시킵니다.
가장 좋은 부분: MCP 서버
Hermes Agent, Claude Code 또는 모든 MCP 클라이언트에 연결하면, 에이전트가 여러분의 GPU 상태를 확인(ps)하고, 모델을 로드/언로드/교체하며, 평범한 언어로 모델을 통해 생성할 수 있습니다. "drafter를 언로드하고 qwen3-coder를 로드해줘"와 같이 말이죠. 모델은 자동으로 생성되는 endpoints.toml 파일에 저장됩니다. 일단 연결되면, 여러분의 AI 에이전트가 말 그대로 여러분의 GPU를 관리할 수 있게 됩니다.
여러분은 Claude에게 "drafter를 언로드(Unload)하고 qwen3-coder를 실행해줘"라고 말할 수 있으며, 그러면 서버를 통해 스왑(swap)이 처리됩니다. 아직 초기 단계이므로 여러분의 피드백을 기다립니다. MCP 서버가 어떤 다른 도구들을 노출해야 할까요? 저장소(Repo), 예제 및 설정 가이드: github.com/atharva557/Prompt-Chaining PyPi 라이브러리: https://pypi.org/project/promptchain/ /u/atharva557 님이 r/LocalLLaMA에 제출함 [link] [comments]
AI 자동 생성 콘텐츠
본 콘텐츠는 r/OpenAI Codex (search)의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기