博客

21 posts
2026.10.25

8 条请求截断 7 条,我差点判了模型死刑:给本地模型做选型,哪几次其实是在测我自己?

同一天给两个本地 Qwen 模型做选型,我下了四次结论,三次测的是我自己:漏了一个启动参数让思维链灌进正文,只修了一边就去对照,自己出的 8 道题里有 3 道是坏题,想开思考的请求参数被服务端静默覆盖。这篇给三个不读源码就能用的判据:答案占比、坏题率对分差、两组配置逐字节相同。

llm · inference · vLLM17 min 阅读
2026.10.24

同一个社区修复版聊天模板,一台机器上修好了,另一台一个都没修到:错误出在哪一层,不读源码能判断吗?

两台机器跑同一个 Qwen 系列模型,都有约 3.3% 的请求在工具调用续轮时报错。我把社区重写的聊天模板换上第一台,19 种参数形状从挂 7 个变成挂 0 个;换到第二台的隔离副本上,坏请求照样 500,而且只用了 3 毫秒。这篇讲怎么用失败耗时判断错误发生在哪一层,怎么把 341 次报错还原成 39 个坏会话,以及 README 里那个「快 80%」为什么不能信。

llm · inference · llama.cpp14 min 阅读
2026.10.23

三张卡的 GPU 利用率都卡在 33%,瓶颈到底在哪?我排了三轮,结论倒了两个半

三张 64GB 卡跑一个 320B 的 MoE,24 tok/s,nvidia-smi 上三张卡都是 33%。我当晚排除了「轮流干活」和「带宽打满」,判定瓶颈在跨卡链路,证据是一条在并发 4 和 8 都停在 49 tok/s 的封顶曲线。两个月后重读原始数据:那条封顶线是服务器默认的 4 个槽位画出来的,我用来排除「轮流干活」的那组数字,恰好是轮流干活最直接的证据。这篇给两个除法和一个乘法,拿来读懂多卡推理的利用率和并发曲线。

llm · inference · multi-gpu15 min 阅读
2026.10.20

三个剪枝版在同一批题上一起塌方,我判是原版本身不行:为什么官方接口跑一遍就把结论翻了回来?

三个剪过专家的 DeepSeek-V4-Flash 在我的题库上都只有 7.3 分左右,它们答错的题高度重合,我据此推翻自己,判定是原版底子差。后来直接调官方接口跑同一套题:9.21,全场最高。这篇讲那个重合度统计为什么在这个问题上没有分辨力,怎么在跑统计之前就看出来,以及剪枝仓库自带的那张跑分表该怎么读。

llm · moe · pruning17 min 阅读
2026.10.16

README 说快 1000 倍,我的机器上测出 0.07 倍到 26 倍:换一个 tokenizer 到底能快多少?

一个新出的高速 tokenizer 宣传比 HuggingFace 快约 1000 倍。我在一台 6 核的 Ryzen 上跑了六种负载,倍数从 0.07 到 26.33 不等。这篇拆开 README 自己的表,说明这种倍数主要由分母决定,再给一个除法,算你的文本量要多大,换 tokenizer 省下的时间才够一次模型调用。

LLM · benchmarking · 性能11 min 阅读
2026.10.14

并发上限从拍脑袋的 16 改成实测的 28,延迟降了 14.5%:为什么我最后把这个上限整个删了?

我给并发控制器顺手写了个 per_backend = 8,在它上面盖了一整天楼,四套优化方案全瞄准只占 13.7% 的那一段。换成实测值后端到端从 20.47 秒降到 17.50 秒,接着我发现任何取值的上限都只有两种状态:卡人,或者永远碰不到。这篇给三个除法,外加一个识破「利用率才 41%」的判据。

LLM · 推理 · 并发15 min 阅读
2026.10.13

别人说三张卡跑不起来,我算出是显存不够:为什么两个配置崩在同一行,反而说明跟显存无关?

一个社区仓库说 DeepSeek-V4-Flash 在三张 64GB 卡上加载就崩,只有四张能跑。我按显存账推出「提高显存比例就行」,两天后读源码发现那个参数在加载阶段根本不生效。他测的两档比例差 3.2 GiB,崩在同一行,这本来就是资源无关的证据,我读反了。真凶是一个环境变量,它比那条「三卡不行」的结论晚 22 小时才进仓库。

GPU · LLM · 推理17 min 阅读
2026.10.12

缓存从 4GiB 加到 6GiB,账上还能多命中 8 到 10 个点:为什么它只活了 61 分钟?

