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 对延迟帮助有限。
二、方法流程:从 FLOPs 到真实延迟的评估链路
要准确判断瓶颈,建议按以下流程建立评估链路:
- 统计 FLOPs 与参数量:用工具(如 fvcore、thop、torch profiler)逐层统计,得到理论计算量分布。
- 测量逐层延迟:在目标芯片上用 CUDA Event 或 Nsight Systems 采集每层耗时,识别 Top-10 延迟层。
- 计算算术强度:对每个热点层估算 Bytes 访问量,计算 FLOPs/Bytes,与硬件 Roofline 拐点对比。
- 判定受限类型:高于拐点为计算受限,低于拐点为访存受限。
- 选择压缩策略:计算受限层优先量化与结构化剪枝;访存受限层优先算子融合、布局优化与低比特权重。
# 使用 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、没降延迟”的无效优化。