2. 视觉推理模型基础
视觉推理模型并不是一个单一网络,而是由若干“视觉骨干 + 任务头 + 推理/融合模块”组合而成的计算系统。要在不同硬件平台上做适配,第一步不是急着写算子,而是先把模型拆成计算图,再落到算子层面,看清数据从哪里来、经过哪些张量变换、最终输出什么。本节围绕 CNN、Transformer 以及分类、检测、分割三类常见任务,梳理它们的计算图结构与算子构成。
一、计算图与算子:从模型到可执行单元
计算图是模型前向过程的显式表达:节点是算子(Operator),边是张量(Tensor)。例如一次卷积可以写成 Y = Conv2d(X, W, b, stride, padding),其中 X 是输入特征图,W 是权重,b 是偏置,Y 是输出特征图。算子内部还包含更细的循环与累加逻辑,但计算图层面只关心输入输出形状、数据类型和连接关系。
常见视觉算子可分为几类:卷积类(Conv2d、DepthwiseConv2d、ConvTranspose2d)、归一化类(BatchNorm、LayerNorm、GroupNorm)、激活类(ReLU、GELU、SiLU)、池化与采样类(MaxPool、AvgPool、Interpolate、Upsample)、矩阵类(MatMul、Linear、BatchMatMul)、注意力类(Softmax、Scale、Mask)、形状类(Reshape、Transpose、Concat、Split、Slice)以及后处理类(NMS、TopK、ArgMax、Sigmoid)。硬件适配时,真正决定性能的往往是卷积、矩阵乘和注意力这三类计算密集算子,而形状类算子更多影响内存搬运与图优化。
二、CNN 的计算图:以 ResNet 残差块为例
CNN 的计算图以“特征图逐级下采样、通道逐级增加”为主线。以 ResNet 的残差块为例,输入张量形状为 [N, C, H, W],主分支依次经过 1×1 卷积降维、3×3 卷积提取空间特征、1×1 卷积升维,再与 shortcut 分支相加,最后经过 ReLU。其算子序列可表示为:
X -> Conv2d(1x1, stride=1) -> BatchNorm -> ReLU
-> Conv2d(3x3, stride=1, padding=1) -> BatchNorm -> ReLU
-> Conv2d(1x1, stride=1) -> BatchNorm
-> Add(shortcut) -> ReLU -> Y
这里的关键参数是卷积核大小、步长、填充和分组数。例如 3×3 卷积在 padding=1, stride=1 时保持空间尺寸不变;若 stride=2,则 H、W 减半。shortcut 分支在通道数或尺寸不匹配时,需要插入 1×1 卷积或步长卷积做对齐。理解这一点,才能在硬件上正确分配输入输出缓冲区,避免因形状不一致导致图编译失败。
三、Transformer 的计算图:以 ViT 编码层为例
视觉 Transformer 的计算图与 CNN 差异明显。以 ViT 的一个编码层为例,输入是 patch 序列 [N, L, D],其中 L 是 patch 数量,D 是嵌入维度。其核心是多头自注意力(MHSA)和前馈网络(FFN):
X -> LayerNorm -> QKV Linear -> Reshape/Transpose
-> Q @ K^T / sqrt(d) -> Softmax -> @ V
-> Transpose/Reshape -> Output Linear -> Add(X)
-> LayerNorm -> FFN(Linear -> GELU -> Linear) -> Add
与 CNN 相比,Transformer 的计算图更依赖矩阵乘和 Softmax,且对序列长度 L 的平方复杂度敏感。硬件适配时,QKV 投影、注意力分数矩阵和 FFN 中的两个 Linear 是主要计算量来源;而 Reshape、Transpose 等形状算子虽然计算量小,却可能引入额外内存拷贝,需要重点关注。
四、分类、检测、分割的计算图差异
三类任务共享骨干网络,但任务头差异显著。分类最简单:骨干输出 [N, C, H, W] 后接全局池化得到 [N, C],再经 Linear 和 Softmax 输出类别概率。检测在骨干后接特征金字塔(FPN),每个尺度上并行输出分类分支和回归分支,最后经过解码、阈值筛选和 NMS 得到框。分割则需要恢复空间分辨率,通常使用转置卷积或插值上采样,并与骨干中的浅层特征做跳跃连接,最后逐像素分类。
从算子角度看,分类头以 Linear 和 Softmax 为主;检测头包含大量 Conv、Sigmoid、TopK 和 NMS;分割头则包含 ConvTranspose、Interpolate、Concat 和 ArgMax。硬件适配时,NMS 和 ArgMax 这类后处理算子往往难以高效映射到加速器,常需要回退到 CPU 或专用后处理单元。
五、适配前的检查清单
在把模型交给硬件编译器之前,建议先完成以下检查:确认输入输出张量的形状、数据类型和布局(NCHW 或 NHWC);列出所有算子及其参数,标记出计算密集算子;检查是否存在动态形状(如可变序列长度、可变分辨率);确认后处理算子是否在目标硬件支持范围内。只有把计算图和算子构成梳理清楚,后续的算子映射、内存分配和性能调优才有可靠依据。