AI Pulse

80美元P100经内核优化,llama.cpp解码从7-15升至50-60tps

大家好!我一直很兴奋能在这里分享这个项目。这是一个针对 Tesla P100 系列显卡(约 80 美元)的内核优化项目。先说明一下背景:我今年 17 岁,没有正式学位。这个项目里有很多工作是靠 AI 完成的——我理解其中一部分,但并不是所有细节都吃透了。

硬件与测试环境

先交代测试环境,这一点很重要,因为你的实际性能会直接受以下因素影响:

- 我的两张 GPU 被限制在 175W/250W,所以这些数字可能还有往上推的空间。
- 我遇到了轻微的热节流(thermal throttling),温度稳定在 79°C——这肯定会影响数字。上述数值是在 GPU 运行到较热状态时测得的;如果你的散热条件好,prefill 和 decode 预计还能再提升 5-10%。
- 我使用的是 PCIe 3.0,两个 x16 插槽。
- 另外,文中所提到的 decode 数字,是对一批任务(涵盖创意写作和编码)的回答取平均得到的。

性能提升亮点

与原版 llama.cpp 相比,优化后的效果如下:

- Decode 速度:空上下文(0 context)时从 7-15 tps 提升到 50-60 tps;260k 上下文时从 2-4 tps 提升到 30-35 tps。
- Prefill 速度:空上下文时从 220 tps 提升到 350 tps;260k 上下文时从约 40 tps(凭记忆,当时实在太难稳定测量,没怎么记录)提升到 110 tps。
- 修复了 FP16 运算错误:通过混合 FP16/FP32 数学运算,消除了舍入误差。
- 合并至 9 月 22 日的代码版本,已支持 Qwen 3.8 flash 架构。

参数配置与注意事项

这套配置对命令行参数比较敏感,例如:

-c 262144 -b 32768 -ub 1024 -np 1

注意:如果没有 -b 32768,MTP(Multi-Token Prediction,多 token 预测)会过载,在上下文满深度时接受率会跌到接近 0。设置环境时请务必记住这一点。

回归测试与资源链接

另外,我非常重视回归测试。数学运算必须更精确,或者输出与原始实现字节级一致,否则测试就会失败。构建方法、参数说明、数学证明以及你需要的其他材料,都在下面的链接里:

- GitHub 仓库:https://github.com/Kmic-68/llama.cpp/tree/p100-optimizations
- 构建细节、数学证明等文档:https://github.com/Kmic-68/llama.cpp/tree/p100-optimizations/p100-docs

祝大家玩得开心!我很期待你们的反馈,也欢迎提交 pull request。

社区反馈

Reddit 讨论区的一些有价值的回应:

- u/trowawayLOL1:结果很好。如果想做第二个改进项目追求更高性能,可以考虑脱离 Llama 和 GGUF 格式,把改动移植到其他后端,性能提升会更大。

- u/Kmic68(作者):纯编码测试时我跑出了持续 70 tps,但觉得那不能反映大家的真实使用场景,所以没写进标题。

- u/Not-Enough-Llamas:实测确认 decode(空上下文 + MTP 开启)约 46-48 tps,双 P100 配置,其中一张还跑在 PCIe 2.0 x4 插槽上,两张均限制在 125W,跑 Qwen3.8-27B_UD6。我还没来得及试你给的 -b 和 -ub 参数——那是我还在研究的方向,后面会做对比。但考虑到我的功耗限制、参数非最优、以及一个 PCIe 插槽严重受限,你的数据完全说得通。相比原版 llama.cpp 这是巨大的提升,而且它能正常构建、稳定运行不崩溃——不像 shinbunbun 的 P100 补丁集,至少我的体验是这样。从一个 IT 职业生涯几乎是年龄两倍的人的角度说:bravo,干得漂亮。

- u/macifom:作为同为双 P100 的用户,非常感谢你做的这个工作。我之前用上游 llama.cpp 时得手动去掉 FP16 fast path,甚至开始觉得要升级更好的硬件才能获得良好性能和激进量化(比如 Qwen 3.8 Flash Next)所需的精度余量。这种 fp16 运算 + fp32 累加的做法确实非常巧妙。冒昧问一句,你有打算长期维护这个 fork 吗?虽然做成上游 PR 会是很大的工程,但如果能和社区的人一起推动,价值会非常大。

- u/OkFly3388:这里的 prefill 就是个笑话。(这条评论被踩较多,属于批评性意见。)

阅读原文
📚 相关主题 开源工程

订阅 AI Pulse

每天 08:00 · 12:30 · 18:30 · 23:50 更新