12G 本地推理生产线 ③ 显存调优深水区:expert cache auto 怎么算的(146 experts 事故)
同一配置 4 次启动 4 个结果——expert cache auto 的真实机制、vram-reserve 1500→1728、nvidia-smi 零检查纪律

12G 本地推理生产线 ③ 显存调优深水区:expert cache auto 怎么算的(146 experts 事故)
事故现场:同一配置,四个结果
131K + reserve 1728 的同一份配置,四小时内启动四次:
| 启动 | 当时 VRAM 状态 | expert cache | 后果 |
|---|---|---|---|
| ① 干净 | 空闲 ~9.9G | 1045 / 2.02G(1500 版) | 正常 |
| ② 15:31 脏 | 忘关合计 ~10G 的占显存程序 + 旧实例未释放 | 146 / 0.28G | 命中 20–22%、速度 32.6/35.1,“看起来能用但全乱了” |
| ③ 脏 | 桌面占用倒推 ~5G | 0 slots,引擎拒启 | EngineDied: the engine exited |
| ④ 16:56 干净 | 基线 2,367 MiB | 955 / 1.84G | 39–43 t/s,一切正常 |
如果只看 ②,结论会是"1728 把缓存砍残了,回滚 512"。看全四行,结论是配置无罪,环境脏了——同一份配置,健康值就在 955–1045 之间。这是本系列最贵的一课:单次脏环境数据点,不得作为配置回滚依据。
expert cache auto 的真实机制
三个反直觉点(读引擎源码 + 实测定的):
1. --expert-cache N 在 native pack 下是字节预算,不是槽位上限。 引擎按 expert profile 的热度排序装专家,装到 N × 最大 blob 预算满为止。给 1400 预算,实际装 1805 slots——它是"预算"不是"上限",估缓存大小时别按槽位想。
2. verify arena 与 draft head 从 --vram-reserve-mib 预留池里分配(引擎 #496 代码原文:“what is allocated after the cache - the prompt path’s own part, the verify buffers, the draft head - comes out of the reserve”)。后果:预留开太小(如 300),预留池被 verify 74 + draft head 86 掏空后只剩几 MiB,serve check 直接 LOW,投机解码的验证路径死掉。引擎注释里点名过这个结局:“a 300 MiB reserve: 5 MiB left”。
3. 启动瞬间的可用 VRAM 决定 auto 结果。 干净卡上 12G − 桌面基线 − 会话 KV − 预留池 ≈ 专家缓存预算;脏卡上这项直接塌方(案例 ②:1.03G free − 1728 预留 − 86 head < 326 slots 下限 827 MiB → 0 slots 拒启)。
vram-reserve:1500 → 1728 的来龙去脉
131K 版首战,14K 大请求后引擎打 #2065 警告:
WARNING: only 292 MiB of VRAM free at the start of this request (below 512 MiB)
... decode falls to a few tok/s and a window may never finish含义:128K 窗口 + 长会话下 VRAM 空闲底 292M,低于 512M 安全线;卡太满时驱动可能把 GPU 内存页到系统内存,解码崩到个位数 tok/s、窗口可能永不结束。处置 = --vram-reserve-mib 提到引擎建议值 1728。代价可量化:expert cache 缩 ≈90 experts(1045→955),干净环境速度差 <3%(39–43 vs 40–42 t/s),收益 = #2065 消除。这是"稳定换一点点速度"的净赚单。
事后曾建议"必要时回滚 512"——那是基于脏环境 1.03G free 的错误假设,干净重启后 1728 本身即健康,512 建议撤回。512 只属于纯测速场景。
nvidia-smi 零检查:事故换来的启动纪律
这张卡的干净基线(15:59 快照,逐进程):
gnome-shell 587M · Hermes 573M · Chromium(430M+4M) · nautilus 139M
ptyxis 71M · resources 73M · 其他 ≈ 2,367M 合计纪律(排障 SOP 化):
- 每次重启引擎前
nvidia-smi:4070 空闲 ≥ 11G = 干净;明显高于 2.4G 基线 = 有残留 - 关掉所有占 GPU 的进程;停旧引擎后等几秒(VRAM 释放有延迟,过早重启会误判)
- expert cache 数量大幅偏离预期(955 档 → 146 档)→ 第一假设是环境脏,不是配置错
- 干净环境下仍不达标,才谈改参数
本篇结论
- 显存账 = 会话 KV + 预留池(verify + draft head + 余量)+ 专家缓存(auto 吃剩下的)
- 健康值区间要在干净环境标定(本机 = 955–1045 experts),脏数据只用于定位环境,不用于改配置
- 预留 1728 是本机"稳定"档;512 是"测速"档,两个数字不要混用
下一篇:32K 墙是怎么死的,128K 又是怎么稳的。
梦行志