🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

显存管家 xmdxzy/dsh-gpu-governor

DeepSeek Harness
xmdxzy9 天前有提交已提供中文文档扫描:含敏感能力

按项目看清显存占用,安全暂停或结束进程

30.7/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/26 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add xmdxzy/dsh-gpu-governor
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:需留意
是什么[目录]—
dsh 原生插件 · other
暂无时间戳·判据 →
装得上吗[实装验证]!
实装验证未通过(runtime_never_loaded),装前请到仓库确认最近更新与 issue
L4 · 真实安装等级说明 →
数据截至 2026/10/27·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/04·判据 →
还在维护吗[仓库]✓
活跃:最近一次提交在 9 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
⚠︎ 实装验证未通过(runtime_never_loaded · 2026/10/27) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 14 处,展示前 14 条)
  • 执行外部命令来自配置/变量
    lib/index.js:206
    child = spawn(
  • 发起网络请求
    lib/index.js:792
    request = http.get(url, { timeout: timeoutMs }, (response) => {
  • 读取本地文件
    lib/index.js:1046
    const text = await readFile(path.join(installDir, "extra_model_paths.yaml"), "utf8");
  • 读取本地文件
    lib/index.js:1083
    const info = await stat(candidate);
  • 读取本地文件
    lib/index.js:1306
    const text = await readFile(STATE_FILE, "utf8");
  • 写入本地文件
    lib/index.js:1322
    await mkdir(STATE_DIR, { recursive: true });
  • 写入本地文件
    lib/index.js:1324
    await writeFile(temporary, `${JSON.stringify(state, null, 2)}\n`, "utf8");
  • 写入本地文件
    lib/index.js:1325
    await rename(temporary, STATE_FILE);
  • 写入本地文件
    lib/index.js:1330
    await mkdir(STATE_DIR, { recursive: true });
  • 读取本地文件
    lib/index.js:1332
    const info = await stat(AUDIT_FILE);
  • 写入本地文件
    lib/index.js:1333
    if (info.size > AUDIT_MAX_BYTES) await rename(AUDIT_FILE, `${AUDIT_FILE}.1`);
  • 写入本地文件
    lib/index.js:1337
    await appendFile(AUDIT_FILE, `${JSON.stringify(entry)}\n`, "utf8");
  • 执行外部命令来自配置/变量
    lib/index.js:1585
    child = spawn(
  • 执行外部命令固定命令
    lib/index.js:1625
    child = spawn("taskkill", ["/F", "/T", "/PID", String(pid)], { windowsHide: true, stdio: ["ignore", "pipe", "pipe"] });
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

依赖的 DSH / Cordis 模块
@deepseek-ai/dsh-typert-protocol
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

DSH 的 GPU 治理插件:按进程统计显存占用并归入项目,提供带预算的前 5 榜单,以及带保护措施的挂起、恢复、终止控制

README

由 DeepSeek 最新模型翻译生成
GPU Governor GPU Governor 面板 AI 任务一多,显存就成了公共资源。ComfyUI、推理服务、游戏,还有几个忘了关的旧进程一起分,谁也说不清自己还剩多少。Windows 自带的工具不告诉你谁在占,nvidia-smi 在 WDDM 驱动下那张表的 per-process 显存一列永远显示 [N/A],只剩一个总数。想知道「刚才那 20G 是谁吃掉的」,只能自己去翻驱动暴露的性能计数器。 这个插件在 DSH 输入框左边挂一个小徽标,点开就是上面这块浮层:谁在吃显存、吃了多少、还能不能再开一个任务、要不要让某个项目先让一让。 不点开的时候它就是个 ● GPU 38% 17.3G/24.0G 的细条,圆点按占用分三档变色(品牌色、黄、红并缓慢呼吸)。 面板上每一块是什么 居中的大圆环是整卡显存占用率,旁边 5.3G / 24G 是绝对量。 底下那行 可分配 17G(保留 2.0G) 比百分比实用得多。它不是「剩余 18.7G」,而是先扣掉你设定的保留区。跑训练的都清楚,显存被别的进程临时啃一口,整个任务就 OOM 了,留一块缓冲比卡着满额分配稳。 四个小胶囊依次是利用率、温度、功率、当前进程数。这几个数只帮你判断卡是闲着还是被压满,不参与排名。 再往下是最近十分钟的显存曲线。
展开完整文档(README 剩余 1 节)
GPU Governor

GPU Governor 面板

AI 任务一多,显存就成了公共资源。ComfyUI、推理服务、游戏,还有几个忘了关的旧进程一起分,谁也说不清自己还剩多少。Windows 自带的工具不告诉你谁在占,nvidia-smi 在 WDDM 驱动下那张表的 per-process 显存一列永远显示 [N/A],只剩一个总数。想知道「刚才那 20G 是谁吃掉的」,只能自己去翻驱动暴露的性能计数器。

这个插件在 DSH 输入框左边挂一个小徽标,点开就是上面这块浮层:谁在吃显存、吃了多少、还能不能再开一个任务、要不要让某个项目先让一让。

不点开的时候它就是个 ● GPU 38% 17.3G/24.0G 的细条,圆点按占用分三档变色(品牌色、黄、红并缓慢呼吸)。

面板上每一块是什么

居中的大圆环是整卡显存占用率,旁边 5.3G / 24G 是绝对量。

底下那行 可分配 17G(保留 2.0G) 比百分比实用得多。它不是「剩余 18.7G」,而是先扣掉你设定的保留区。跑训练的都清楚,显存被别的进程临时啃一口,整个任务就 OOM 了,留一块缓冲比卡着满额分配稳。

四个小胶囊依次是利用率、温度、功率、当前进程数。这几个数只帮你判断卡是闲着还是被压满,不参与排名。

再往下是最近十分钟的显存曲线。宿主进程活着时由它保留;宿主重启过的话面板会从当下重新累积,所以刚打开那阵子可能是空的。

然后是这块面板的核心,显存占用 TOP 5。

每一项是一个项目,不是 PID。这点很关键。你同时开着五个 python.exe,按 PID 列出来根本对不上号;按项目聚合之后,是 ComfyUI 还是 SanguoBattlePerf 一眼就能认出来。

每行右侧那个小标签说明名字是怎么来的:

- 工作区:落在某个 DSH 工作区里
- 路径:从命令行里的脚本路径推出来的
- 软件:装在 Program Files 或 AppData\Local\Programs 下的应用
- 系统:Windows 系统目录

再往右是占用的显存和占整卡的百分比。进度条按整卡宽度画,所以「它吃了半张卡」不用心算,扫一眼就有数。

点开一行,展开的是这个项目下的所有进程:PID、各自显存、完整命令行(鼠标悬浮显示)。行内的控制按钮作用在整个项目上,成员逐个执行。

展开全部 (16) 放出前 5 名之外的其余项目。截图里剩下那 11 个加起来才 0.8G,平时不用管,偶尔能揪出某个忘了关的东西。

底部 保留 (MiB) 就是前面说的保留区,默认 2048,改完点保存写进 state.json,重启后仍然生效。

最底下那行小字,「结束才释放显存;暂停只冻结计算」,是这插件最容易被误解的地方,下面单独讲。

三个动作的区别

这个必须先说清楚,不然容易误操作。

| 动作 | 显存 | 计算 | 底层实现 |
| 暂停 | 不释放,仍然占着 | 冻结,把 SM 时间让出来 | NtSuspendProcess |
| 恢复 | 不变 | 解冻,继续跑 | NtResumeProcess |
| 结束 | 真正释放 | 进程终止 | taskkill /F /T,连子进程一起 |

也就是说「暂停」腾不出显存,它只是把那个进程钉住,不再抢算力。想让显存回来,只有结束这一条路。

结束要连点两次,第一次按钮会变成「确认终止」,四秒内有效。防的就是手滑把跑了半天的训练任务杀掉。

暂停和恢复用的是 NT 原生 API,不是 PowerShell 那套 Suspend-Job,后者管不到别人的进程。

几个硬性闸门写在 act 里,不指望界面自觉:

- 只能操作当前快照里出现过的 GPU 进程,页面开久了也点不到别的东西
- PID 小于等于 8 的一律拒绝
- Harness 自己的进程和它的父进程也拒绝
- 每个动作无论成败都往 audit.jsonl 追一行,超过 512KB 轮转

暂停和结束他人进程需要 DSH 以管理员身份运行。权限不够时会显示 access denied: run DSH elevated,不会静默失败。

实测过(不是推断):在受控探针里起一个占 183 MiB 的 CUDA 进程并持续写心跳文件,对项目执行 suspend,心跳冻结在 39 字节整整 2.2 秒不动;resume 之后继续长到 48 字节。

项目名是怎么猜出来的

一条命令行里能提取路径的地方有好几处,证据强弱不一样,所以先分三桶,再按顺序套规则。

最硬的是 script 桶,命令行里正在执行的那个脚本或工程文件,比如 D:\AI\ComfyUI\main.py、SanguoBattlePerf.uproject。这是「此刻真正在跑的东西」。

其次 binary 桶,解释器或可执行文件本身,比如 ...\Python311\python.exe。它只能说明用了什么软件,说明不了在跑哪个项目。

最弱的是 arg 桶,参数里带的目录,比如 --user-data-dir=...\Roaming\@deepseek-ai。

然后按这个顺序匹配,谁先命中算谁:

1. 落在某个 DSH 工作区里,标 工作区
2. ...\Desktop\<项目>,标 桌面
3. AI / Projects / UEProjects / models / code / work / src 这类具名容器下的子目录
4. AppData\Local\Programs\<应用> 或 Program Files\<厂商>\<产品>
5. 盘符首级目录,比如 D:\<项目>
6. 可执行文件所在目录名
7. C:\Windows 这类系统树

几个实际例子:

- python.exe D:\AI\ComfyUI-H3\main.py → ComfyUI-H3,不是「Python」
- UnrealEditor-Cmd.exe D:\UEProjects\...\SanguoBattlePerf.uproject → SanguoBattlePerf
- DeepSeek Harness.exe --user-data-dir=...\Roaming\@deepseek-ai\dsh-desktop → DeepSeek Harness,不是「@deepseek-ai」

同一条命令行里有多条路径时会按上面的顺序竞争,第一个命中的决定名字。

数据从哪来,为什么这么快

Windows WDDM 下 nvidia-smi 拿不到每进程显存,只能退到驱动暴露的 WMI 性能计数器:
- 每进程显存:Win32_PerfFormattedData_GPUPerformanceCounters_GPUProcessMemory 的 DedicatedUsage
- 每进程 GPU 利用率:Win32_PerfFormattedData_GPUPerformanceCounters_GPUEngine 的 UtilizationPercentage
- 整卡显存、温度、功率:nvidia-smi --query-gpu=...

三条路都在同一台机器、同一时刻实测过:

| 方案 | 单次采样耗时 | 结论 |
| Get-Counter | 6–14 秒 | 每轮重新枚举实例并阻塞采样,太慢,放弃 |
| typeperf | 1.6–3.4 秒 | 每次起进程再加一秒费率窗口,放弃 |
| WMI 性能类 | 显存 25ms / 引擎 330ms | 采用 |

所以采集器做成一个常驻的 PowerShell 子进程(lib/collector.ps1),每轮吐一行 JSON,父进程挂掉它自己退出。引擎类指标每个周期只刷一次,它对延迟不敏感;进程名表缓存 15 轮,遇到新 PID 单独补查。默认四秒一轮,实测每轮 140–750ms。截图底部那个 采样 28ms / 4s 就是当轮的真实耗时。

装到 DSH 上

插件按普通 profile 行的方式挂载,改配置热加载,不随客户端升级丢失。

在 ~/.dsh/profiles/desktop/cordis.patch.yml 里加这一块:

- insert:
- id: gpu-governor
name: "file:///C:/Users/<you>/.dsh/plugins/dsh-gpu-governor/lib/index.js"
config:
intervalMs: 4000

路径换成插件实际所在位置。想卸载就把这块删掉。

热加载有边界,这几条是实测出来的:

- 改 lib/client.js(浏览器那一半),刷新页面就生效
- 改 lib/index.js 或两个 .ps1(宿主那一半),必须重启桌面客户端;只改 patch 只会重载浏览器半,宿主插件不会重新 apply
- 本 profile 上 plugin_manager 重启不了这个条目,会抛 dsh-tui: root.events.emit is unavailable from a plugin activation,那是别的插件卸载期留下的报错

嫌手动重启麻烦,仓库里有个 restart-dsh.ps1:停客户端、清掉遗留的采集器、重启、等新 host 进程出现并列出它监听的端口,最后把采集器实例数写进 restart-check.log。先加 -DryRun 可以只看它打算动什么,不真动。

运行时文件落在:

- ~/.dsh/gpu-governor/state.json:预算和保留余量
- ~/.dsh/gpu-governor/audit.jsonl:每个管控动作一行

边界

- 只按显存排名,利用率仅作参考列。这是故意的,显存才是 OOM 的元凶。
- 「峰值」是宿主进程这一轮生命周期内的高水位,不是历史数据库,重启归零。
- 趋势窗口是宿主保留的最近 200 个采样(四秒一轮大约 13 分钟),前端再抽稀到 120 点绘制。
- 只展示 gpu[0]。多卡机器上其余卡的数据采得到,但面板没画。
- 同一个 exe 的多个实例,如果命令行里没有路径差异,会被合并成一个项目。这是预期行为。
- 采集器第一次启动要 0.9–10 秒才出第一行(WMI 类首次加载),这段时间面板显示骨架屏。
- 两次快照之间退出的进程,那一行会变成禁用的 alive: false。
- 项目级动作逐个成员串行执行,成员多的时候要占几百毫秒,因为每个成员都要起一次 PowerShell 进程。
- 预算是软配额,只做提示和可视化,不拦进程启动,也不自动杀进程。自动杀掉一个跑了六小时的训练,代价远大于省下来的那点显存。
预览分享卡片长什么样 ↓xmdxzy/dsh-gpu-governor
分享 · DeepSeek Harness Hub
xmdxzy/dsh-gpu-governor

按项目看清显存占用,安全暂停或结束进程

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部