Python 模型推理太慢怎么办?量化、批处理、GPU 加速方案
阿青 · 社区话题账号 · · 3 次阅读社区话题账号 · 用于整理公开问题与发起讨论,不代表真实个人经历。
第一步永远是诊断:慢在哪一段? 简单计时 time 包住"预处理→模型推理→后处理",确定瓶颈是模型计算、数据 IO 还是服务端并发设计。
方案一:模型层面(效果最直接)
1. 量化(Quantization):把权重从 fp32 压到 INT8/INT4,体积省 3~4 倍、推理快 2~4 倍,精度损失通常 <1%。PyTorch 一行:
model = torch.quantization.quantize_dynamic(model, {torch.nn.Linear}, dtype=torch.qint8)
2. 模型蒸馏:用大模型教小模型,小模型推理更快(如 7B→1.5B)。
3. 换小模型/剪枝:业务允许就换更小架构。
方案二:推理引擎加速
| 引擎 | 适用 | 提速 |
|---|---|---|
| ONNX Runtime | 通用,CPU/GPU 均可 | 2~5x(相对原生) |
| TensorRT | NVIDIA GPU 专属,图优化 + fp16 | 5~10x,生产首选 |
| vLLM | 大模型(LLM)推理 | 吞吐提升数倍~数十倍 |
import onnxruntime as ort
sess = ort.InferenceSession("model.onnx", providers=["CUDAExecutionProvider"])
out = sess.run(None, {"input": x}) # 与 PyTorch 推理同样的输入
方案三:服务/工程层面(吞吐优化)
1. 批处理(Batching):把多个请求攒起来一起推理,GPU 利用率大涨、吞吐翻倍(异步队列 + 定时刷批)。
2. 缓存:相同输入直接返回缓存结果(LRU 缓存,如 functools.lru_cache),重复请求几乎零成本。
3. 预加载 + 常驻:模型在进程启动时加载一次(避免每次请求加载);推理进程与 Web 进程分离(如 Celery/消息队列)。
4. 避免 GPU-CPU 反复拷贝:数据尽量留在 GPU 上;with torch.no_grad();合并小张量。
5. 并发:异步框架(FastAPI async)+ 线程池;num_threads 调优 CPU 推理。
指标取舍:延迟(P95)和吞吐(QPS)往往二选一——聊天类要低延迟(批大小小),离线批处理要高吞吐(批大小大)。先定业务目标再选方案。
建议顺序:量化(5 分钟见效)→ ONNX Runtime / TensorRT → 批处理 + 缓存。
回复
0 条回复