11 月 3 日,微软副总裁 Scott Hanselman 在 X 上说,他 GPU 里动静不小,想做个 GPU Taskman,看清楚显存到底跑到哪去了。仓库就是那天建起来的,到 11 月 9 日上午攒到 1055 星,五个版本的安装包被下载 5314 次,光 Windows 64 位那个就占 4693 次。

他要回答的问题很具体。任务管理器说「已用 15 GB」,那么这 15 GB 里,模型权重占多少、KV cache 占多少、浏览器占多少、桌面合成器占多少。
README 里有个例子最说明问题:同一张 Windows 桌面,旧的计数口径读到 15.3 GiB,换成只算本地显存的口径是 1.4 GiB。差了十倍不止,显存被谁吃了,麻烦出在量法上,工具早就有了。

那一行数字,本来就不是账本
Windows 任务管理器的 GPU 页只给总数,进程那一列能拆到「谁用了多少」,但拆得不干净。跨进程共享的那块表面最麻烦:同一个 Direct3D 表面可能同时挂在应用、csrss.exe 和 dwm.exe 名下,按「专有显存」把各行加起来,等于把同一块内存数了三遍。桌面窗口管理器(dwm.exe)背了最大的那口锅,它统筹所有窗口的合成画面,共享面自然也记在它头上。

gputaskman 的办法是换口径:优先读 Local Usage 和 Non Local Usage,这两项拿不到才退回 Dedicated 和 Shared。适配器总量当基准,进程行相加超过总量时,分类色条按比例归一化,界面上写明「标签是原始值,条是归一化后的」。
顺带说一句 nvidia-smi 为什么帮不上忙。GeForce 卡走 WDDM,显存由 Windows 自己管,NVML 经常把每进程显存报成 N/A;换到 WSL 里,连进程都列不出来。Windows 的 GPU 计数器反倒能跨 Direct3D、Vulkan、OpenGL 和 CUDA 归属,gputaskman 绕不开这条路,原因也在这。
1.31 GB 里,604 MB 是权重
官方那张截图跑在一台 RTX 4080 SUPER 上。16 GB 显存用了 5.01 GB,占得最多的是 dwm.exe 的 2.18 GB,第二名是 llama-server.exe 的 1.31 GB。
点开 llama-server 那一行,账就摊开了:Qwen3-0.6B,Q8_0 量化,752M 参数,28 层。1.31 GB 分成四块,权重 604 MB,KV cache 448 MB,compute buffer 30 MB,CUDA 上下文和 cuBLAS 这些杂项 259 MB。四项加起来,正好对得上那一行的数字。

上下文长度这一项最容易被忽略。截图里那个服务开的是 4096 上下文,KV cache 448 MB;按同一份数据算到 32k,光 KV 就要 3.5 GB。模型没换,显存差出将近八倍。
本地模型服务它也认。Ollama 和 LM Studio 起的服务会显示成能看懂的名字,还能给出上下文长度、占了几个 slot、当下的吞吐。Mac 这边同样有记录:M4 Mac mini 上跑一个 2 GiB buffer 的 PyTorch MPS 任务,界面显示 Python、AI、PyTorch+Metal,3.06 GB,99%。
想留证据也方便。--json 存一份快照,加载模型或者改完 -c 再来一份,diff 一下就知道是哪一块涨了。
估算和实测分开记,这笔账才算得清
它不翻显存内容。做法是把几路证据拼起来:Windows 图形内核给每进程显存和引擎占用,NVML 或 AMD 的接口给设备级遥测。进程里映射的 DLL 说明挂了哪个运行时,映射文件、命令行参数和 GGUF 头算出权重和 KV 的账。
和同类工具最不一样的地方有两点。一是实测和估算分区列,权重、KV 这些算出来的数永远不并进实测总量,哪部分是称出来的、哪部分是估出来的,一眼能看出。二是前后两份快照的 diff 按 PID 先配对,配不上就按进程名加监听端口配,模型重载换了 PID 照样对得上。
这两条放在一起,才看得出估算的偏差有多大。官方在一台 4080 SUPER 上用 gemma-3-270m 试过:-c 从 4096 改到 32768,按 GGUF 算 KV 该涨 504 MB,实测显存只涨了 83 MB。原因是 Gemma 3 用了滑动窗口注意力,估算给的是上限;另一组 spot check 里,Gemma-3-270M 的 KV 估 72 MiB,运行时日志记的是 49.5 MiB。

这就像一台秤配一本菜谱:秤称的是装盘重量,菜谱算的是该放多少克。两本账分开记,才知道是哪一步出了岔子;混在一本上,越算越糊涂。
两条命令就能装,Mac 上还缺几样
Windows 最省事:到 Releases 下整个 zip,解压后保留 _internal 文件夹和 exe 同级,然后在 PowerShell 里跑 .\gputaskman.exe,不用装 Python。装了 uv 或 pipx 的话,也可以 uv tool install gputaskman,之后敲 gputaskman 或者 gtm。
Linux 和 WSL 拿 tar.gz,解压直接运行,要求 glibc 2.35 以上,也就是 Ubuntu 22.04、Debian 12 这个线。NVIDIA 卡直接可用,原生 Linux 上的 AMD 卡走 amdgpu 驱动也行。
Mac(Apple 芯片)麻烦一点,没有便携包,得先 clone 再 uv run gputaskman,Python 要在 3.11 以上。

Mac 上能看到的东西也少一截。GPU 内存和系统内存是同一个池子,没有 VRAM、spill、paged 这几列;温度、功耗、时钟、PCIe 都拿不到。至于别人的进程(WindowServer 除外),显存那一栏显示 n/a,要看全得 sudo。Metal 这边只给每个进程一个总的 GPU 时间,3D、计算、拷贝拆不开。README 的 Next 里,macOS 便携包和 Ollama、MLX 的验证都还排在待办上。
不适合谁也说清楚:Intel 的 Mac 用不上,它走的是 Apple 芯片那套 Metal 客户端接口。纯 NPU 和云端 GPU 不在范围内;想知道是哪个纹理、哪个张量在吃显存,得上 PIX 或 Nsight 那一层。
项目地址:https://github.com/shanselman/gputaskman
安装包:https://github.com/shanselman/gputaskman/releases
PyPI:https://pypi.org/project/gputaskman/
评论区