一台 16GB 内存的游戏本跑本地模型,把 llama.cpp 的 prompt cache 从 1GiB 扩到 4GiB 之后,45K token 以上的长请求中位等待从 47 秒降到 3.4 秒。我按复用距离算出再加到 6GiB 还能多命中 8 到 10 个百分点,结果不到 50 分钟它就被容器内存上限杀了一次,61 分钟时又被我自己的护栏回滚。账没算错,漏的是一个加法:容器上限要装下缓存,还要装下缓存之外那 2.1GiB。

llm · llama.cpp · 缓存13 min 阅读
2026.10.11

模型卡写着 1M 上下文,纸面账算出 64GB 装得下:为什么我的 Mac 喂到 256K 就被拦下了?

一个 118B 的 MoE 模型,KV 缓存压成 4-bit 之后,按公式 1M token 只要 13.3 GB,加上权重 62.6 GB,比我这台 64GB 的 M1 Max 还少 6 GB。实测 128K 通过,256K 被我自己设的内存看门狗掐掉。拆下来,每多读一个 token,峰值内存至少涨 39.4 KB,是压缩公式的 3.1 倍。这篇给三个能自己算的式子:KV 每 token 体积、用两档实测推出可用上限、用三档实测推出长上下文的出字速度,以及一份「这个模型到底能吃多长」的检查顺序。

llm · 长上下文 · 内存16 min 阅读
2026.10.03

同一套配置跑两遍,60 局差了 0.26 回合:改一句提示词之后,要跑多少局才知道它真有用?

让一个 35B 本地模型玩小丑牌,每次改提示词都看平均打到第几回合。先把什么都不改的配置跑两遍,量出噪声,再去判断改动。一句「小丑栏空着就先买小丑」让平均回合从 6.58 和 6.32 涨到 9.12,配对 36:7;但同样这 60 局,要是只看前 20 局,结论会是「没用」。这篇给两条能自己算的账:60 局能看出多大的改进,想看出 +1 回合要跑多少局;以及为什么「什么都不改跑两遍」量出来的噪声只是下限。

LLM · 评测 · 游戏16 min 阅读
2026.10.02

直接报坐标对 186 次,先识别再选对 188 次,合起来对 190 次:让本地模型点屏幕,到底该走哪条路?

让一个 35B 本地模型在没有无障碍树的窗口里点按钮。两条路各有长短:直接报坐标快 6 倍但略不准,先识别再选准一点但每步 3 秒。拼成组合路由后 200 次真点击对 190 次,可这多出来的 2 次在统计上什么都证明不了。更值钱的发现是:两条路「意见一致」远没有看起来那么可靠,它们的错误是绑在一起的。三条能自己算的账:两路错误是否独立、混合路由的平均延迟、零错误到底说明多少。

LLM · Agent · 评测16 min 阅读
2026.10.01

改一个字,同一个模型从 59 分到 72 分:我那三局 AI 打游戏的对比,到底在比什么?

让一个 35B 本地模型玩《王权:三国》,三局实战比「思考 / 不思考 / 随机」,结果分不开。改做 360 道离线题之后才发现,四项数值里有一项的名字被我起错了,模型一直在按错的含义推理。改对一个字,同一套题从 59.2% 到 72.1%。这篇给三条能自己算的账:错误能拆到哪一项、题库的天花板在哪、实战要多少局才分得出高下。

LLM · 评测 · 游戏15 min 阅读
2026.09.26

一次模型调用等于 340 万次 Python 循环,你还在优化哪一行?

我在自己机器上把 Jeff Dean 那张 2007 年的延迟数字表重测了一遍,又补了一张毫秒级的新表:本地模型最短往返 79 毫秒,Python 循环一圈 23 纳秒。用这张表一算,砍 5000 token 的 prompt 省下的时间还不到一次调用。这篇给两个除法,外加一个识破「每 token 预填充多少微秒」这类数字的办法。

性能 · 方法论 · LLM15 min 阅读
2026.09.18

全量上下文 5241 token,压缩版 2270——为什么记性反而是压缩版更好?

同一批角色、同一个决策点,把一生的记忆全喂进去,模型的行为只被埋点影响 38 次;压缩到 43% 的体积,反而 49 次。我把这个结论写下来的时候漏了一个对照臂,补上之后发现三分之二的功劳记错了人。这篇给出那个能自己算的除法,以及我四轮判据里前三轮是怎么骗我的。

llm · evaluation · memory15 min 阅读
2026.09.17

同一张卡,8bit 比 4bit 单流快 10%——为什么我最后选了慢的那个?

四天前我在这张卡上测完一个 27B 稠密模型,结论是官方 8bit 全面领先。换成 35B 的 MoE 再测,方向整个反了:8bit 单流仍然快,但一上并发就全线输,因为它的权重多占了 11 GiB,换走了 60 万 token 的上下文空间。这篇给出那个换算的除法,和一条判断「这个量化结论能不能外推」的判据。

llm · quantization · moe13 min 阅读