一、推理优化概述
什么是推理优化
推理优化,说白了就是让训练好的模型在「跑起来」的时候更快、更省资源。
我刚开始接触这个领域时,以为模型训练好了就万事大吉。结果第一次部署到线上,发现一个请求要等好几秒才返回——用户早跑了。嗯,那时候我才意识到,推理优化不是锦上添花,而是生死攸关。
推理优化主要做三件事:
- 降低延迟——让每个请求响应更快
- 提升吞吐量——单位时间内处理更多请求
- 减少显存占用——让模型能在更便宜的硬件上跑
你想想看,一个模型训练可能要几天甚至几周,但推理是每时每刻都在发生的。训练慢一点可以接受,推理慢一秒,用户可能就流失了。
为什么需要推理优化
这个问题我问过不少刚入行的朋友,他们的第一反应是:「模型能跑不就行了?」
其实不然。我给大家说几个真实场景:
- 实时对话系统:比如智能客服,用户说一句话,你必须在几百毫秒内回复。慢了,体验就很差。
- 边缘设备部署:手机、摄像头、IoT设备,显存可能只有几百MB。不做优化,大模型根本塞不进去。
- 大规模在线服务:像推荐系统,每秒可能要处理几万个请求。吞吐量上不去,就得加机器,成本飙升。
我在项目中遇到过最典型的一个案例:某推荐模型训练时精度很高,但上线后QPS(每秒查询数)只有预期的三分之一。最后发现是推理时显存频繁申请释放,导致GPU利用率极低。优化后,同样的硬件,吞吐量翻了3倍。
核心观点:训练优化是为了「跑得动」,推理优化是为了「跑得好」。两者缺一不可。
推理优化的核心指标
做推理优化,你得先知道用什么尺子量。我个人习惯关注三个核心指标:
| 指标 | 定义 | 典型目标 | 我的经验 |
|---|---|---|---|
| 延迟 | 单个请求从输入到输出的时间 | <100ms(实时场景) | 延迟优化往往最先做,效果也最明显 |
| 吞吐量 | 单位时间处理的请求数 | 越高越好,受硬件限制 | 吞吐量和延迟有时是矛盾的,需要权衡 |
| 显存占用 | 模型推理时占用的GPU显存 | 尽量小,尤其是边缘设备 | 显存优化常被忽视,但往往是瓶颈 |
小技巧:我建议刚开始做优化时,先盯住一个指标。比如先压延迟,延迟达标了再看吞吐量。别想一口吃成胖子。
推理与训练的区别
很多人以为训练和推理差不多,其实差别大了去了。我列个对比表:
| 维度 | 训练 | 推理 |
|---|---|---|
| 目标 | 让模型收敛,降低损失 | 快速、稳定地输出结果 |
| 精度要求 | 高精度(FP32为主) | 可接受精度损失(INT8/FP16) |
| 批量大小 | 大batch(充分利用GPU) | 小batch甚至单条(低延迟要求) |
| 显存需求 | 需要存梯度、优化器状态 | 只需存模型参数和中间激活 |
| 优化方向 | 加速收敛、防止过拟合 | 降低延迟、提升吞吐、减少显存 |
为什么会这样?我解释一下:
训练时,你需要反向传播计算梯度,所以必须保留中间结果。推理时只需要前向传播,很多中间结果算完就可以扔掉。这就是为什么推理显存通常比训练小很多。
另外,训练可以用FP32甚至更高精度,因为梯度计算对精度敏感。推理时,模型参数已经固定了,用INT8量化往往也能保持不错的精度,但速度能快好几倍。
避坑指南:我曾经犯过一个错误——直接把训练时的batch size用在推理上。结果延迟高得离谱。后来才明白,推理时batch size要小,甚至为1,才能保证低延迟。
知识体系总览
下面这张图是我自己整理的推理优化知识体系,方便大家建立全局视角:
这张图展示了推理优化的核心脉络:从三个关键指标出发,通过量化、剪枝、算子融合等方法,最终适配到不同的部署场景。后面的章节,我们会逐一深入每个技术点。
一句话总结:推理优化就是「在精度可接受的范围内,把延迟打下去、吞吐提上来、显存降下去」。这是每个做模型部署的工程师都必须掌握的技能。