博客

9 posts
2026.10.17

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

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

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

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

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

推理引擎 · 投机解码 · 性能12 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.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.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.25

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

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

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