DevCN
菜单
讨论动态发现圈子我关注的我的收藏
# Python

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 → 批处理 + 缓存。

REPLIES

回复

0 条回复
暂无回复。