3、AI模型推理基础:模型推理流程(前向传播)、计算图与算子、推理引擎概览
好,咱们今天聊聊推理的基础。很多人一上来就调引擎、搞优化,结果模型跑起来各种问题。我个人的习惯是,先把底层的流程摸清楚。说白了,推理就是让训练好的模型“动起来”,对新的数据做预测。这个过程,我们叫它前向传播。
3.1 模型推理流程:前向传播
你想想看,训练的时候,模型在学参数。推理的时候,参数已经固定了。我们只需要把输入数据喂进去,让它一层一层算下去,最后吐出结果。
这个过程其实很直观。拿一个简单的图像分类模型举例:
- 输入预处理:图片进来,先缩放到模型要求的尺寸,比如224x224。然后做归一化,把像素值从0-255映射到0-1之间。这一步我见过很多人踩坑,预处理方式和训练时不一致,结果推理结果完全不对。
- 逐层计算:数据进入第一层卷积,做卷积运算,加上偏置,经过激活函数(比如ReLU)。然后池化、再卷积、再激活... 一层一层往下走。
- 输出后处理:最后经过全连接层和Softmax,得到每个类别的概率。我们取概率最大的那个作为预测结果。
嗯,这里要注意。前向传播的每一步,其实都是在执行一个算子。卷积是一个算子,ReLU是一个算子,矩阵乘法也是一个算子。整个模型,就是这些算子串起来的一个链条。
核心要点:推理时,模型参数是只读的。我们只做计算,不更新权重。所以推理引擎可以针对这一点做大量优化,比如常量折叠、内存复用。
3.2 计算图与算子
说到算子,就不得不提计算图。这是现代深度学习框架的基石。我在项目中遇到过,很多人把模型当成一个黑盒子,出了性能问题不知道怎么下手。其实你只要把计算图画出来,瓶颈一目了然。
计算图是什么?说白了,就是一个有向无环图(DAG)。图中的节点是算子(比如Conv、Add、Relu),边是张量(数据)。数据沿着边流动,经过节点时被处理。
举个例子,一个简单的残差块(ResBlock)的计算图:
输入张量 x
|
v
[Conv2D] --> [BatchNorm] --> [ReLU] --> [Conv2D] --> [BatchNorm]
| |
+----------------------- [Add] <------------------------+
|
v
[ReLU]
|
v
输出张量
你看,这里有一个“捷径”(shortcut),把输入直接跳过去和后面的输出相加。这就是ResNet的核心思想。在计算图上,它就是一个Add算子,有两个输入。
为什么要理解计算图?因为推理引擎就是靠它来做优化的。比如:
- 算子融合:把Conv、BN、ReLU这三个连续的算子合并成一个算子。减少内存读写,提升速度。我见过有些框架能把Conv+BN+ReLU融合成一个算子,性能提升30%以上。
- 内存规划:分析计算图,提前分配好每个张量的内存,避免动态申请和释放。
- 并行执行:找出图中没有依赖关系的分支,让它们并行计算。
个人经验:当你拿到一个模型,第一步不是调参数,而是用工具(比如Netron)把它的计算图可视化出来。看看有没有冗余的算子,有没有可以融合的序列。我曾经在一个OCR模型里发现,有连续三个Reshape算子,纯粹是代码写得不干净。去掉之后,推理速度直接快了5%。
3.3 推理引擎概览
好了,有了模型和计算图,我们怎么让它高效跑起来?这就需要推理引擎了。市面上主流的引擎有三个:TensorRT、ONNX Runtime、OpenVINO。它们各有侧重,我分别说说。
3.3.1 TensorRT
NVIDIA家的王牌。专门针对他们的GPU做了极致优化。如果你用的是N卡,TensorRT几乎是首选。
- 核心优势:支持INT8和FP16量化,能把模型体积缩小,速度翻倍。我记得有一次,把一个FP32的模型量化到INT8,精度只掉了0.3%,但推理速度从20ms降到了8ms。
- 适用场景:高吞吐、低延迟的GPU推理服务。比如云端AI推理、自动驾驶中的视觉模型。
- 缺点:只支持NVIDIA GPU。对某些算子的支持不够全面,遇到不支持的算子,你得自己写插件。
3.3.2 ONNX Runtime
微软开源的跨平台引擎。它的野心是成为AI模型的“通用运行时”。你训练好的模型,转成ONNX格式,它就能跑。
- 核心优势:跨平台。Windows、Linux、macOS、甚至手机上都能跑。支持多种硬件后端(CPU、GPU、NPU)。
- 适用场景:需要跨平台部署,或者模型来自不同框架(PyTorch、TensorFlow、PaddlePaddle)的场景。
- 缺点:在特定硬件上的极致性能,不如TensorRT或OpenVINO。它是一个“万金油”,但很难在每个平台上都做到最好。
3.3.3 OpenVINO
Intel家的工具套件。专门优化Intel自家的CPU、集成显卡、VPU等硬件。
- 核心优势:在Intel CPU上跑模型,性能非常出色。它能把模型的计算图转换成Intel CPU能高效执行的指令。我曾经在Xeon处理器上,用OpenVINO跑一个BERT模型,比直接用PyTorch推理快了4倍。
- 适用场景:边缘计算、IoT设备、以及大量使用Intel CPU的服务器。
- 缺点:对AMD和NVIDIA硬件的支持较弱。模型转换过程有时会遇到算子不兼容的问题。
下面这张图,是我自己总结的选型思路,你可以参考一下:
避坑指南:我曾经犯过一个错误,在一个项目里,团队花了三周时间,想把一个PyTorch模型用TensorRT跑起来。结果发现模型里有一个自定义算子,TensorRT不支持。最后不得不回退到ONNX Runtime。所以,选引擎之前,一定要先确认你的模型算子是否被目标引擎支持。先做个小模型验证,再全面铺开。
好了,关于推理的基础,咱们就聊这么多。记住,理解前向传播、计算图和算子,是后面所有优化工作的前提。你想想看,如果连模型怎么算的都不清楚,怎么去优化它呢?
公众号:蓝海资料掘金营,微信deep3321