09
性能优化与问题排查
Performance & Debugging
Rust 已经够快了,但 AI 推理的性能无底洞——模型大小、量化等级、批处理、KV Cache,每个都是数量级的差距。这一章把常用手段和排查思路讲清楚。
推理性能优化四板斧
模型量化 → Q4_K_M
FP16 → Q4_K_M,内存降 4 倍,速度更快(带宽瓶颈)。
这是性价比最高的优化,没有之一。
连续批处理 → continuous batching
不等所有请求凑齐,来一个插一个,跑完的替换。吞吐量翻几倍。
vLLM 的核心创新,candle 也支持。
KV Cache 复用 → prefix caching
系统提示词部分所有请求共享,不重复算。
长 system prompt 场景省 30%+。
GPU 加速 → CUDA / Metal
candle 开 cuda feature,tch 用 CUDA build。
大模型 CPU 跑不动,GPU 是必需品。
后端性能优化
- Release profile:
opt-level=3+lto=true+codegen-units=1。 - 连接池:数据库连接复用,别每次新建。
- 缓存:热点数据放 Redis,别每次查库。
- 异步并发:IO 密集用 tokio,CPU 密集用 rayon。
- 减少 clone:字符串和结构体少 clone,用引用和 Arc。
常见问题排查
| 问题 | 排查思路 |
|---|---|
| 编译错误:trait bound 不满足 | 读编译器给的 help,把缺失的 trait 加到 derive 或 where 子句。 |
| 编译错误:生命周期错误 | 99% 是 spawn 出去的 future 不满足 'static,把数据 clone 或 move 进去。 |
| 运行时 panic | 设置 RUST_BACKTRACE=1 跑一次,看栈回溯。 |
| 推理慢 | 先看有没有开 CUDA,再看量化等级,再看 batch size。 |
| 显存不足 | 降量化等级(Q4→Q3),减小 max_seq_len,或者换 CPU。 |
| 输出乱码 | 检查 tokenizer 和模型是否匹配,chat template 是否正确。 |
内存优化
- 减小结构体:用
repr(C)控制布局,用更小的整数类型(u8 代替 u64 能用就用)。 - 对象复用:热路径上别反复 new Vec,用
Vec::clear()复用缓冲区。 - 减少 clone:Rust 的 clone 是深拷贝,热路径上用引用或 Arc。
- 弱引用:缓存里用
Weak防止循环引用导致内存泄漏。
记
本章小结
① 推理优化四板斧:量化、连续批处理、KV Cache、GPU。
② 后端优化:Release profile + 连接池 + 缓存 + 减少 clone。
③ 排查心法:RUST_BACKTRACE=1 看栈,criterion 做基准,flamegraph 找瓶颈。