2、深度学习模型基础:神经网络结构、卷积/Transformer基础、模型大小与计算量评估指标(FLOPs、MACs、参数量)
在进入模型压缩与量化剪枝的具体技术之前,必须首先建立对深度学习模型本体的精确认知。无论是针对嵌入式设备(如ARM Cortex-A系列、RISC-V或NPU/DSP)的部署,还是面向云端推理的优化,模型的参数量(Params)、计算量(FLOPs/MACs)以及内存访问量(MACs Memory)是决定能否落地、以何种帧率落地的三大核心约束。本章将系统梳理神经网络的结构演进(从卷积到Transformer),并深入剖析评估模型复杂度的关键指标,为后续章节的剪枝、量化、知识蒸馏等压缩手段提供统一的度量基准。
上图展示了本章的核心知识框架:左侧为网络结构的两大主流范式(CNN与Transformer),中间为评估模型复杂度的三大指标,右侧为嵌入式部署时的物理约束。理解这三者之间的关联——即结构决定指标,指标映射到硬件资源——是后续所有优化工作的逻辑起点。
2.1 神经网络结构核心原理:从卷积到自注意力
2.1.1 卷积神经网络(CNN)的基本构成
卷积神经网络(Convolutional Neural Network, CNN)是深度学习视觉任务的基石。其核心操作是卷积运算:通过一个可学习的卷积核(Kernel)在输入特征图上滑动,计算局部区域的加权和。一个标准二维卷积层的参数量与计算量由以下公式决定:
# 卷积层参数计算
输入特征图: H_in × W_in × C_in
卷积核: K_h × K_w × C_in × C_out
偏置: C_out
参数量 = (K_h × K_w × C_in + 1) × C_out
输出特征图: H_out × W_out × C_out
计算量(FLOPs) = 2 × H_out × W_out × C_out × K_h × K_w × C_in
计算量(MACs) = H_out × W_out × C_out × K_h × K_w × C_in
在嵌入式部署中,深度可分离卷积(Depthwise Separable Convolution)是MobileNet等轻量级网络的核心。它将标准卷积分解为逐通道卷积(Depthwise Conv)和逐点卷积(Pointwise Conv,即1×1卷积),计算量可降低至标准卷积的约1/9(当K=3时)。这一结构变化直接影响了FLOPs与参数量,是剪枝和量化时需要特别关注的敏感层。
2.1.2 Transformer与自注意力机制
Transformer架构最初用于自然语言处理,现已广泛渗透至视觉领域(ViT、Swin Transformer等)。其核心是多头自注意力(Multi-Head Self-Attention, MHSA)机制。对于输入序列长度为N、特征维度为d的张量,自注意力的计算过程如下:
- 线性投影:生成Q(Query)、K(Key)、V(Value)三个矩阵,每个矩阵的维度为N×d。
- 注意力分数:计算 Q × K^T,得到N×N的分数矩阵,除以√d进行缩放。
- Softmax归一化:对分数矩阵的每一行进行Softmax操作。
- 加权求和:将归一化后的分数矩阵与V相乘,得到输出。
该过程的计算复杂度为O(N²·d),其中N²部分来自Q×K^T矩阵乘法。当输入图像分辨率较高时(例如N=196,对应14×14的patch),自注意力的计算量将急剧上升。相比之下,CNN的局部感受野计算复杂度为O(N·K²·d),与序列长度呈线性关系。这一根本差异决定了在压缩Transformer模型时,注意力头剪枝和序列长度缩减往往比单纯减少通道数更有效。
2.2 模型大小与计算量评估指标详解
2.2.1 参数量(Params)与存储占用
参数量是模型所有可学习参数的总数,直接决定了模型文件的大小和运行时权重内存占用。在嵌入式部署中,我们通常关注以下换算关系:
| 数据类型 | 字节数 | 1M参数占用 | 典型应用场景 |
|---|---|---|---|
| FP32 | 4 Bytes | 4 MB | 服务器端训练与推理 |
| FP16 | 2 Bytes | 2 MB | GPU/部分NPU推理 |
| INT8 | 1 Byte | 1 MB | 嵌入式NPU/CPU推理 |
| INT4 | 0.5 Bytes | 0.5 MB | 极端压缩场景(需特殊硬件支持) |
值得注意的是,参数量并不直接等于内存占用。在推理过程中,除了权重本身,还需要存储中间激活值(Activation)。例如,一个输入为224×224×3的图像,经过第一层卷积(输出通道64)后,激活值大小为224×224×64×4字节≈12.8MB(FP32)。这解释了为什么在嵌入式设备上,即使模型参数量很小,也可能因为激活值内存过大而无法运行。
2.2.2 FLOPs与MACs的精确计算
FLOPs(Floating Point Operations)指浮点运算次数,MACs(Multiply-Accumulate Operations)指乘加运算次数。两者的关系为:1 MAC = 2 FLOPs(一次乘法和一次加法)。在硬件实现中,MACs是更常用的指标,因为DSP和NPU通常将乘加运算作为单条指令执行。
以MobileNetV2为例,其核心模块(Bottleneck)的计算量分解如下:
# MobileNetV2 Bottleneck 计算量分析(输入112×112×32,扩展因子6)
1. 1×1 扩展卷积: 112×112×32 → 112×112×192
MACs = 112×112×192×1×1×32 = 77,070,336
2. 3×3 Depthwise卷积: 112×112×192 → 112×112×192
MACs = 112×112×192×3×3 = 216,760,320
3. 1×1 投影卷积: 112×112×192 → 112×112×32
MACs = 112×112×32×1×1×192 = 77,070,336
总MACs ≈ 370M,其中Depthwise卷积占58.6%
这个案例揭示了深度可分离卷积的一个关键特征:计算量高度集中在Depthwise层,而参数量则集中在1×1卷积层。因此,在剪枝时,对1×1层进行通道剪枝可以显著减少参数量,但对FLOPs的削减有限;而对Depthwise层进行剪枝则相反。理解这一差异,有助于制定差异化的压缩策略。
2.2.3 内存访问量(MACs Memory)与带宽瓶颈
在嵌入式设备上,内存访问量(Memory Access Cost, MACs Memory)往往比FLOPs更能决定实际推理速度。这是因为内存访问的能耗和延迟远高于计算操作。根据Roofline模型,当计算密度(FLOPs/Byte)低于硬件平台的算术强度时,模型将受限于内存带宽而非计算能力。
以树莓派4B(Broadcom BCM2711)为例,其内存带宽约为4.2GB/s,CPU算力(Cortex-A72)约为4.8 GFLOPS(FP32)。对于MobileNetV2(约300M MACs,权重约3.4MB),理论计算时间为300M×2/4.8G≈125ms,而权重读取时间为3.4MB/4.2GB/s≈0.8ms。但实际推理中,激活值的读写次数远大于权重,导致内存访问成为主要瓶颈。因此,量化(INT8)不仅减少了存储占用,更关键的是将内存带宽需求降低4倍,从而直接提升推理速度。
2.3 案例拆解:ResNet-18在嵌入式设备上的部署评估
为了将上述理论应用于实际,我们以ResNet-18在典型嵌入式平台(如NVIDIA Jetson Nano)上的部署为例,进行完整的评估流程演示。
背景与约束:Jetson Nano的GPU算力为472 GFLOPS(FP16),内存带宽为25.6GB/s,可用内存4GB。目标是在该平台上实现实时(≥30 FPS)的图像分类任务。
初始指标分析:
| 指标 | ResNet-18(FP32) | ResNet-18(FP16) | ResNet-18(INT8) |
|---|---|---|---|
| 参数量 | 11.69M | 11.69M | 11.69M |
| 模型大小 | 46.8 MB | 23.4 MB | 11.7 MB |
| FLOPs(224×224输入) | 1.82G | 1.82G | 1.82G |
| 理论计算时间 | 1.82G/0.472G = 3.86ms | 1.82G/0.472G = 3.86ms | 1.82G/0.236G = 7.7ms |
| 权重内存读取 | 46.8MB/25.6GB/s = 1.83ms | 23.4MB/25.6GB/s = 0.91ms | 11.7MB/25.6GB/s = 0.46ms |
分析判断过程:从表中可见,FP32模式下,权重读取时间(1.83ms)与计算时间(3.86ms)处于同一量级,但实际推理中还需考虑激活值读写,导致总延迟约15-20ms,无法达到30FPS。转换为FP16后,权重读取时间减半,但计算时间不变,总延迟降至约10-12ms,仍不满足实时要求。采用INT8量化后,虽然计算时间因GPU不支持INT8而增加(需模拟),但权重读取时间大幅降低,且激活值内存占用减少4倍,实际总延迟可降至约8ms,满足30FPS目标。
实际操作步骤:
- 使用PyTorch的
torch.quantization模块对ResNet-18进行量化感知训练(QAT),校准数据集为ImageNet验证集的1000张子集。 - 将量化后的模型导出为ONNX格式,并使用TensorRT进行INT8引擎构建。
- 在Jetson Nano上运行基准测试,记录延迟和吞吐量。
结果对比与复盘:量化后模型精度从69.8%(Top-1)下降至68.9%,损失0.9%,在可接受范围内。实际推理延迟从FP32的18ms降至INT8的7.2ms,加速比2.5倍。复盘发现,第一层卷积和最后的全连接层对量化敏感,需要保留FP16精度。这一发现指导我们在后续章节中,将重点放在混合精度量化策略上。
torchsummary或ptflops工具获取模型的Params和FLOPs;② 根据目标硬件的算力和带宽,计算理论延迟;③ 使用onnxruntime或TensorRT进行实际基准测试;④ 对比理论值与实测值,找出瓶颈(计算密集还是内存密集);⑤ 针对瓶颈选择压缩策略(剪枝减少计算,量化减少内存)。2.4 常见误区与总结复盘
在模型复杂度评估中,以下误区需要特别警惕:
- 误区一:只关注参数量而忽略激活值内存。许多轻量级网络(如EfficientNet)参数量很小,但激活值巨大,导致嵌入式设备无法运行。评估时必须同时考虑权重和激活值的内存占用。
- 误区二:将FLOPs等同于推理时间。FLOPs是理论计算量,实际推理时间还受内存带宽、并行度、算子实现效率等因素影响。在嵌入式设备上,内存访问往往成为主导因素。
- 误区三:忽略数据精度对计算量的影响。INT8计算在硬件上通常比FP32快2-4倍,但某些硬件(如Jetson Nano的GPU)对INT8支持不佳,反而更慢。必须针对具体硬件评估。
- 误区四:混淆MACs与FLOPs。在阅读或技术文档时,务必确认作者使用的是MACs还是FLOPs,两者相差2倍。例如,MobileNetV2的FLOPs为600M,MACs为300M。