博客

63 posts
2026.10.26

同一个配置连跑六次,吞吐在 366 到 561 之间乱跳:想看出 5% 的改进,该多跑几次,还是换一把尺子?

三张卡跑一个大模型,我想知道加第四张能快多少,拿别人的四卡数字一比,得出 0.90 倍,当场编了一个「流水线变长抵消算力」的机制。后来发现这台机器被功耗墙锁着,同一个配置连跑六次,吞吐在 366 和 561 之间跳,变异系数 15%。这篇给一个除法,开跑之前就能算出你的尺子能看出多大的差;再讲我怎么换成一个不随时钟变的读数,以及这把新尺子读数最高的那一格,恰好是最差的那个配置。

推理 · benchmark · 投机解码18 min 阅读
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.22

两个权重文件一个字节都不差,我拿错的那个跑完了整批实验:修好之后,为什么反而多跑偏了 3 个镜头?

一个能在本地跑的视频模型有两个检查点,文件大小都是 20,970,379,616 字节,张量形状零差异,只有 md5 不一样。我的脚本装错了一整批实验,修好重测,第一次测不出差别,第二次发现「错的」那个反而更好。这篇讲两件事:一个对照实验在开跑前就能算出「注定测不出」的乘法,以及别人贴 A/B 结果时你该先问的三句话。

视频生成 · 实验设计 · 对照实验18 min 阅读
2026.10.21

同一张表读出 2.58 倍,换上之后我自己用着却觉得没区别:投机解码的加速比,到底该看哪一格?

同一张并发扫描表,读 64 并发那格得出「不换」,读 8 并发那格得出「快 2.58 倍」。换上之后,我在自己的聊天客户端里看到的散文速度是 38 tok/s,直连同一个服务是 74.1。数据一个都没错,错在我从哪一格读、以及测到哪一层为止。这篇给一个算「整轮到底快了多少」的式子,一个拆模型卡加速数字的除法,和一份读加速比之前要先问的清单。

推理 · 投机解码 · benchmark18 min 阅读
2026.10.20

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

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

llm · moe · pruning17 min 阅读
2026.10.18

评测说 LLM 分拣消息准确率 90.9%,放回真实流量却输给了「什么都不做」:那两天我到底在测什么?

我想让 AI 助手自动判断每条消息该交给哪个正在进行的任务,攒了 3 万多个评测点,LLM 跑出 90.9%。一句话点破之后重切数据:83.7% 的评测点在实际使用里根本没有选择可做。按真实比例重测,不加门控的 LLM 82.3%,「永远继续当前」83.8%。这篇给三条能自己算的式子:白拿分有多少、自动化一次改错要几次改对来补、稀有类检测每天会烦你几次。

AI Agent · 评测 · 方法论21 min 阅读
2026.10.17

采了三次样内存纹丝不动,我判了「没泄漏」:五周后它从 1.6GB 涨到 22GB,那五分钟我漏看了什么?

一台 64GB 的 M1 Max 内存爆掉重启,我采三次样、看斜率为零,判定是开太多东西而不是泄漏。五周后再查,一个文本向量服务三天半里几乎直线涨了 20GB,另一个语音转文字服务停在 58GB 不动。这篇算一笔账:读数分辨率除以斜率,就是你至少要盯多久;再讲 MLX 默认把缓存上限设成接近整机内存,两个进程加起来,账面上能把内存开到 1.9 倍。

macOS · Apple Silicon · MLX14 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.15

du 说 681G,df 说 795G,docker 说能省 74.6GB:清一块快满的盘,到底该信哪个数?

同一块 1T 的盘,四个工具给了四个互相打架的数。我拿今天的复测把它们挨个对了一遍:普通用户的 du 漏掉 113G,uv 缓存 61.8G 里只有 18G 删了会真的变成空位,一个 17.3G 的 SQLite 实际数据 26MB,docker 报的可回收量比它自己的上限还大。四个除法,外加一个八月那次我解释错了的 34G。

Linux · 磁盘 · 方法论13 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.10

同一台机器、同样 8 条请求并发,我测出过 72、171、359、606 四个吞吐:哪个才是它的真实速度?

我给三张矿卡跑的大模型预先立了一条线:并发吞吐放大不到 3 倍就重新评估这套方案。第一次测出 2.84 倍,差点就判了死刑。后来发现那个数量的主要是请求什么时候停下来,跟算力关系不大。同一台机器同样 8 路,换 prompt 长度、换停止方式、换内容,聚合吞吐能从 72 跳到 606。这篇给一个能自己算的墙钟拆分公式,把这四个数逐个对上账,再给几条拆别人并发跑分的判据。

推理 · benchmark · 方法论15 min 阅读
2026.10.09

猜中率 100% 也只有 0.97 倍:我给自研推理引擎加了投机解码,为什么越猜越慢?

在 M1 Max 上给自己写的推理引擎接投机解码,输出逐位一致,速度却从 92.0 掉到 65.26 tok/s。同一台机器上另一个引擎猜中率只有 0.38,跑到 133.4。这篇给一个除法,动手之前就能算出投机解码在你的引擎上是赚是亏;再给三条判据,用来拆只报接受率的跑分。

推理引擎 · 投机解码 · 性能12 min 阅读
2026.10.08

攒了 6950 条经验,93.5% 一次都没被读过:AI 助手的记忆库,该补检索还是该砍写入?

我给 AI 助手搭了个经验库,每晚让模型从当天对话里蒸馏「下次该怎么做」,四个月攒到 6950 条。翻了 962 次检索记录,只有 451 条被捞出来过;前 1% 的条目吃掉了 47% 的命中;模型给每条自打的置信度,跟会不会被用上的相关系数是 -0.002。我本来准备照论文补一个「用了就计数」的反馈回路,算完一个除法就撤了。这篇给三条能自己算的式子:读写比、需要的检索次数、丢了数据时的命中率上界。

