1. 课程导入
自动驾驶系统本质上是一个强实时、高可靠、资源受限的嵌入式智能系统。无论是前视摄像头、激光雷达、毫米波雷达,还是多传感器融合后的 BEV 感知网络,其模型规模在过去五年中呈指数级增长。一个典型的 BEV 感知模型可能包含数千万甚至上亿参数,单帧推理需要数十亿次乘加运算(MACs)。与此同时,车载计算平台的算力、功耗与散热预算却极为有限,这就构成了本课程要解决的核心矛盾:模型能力增长与车端算力约束之间的鸿沟。
一、计算瓶颈从哪里来
要理解稀疏化与结构剪枝的价值,先要看清瓶颈的真实来源。自动驾驶模型的计算压力并非均匀分布,而是集中在几个关键环节:
- 骨干网络的特征提取:ResNet、VoVTr、Swin 等主干在浅层高分辨率阶段产生大量激活值,卷积或注意力的计算密度极高。
- 多尺度特征融合:FPN、PAN、BiFPN 等结构需要反复上采样、下采样与逐元素相加,带来额外的内存带宽消耗。
- 时序与多帧融合:为提升稳定性和速度估计,感知模型常融合 3~5 帧历史特征,计算量随帧数近似线性增长。
- 决策规划网络:基于 Transformer 的轨迹预测与规划模型,其自注意力复杂度随场景中智能体数量呈平方增长。
这些环节共同导致一个结果:算力瓶颈往往不是“算不动”,而是“搬不动”。在车端 SoC 上,内存带宽和功耗墙常常比峰值算力更早成为限制因素。因此,稀疏化与结构剪枝的目标不仅是减少 MACs,更是减少无效计算、降低访存压力、提升硬件利用率。
二、稀疏化与结构剪枝的工程价值
稀疏化与结构剪枝属于模型压缩的两条主线。稀疏化关注将权重或激活中的大量冗余元素置零,形成稀疏张量;结构剪枝则关注以通道、滤波器、注意力头、层为粒度,直接移除整块结构。两者在工程上的价值可以归纳为四个层面:
- 降低延迟:减少实际参与计算的乘加次数,缩短单帧推理时间,为控制模块留出更多安全余量。
- 降低功耗与散热压力:车规级芯片对功耗极为敏感,剪枝后模型更易满足被动散热或风冷设计。
- 提升部署灵活性:更小的模型可以部署到中低算力平台,支持多车型、多配置的快速适配。
- 改善硬件利用率:结构化剪枝后的规整张量更容易被 TensorRT、NPU 编译器高效调度。
下面这张图展示了从原始模型到车端部署的典型压缩路径,以及各环节对应的工程目标。
三、典型场景:从 BEV 感知到规划模型
以一个量产 BEV 感知模型为例,其骨干网络在 640×640 输入下,单帧 MACs 约为 120G,其中约 60% 集中在浅层高分辨率卷积。通过结构化通道剪枝,将浅层通道数压缩 40%,整体 MACs 可降至约 78G,而 mAP 仅下降 0.6 个百分点。再配合 INT8 量化与 TensorRT 部署,端到端延迟从 42ms 降至 26ms,满足 30ms 的实时控制周期要求。
在决策规划侧,基于 Transformer 的轨迹预测模型常面临智能体数量波动问题。当场景中智能体从 10 个增加到 50 个时,自注意力计算量增长约 25 倍。此时采用注意力头剪枝与稀疏注意力,可以在保持轨迹预测误差基本不变的前提下,将最坏情况延迟控制在预算内。
四、常见误区与复盘
初学者在稀疏化与剪枝实践中容易陷入以下误区:
| 误区 | 表现 | 正确做法 |
|---|---|---|
| 只看参数量 | 参数减少 50%,但延迟几乎不变 | 关注 MACs、访存量和硬件实际加速比 |
| 追求非结构化稀疏 | 稀疏度很高,但 GPU/NPU 无法加速 | 优先结构化剪枝,匹配硬件规整计算 |
| 剪枝后不微调 | 精度断崖式下降 | 剪枝后必须进行充分微调与 BN 校准 |
| 忽略时序稳定性 | 单帧指标正常,但视频抖动明显 | 用多帧序列评估,关注时序一致性 |
这些误区的共同根源,是把剪枝当成纯粹的“模型压缩”问题,而忽略了它同时是一个硬件协同设计问题。一个在服务器 GPU 上表现良好的稀疏模型,未必能在车端 NPU 上获得同等收益。因此,本课程始终强调“算法—硬件—数据”三位一体的工程视角。
五、课程学习目标与知识框架
本课程围绕“能理解、能动手、能落地”三个层次展开,学习目标如下:
- 理解层:掌握稀疏化、结构化剪枝、量化、知识蒸馏的基本原理与适用边界。
- 方法层:熟悉 L1 正则、BN 缩放因子、通道重要性评分、迭代剪枝等主流方法。
- 工具层:能够使用 PyTorch、TensorRT、ONNX 等工具完成剪枝与部署验证。
- 工程层:能够针对 BEV 感知、轨迹预测等自动驾驶任务设计压缩方案并评估收益。
整体知识框架可以概括为四条主线:瓶颈分析 → 稀疏化方法 → 结构剪枝方法 → 部署与评估。后续章节将依次展开,从理论到代码,从单模块到端到端系统,逐步构建完整的工程能力。
# 典型剪枝流程伪代码
model = build_bev_model()
model.load_state_dict(pretrained)
for epoch in range(warmup_epochs):
train(model, dataloader) # 正常训练
for round in range(prune_rounds):
importance = compute_channel_importance(model, calib_loader)
model = prune_channels(model, importance, ratio=0.2)
model = finetune(model, train_loader, epochs=10)
evaluate(model, val_loader) # 精度回归
export_onnx(model)
build_tensorrt_engine(onnx_path, int8=True)
通过本章的学习,你已经建立了对计算瓶颈、压缩价值和工程约束的整体认知。接下来,我们将从最基础的稀疏性概念出发,逐步深入到可落地的结构化剪枝技术。