DSH Hub

xiaoxiao150/vram-switcher

dsh-vram-switcher

BundleWorkflow22 GitHub stars· updated 2026-10-26

GPU coordination for local AI companions on AstrBot / DeepSeek Harness: persona LLM, IndexTTS voice and ComfyUI selfies take turns on one 12 GB card. No proxy.

Install

npx @deepseek-ai/dsh plugin --profile web add github:xiaoxiao150/vram-switcher

Restart `dsh web` after install. Bundle APIs can change during the developer preview.

README badge

dsh-vram-switcher DSH Hub badge
[![DSH Hub](https://dshhub.dev/badge/vram-switcher.svg)](https://dshhub.dev/plugins/vram-switcher)

Paste this into your README. The star count updates with every catalog sync.

From the README

Excerpt from xiaoxiao150/vram-switcher, cleaned of badges and images.

VRAM Switcher

English · Releases · IndexTTS 集成 · GPU 兼容性 · 和 llama-swap / berth 的区别

为本地 AI 情感陪伴(AstrBot / DeepSeek Harness)原生接入的 GPU 调度器 —— 让人设对话、IndexTTS 语音和自拍/改图在同一张 12 GB 卡上轮流用卡。

它不是通用 GPU 租约系统:不换客户端、不加代理、不读 nvidia-smi,只在宿主的事件边界上停/起你明确列出的进程。

在 12 GB 卡上,它把本地 LLM、IndexTTS 和 ComfyUI 从「互相换页」变成「轮流独占」——实测 s2mel 从 30 s/步回到 0.12 s/步,预填从 0.2 tok/s 回到 ~1300 tok/s。

LLM 常驻,显存 4.9 GB / 12 GB
        │
        ├── "/aimg 一只猫" ──► 停 LLM ──► 起 ComfyUI ──► 出图 ──► 等队列跑空
        │                              (腾出 ~6 GB)             停 ComfyUI
        │                                                        拉起 LLM
        └── 语音请求 ──────► 停 LLM ──► 确保 TTS 在线 ──► 合成 ──► 拉起 LLM

它只负责这些「停/起」的顺序。不是模型、不是路由、也不是要你重写的启动器:所有机器相关的参数都在一个 JSON profile 里。

为什么需要它

12 GB 卡上通常是这样:

服务常驻显存
llama-server(Qwen3.6-35B-A3B MoE,256K 上下文)~4.9 GB
IndexTTS webui~2.3–5.3 GB
ComfyUI + SD/Flux~6–7 GB
桌面 + 宿主程序~2 GB

前三个里任意两个加桌面就会溢出。Windows 不会当场报错,而是开始把显存换页到内存——这不会崩,只会慢 100 倍。在写下它的那台机器上实测:s2mel 扩散从 0.12 s/步 变成 30 s/步,一张图跑了 543 秒,预填从 ~1300 tok/s 掉到 0.2 tok/s。进程一直是活的。

这套东西最初就是给一个本地 AI 陪伴机器人写的:她要有人设连续性(本地 LLM)、要能发语音(IndexTTS)、要能自拍和改图(ComfyUI),而且这些经常发生在同一个回合里。通用 GPU 调度器不知道一段语音什么时候真正合成完;对陪伴场景,那个边界恰恰是最重要的。

解法不是换更大的卡,而是确保关键时刻只有一个在占显存。

它做什么

  • 任务前停掉不需要的、拉起需要的,结束后再放回去。
  • 真的等就绪:ComfyUI 必须 8188 在 listen,而不是进程刚起(早 1 秒连接曾让每次自拍都失败);一批图会先等 /queue 跑空再停服务。
  • 只动你列出的东西:进程名 + 命令行过滤 + 可选端口白名单,没有“杀掉所有 python.exe”这条路。
  • 跨进程串行:AstrBot 插件和 DSH 插件共用 coordinator.lock,语音事件和生图任务不会同时切服务。
  • 一套核心,两个宿主:AstrBot(Python 插件)与 DeepSeek Harness(原生 Cordis 插件 + 小 Python daemon)。另带 MCP stdio 服务,可给 Claude Desktop / Codex 用。

适合谁

显存协调已经不缺项目:llama-swap 6.1k★,berth 2026-10-11 才公开、已 200★,vhotseat、OneGPU4All 也在做类似的事。这个项目不假装是通用调度器,它只解决一个具体问题:

你在 AstrBot 或 DSH 上跑一个本地 AI 陪伴:人设对话(本地 LLM)+ IndexTTS 语音 + 自拍/改图(ComfyUI),全在同一张 12 GB 卡上。

一次回合里可能同时发生:

用户消息
  ├─ 她回复文字(LLM 占卡)
  ├─ 回复带 [语音] → 停 LLM → IndexTTS 合成 → 恢复 LLM
  └─ 调 generate_selfie → 停 LLM/TTS → ComfyUI 出图 → 恢复 LLM
你的情况更合适的选择
只是 llama.cpp / vLLM 换模型,所有客户端都能改 base URLllama-swap
要通用 GPU 租约、优先级、游戏/VM/多卡仲裁berth(alpha,Windows 实验性)
Linux 上 LLM ↔ ComfyUI 轮流vhotseat
在 AstrBot / DSH 上跑本地 AI 陪伴,不想改端口、不加代理,语音合成结束才切本项目

相对通用调度器,它多做这些:

  • AstrBot 的 5 个事件钩子:LLM 请求、回复装饰前后、工具调用前、工具返回后
  • DSH 原生 Cordis 工具:vram_status / vram_acquire / vram_release
  • IndexTTS 的 tts_busy.flag / tts_ready.flag 协议(合成边界,不是 HTTP 边界)
  • 真实进程停启:TTS 没有 unload API 也能让出显存

也少做这些:多卡、游戏/VM、优先级队列、网关、nvidia-smi 轮询、provider 自动切换。需要这些就选上面的通用项目。

不跑 AstrBot / DSH 也可以:核心包 vram_switcher 不依赖宿主,VramService 提供 start / acquire / release / status,可以直接在你的 AI 陪伴服务里用:

from vram_switcher import load_config
from vram_switcher.service import VramService

cfg = load_config({"profile_path": "profile.local.json"}, plugin_dir=".", data_dir="./data")
service = VramService(cfg)
await service.start()
await service.acquire("image", reason="selfie")   # 停 LLM、起 ComfyUI
# ... 出图 ...
await service.release("selfie")                   # 停 ComfyUI、恢复 LLM

…

Related plugins