4. 神经网络基础与计算瓶颈

端到端自动驾驶模型通常由卷积主干、Transformer 时序融合、BEV 特征变换与 Occupancy 占用栅格头组成。模型压缩与加速的第一步,不是急着剪枝或量化,而是理解每一类算子的计算特性、访存模式,以及 FLOPs、延迟、能耗三者之间的真实关系。很多工程师看到 FLOPs 下降 50%,实测延迟却只降 15%,原因往往就藏在内存访问瓶颈里。

一、核心原理:四类算子的计算与访存特性

卷积是典型的计算密集型算子,具有高算术强度(Arithmetic Intensity),即每读取一字节数据能完成较多次乘加运算。以 3×3 卷积为例,权重可复用,输入特征图在滑窗中反复参与计算,因此 GPU 的 Tensor Core 利用率较高。但深度可分离卷积虽然 FLOPs 大幅下降,其算术强度也随之降低,容易从计算受限转为访存受限。

Transformer 的核心是自注意力机制,其计算复杂度随序列长度呈平方增长。Q、K、V 的生成与注意力矩阵计算涉及大量矩阵乘,属于计算密集部分;但 Softmax、LayerNorm、残差连接等逐元素操作则是典型的访存密集型,需要多次读写显存。BEV 特征变换(如 LSS、BEVFormer 的空间交叉注意力)需要将多相机图像特征投影到统一鸟瞰图空间,涉及大量索引、采样与散射操作,访存不规则,缓存命中率低。Occupancy 头通常输出三维体素栅格,通道数多、空间分辨率高,其 3D 卷积或反卷积在显存带宽上压力显著。

关键结论:FLOPs 只衡量计算量,不衡量数据搬运量。延迟 ≈ max(计算时间, 访存时间) + 调度开销;能耗 ≈ 计算能耗 + 访存能耗。当算术强度低于硬件拐点时,算子受限于显存带宽,此时降 FLOPs 对延迟帮助有限。

四类算子计算特性与瓶颈定位 卷积 Conv 算术强度:高 瓶颈:计算受限 权重复用好 Tensor Core 友好 深度可分离→访存受限 代表:ResNet、RegNet Transformer 注意力:O(n²) 计算 QKV 矩阵乘:计算密集 Softmax/LN:访存密集 KV Cache 带宽压力 长序列→显存墙 代表:BEVFormer、VAD BEV 特征变换 投影/采样/散射 访存不规则 缓存命中率低 多相机特征对齐 Gather/Scatter 开销大 代表:LSS、BEVDet Occupancy 头 3D 体素输出 通道多、分辨率高 3D 卷积/反卷积 显存带宽压力大 输出层常成延迟热点 代表:OccNet、TPVFormer FLOPs / 延迟 / 能耗 关系 FLOPs ↓ ≠ 延迟 ↓ ≠ 能耗 ↓ 算术强度 = FLOPs / Bytes Roofline 拐点决定受限类型 访存能耗常高于计算能耗 压缩加速决策要点 ① 先测各层延迟占比,定位访存瓶颈层 ② 计算受限层:量化/剪枝收益明显 ③ 访存受限层:算子融合、减少中间张量 ④ 不规则访存层:重排布局、专用 Kernel

二、方法流程:从 FLOPs 到真实延迟的评估链路

要准确判断瓶颈,建议按以下流程建立评估链路:

  1. 统计 FLOPs 与参数量:用工具(如 fvcore、thop、torch profiler)逐层统计,得到理论计算量分布。
  2. 测量逐层延迟:在目标芯片上用 CUDA Event 或 Nsight Systems 采集每层耗时,识别 Top-10 延迟层。
  3. 计算算术强度:对每个热点层估算 Bytes 访问量,计算 FLOPs/Bytes,与硬件 Roofline 拐点对比。
  4. 判定受限类型:高于拐点为计算受限,低于拐点为访存受限。
  5. 选择压缩策略:计算受限层优先量化与结构化剪枝;访存受限层优先算子融合、布局优化与低比特权重。
# 使用 torch profiler 采集逐层延迟示例
import torch
from torch.profiler import profile, ProfilerActivity

with profile(activities=[ProfilerActivity.CUDA]) as prof:
    model(input_tensor)

print(prof.key_averages().table(
    sort_by="cuda_time_total", row_limit=15))

三、案例场景:BEVFormer 的延迟热点分析

以 BEVFormer 为例,其编码器包含多相机图像特征提取、空间交叉注意力与时间自注意力。实测中常见现象是:图像主干 FLOPs 占比约 60%,但延迟占比可能只有 35%;而空间交叉注意力 FLOPs 占比约 20%,延迟占比却接近 40%。原因是交叉注意力需要按 BEV 查询点从多相机特征图中采样,产生大量不规则访存与索引计算,算术强度低,GPU 利用率不足。

此时若只对主干做剪枝,整体延迟改善有限;更有效的做法是对交叉注意力进行算子融合、降低采样点数、使用 FP16/BF16 混合精度,并优化特征图内存布局,使采样访问更连续。Occupancy 头同理,其输出体素通道数常达 16~32,若直接输出高分辨率 3D 栅格,显存写入量巨大,需通过通道压缩或稀疏化降低带宽压力。

实操建议:在 Orin、地平线 J5、黑芝麻 A1000 等车端芯片上,显存带宽通常远低于数据中心 GPU。评估时务必以目标芯片的带宽和算力拐点为准,不能直接套用服务器端结论。

四、误区与复盘

常见误区 真实情况 正确做法
FLOPs 降一半,延迟就降一半 访存受限层延迟几乎不变 先做 Roofline 分析,区分受限类型
参数量小就一定快 深度可分离卷积参数量小但访存多 关注算术强度与内存带宽
只看单帧延迟,忽略能耗 车端功耗与散热约束严格 同时测量延迟与能耗,关注访存能耗
所有层统一量化到 INT8 注意力 Softmax 对精度敏感 混合精度,敏感层保留 FP16
忽略算子融合收益 逐元素操作访存开销大 融合 LayerNorm、激活、残差

复盘要点:压缩与加速不是单纯追求 FLOPs 最低,而是在目标芯片上实现延迟、能耗、精度三者的最优平衡。建议建立“逐层 FLOPs—延迟—访存—能耗”四维画像,再决定剪枝、量化、融合与稀疏化的组合策略。

理解卷积、Transformer、BEV、Occupancy 四类算子的计算与访存特性,是后续所有压缩加速手段的决策基础。只有先定位瓶颈类型,才能避免“降了 FLOPs、没降延迟”的无效优化。