AI Agent · 记忆系统 · 方法论14 min 阅读
2026.10.07

冷进程跑 979,连续跑只剩 850:我说跟对手「基本打平」,为什么其实落后 15%?

我在 M1 Max 上写的推理引擎,4096 token 预填充冷启动 979 tok/s,对手 984,我当晚说了句「基本打平」。一小时后发现对手那个 984 是连续跑出来的,它歇一下再单发是 1017–1053;而我连续跑会掉到 850 左右。拆下来是整机约 60W 的功耗墙:我的程序在内存那一路多花 5.6W,GPU 就少分 5.5W,频率被压低 9%。这篇讲一条能自己算的换算(热态 ≈ 冷态 × 频率比)、怎么识别一个跑分是冷是热,以及为什么切段省字节没用、删掉重复读才有用。

推理引擎 · 性能 · 方法论15 min 阅读
2026.10.06

断路器跳了 80 次,看板一直显示「运行中」:我写的自愈脚本,到底在救谁?

四个 AI worker 一夜启动 1652 次,每次活 60 秒,看板上始终是「运行中」。我当时的诊断是失败计数卡在 10 到 12、够不到 20,断路器没触发。两天后翻事件表才发现:断路器跳了 80 次,每次都被我自己的续命脚本在一分半内复位。这篇讲怎么从一个计数器快照反推出它被复位过几次、为什么这种死循环会和定时任务锁相、以及一个静默退出的续命脚本为什么和一个健康的续命脚本长得一模一样。

AI Agent · 可靠性 · 方法论13 min 阅读
2026.10.05

落后 llama.cpp 12%,四个 agent 调了 8 小时只涨 0.66%:两个引擎的差距,到底落在哪个算子上?

我自己写的推理引擎在 M1 Max 上预填充 830.6 tok/s,llama.cpp 是 927.9。四个 AI agent 盯着 MoE 调了 8 小时,涨了 0.66%。停下来花一晚上逐算子对账,发现 MoE 恰好是我比它快的那一块,差距全在 dense 投影和转置上。照着账再跑 8 小时,涨了 9.9%。这篇讲怎么在两个引擎之间做逐算子对账:一个补发差分、一个覆盖率除法、一个按字节判断是不是卡带宽,以及单算子跑分为什么会把 MoE 少算 60%。

推理引擎 · 性能 · 方法论16 min 阅读
2026.10.04

推理引擎升一个小版本,prefill 从 804 掉到 279:不看源码,怎么判断它慢在哪?

两个月没复测的一把尺子,重测一晚上,排名全换了:同一台 M1 Max 上最快的预填充变成了 llama.cpp 的 928,而我一直当标尺的那个引擎,新版只剩 281。二分到 0.2.3 → 0.2.4 这一步,decode 几乎没动,prefill 掉到三分之一。这篇给一个两点拟合的除法,用四种 prompt 长度把「固定开销变大」和「每个 token 变贵」分开,再拆几个跑分里常见的坑:TTFT 换算的吞吐只是下限、投机解码的速度看你喂什么文本、关掉组件耗时却不变的消融开关。

推理引擎 · 性能 · 方法论15 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.30

五个 agent 对一个 agent,各跑 8 小时,114 比 104:多出来的四个到底买到了什么?

同一道推理引擎优化题、同一个外部裁判、同一个模型,一组开五个 agent 在黑板上协作,一组只开一个。结果多 agent 赢了 10%,但两组的前两步是各自独立撞上的同一招,差距全来自一个单干没走到的方向;真正的天花板是那个串行排队的裁判。这篇给两条能自己算的账(评估器容量、每涨一点的 token 价),再拆一则「10 个 agent 发现新算法」的新闻。

多 agent · 推理引擎 · 评测19 min 阅读
2026.09.28

它答对了氢和氦,得分是 0:给模型接上联网搜索,到底涨了几分?

我给一个本地大模型强制接上联网搜索,同一批 70 道事实题,报告写的是从 5.93 涨到 7.67。后来逐题读答案才发现,7 道答对的题被判分器扣掉了 47 分,原因是它改用英文回答了。改判后真实涨幅是 2.41,我自己写的「延迟贵 3 倍」也是拿两种口径算出来的。这篇给三个能自己算的式子,和一份评估「加检索涨了多少」的检查顺序。

模型评测 · 检索增强 · 方法论16 min 阅读
2026.09.27

批量从 2 开到 16,吞吐只从 65.7 涨到 67.4:批处理到底在省什么?

我让自研推理引擎一次同时解 16 条序列,16 条输出和各自单跑逐位一致,聚合吞吐却是一条平线;同一台机器上 MLX 翻了一倍。两个月前我还用一本字节账论证这条路是死路,后来实测把账本三条全推翻:批处理的收益主要来自把 B=1 时闲着的带宽喂饱,省下的字节是次要的。这篇给一个两项相乘的公式,用来在动手前估批处理能拿多少,以及三条拆别人批处理数字的判据。

推理引擎 · 性能 · 方法论15 min 阅读
2026.09.26

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

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

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

一个 kernel 快了 67 倍,整条推理能快多少?

我在自己的 M1 Max 上把一个开源的注意力 kernel 跑通了,对着我自研引擎里的旧实现快 67.87 倍。一个除法算下来,整条预填充只能快 5.5%;七个已知 kernel 全变成零耗时,也只有 1.69 倍。剩下 59% 的时间不属于任何 kernel,属于发射次数。这篇给三个除法,用来判断一个「快 X 倍」到底能不能落到你的端到端上。

推理引擎 · 性能 · 方法论15 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 阅读