模型轻量化

影响神经网络推理速度主要有 4 个因素:FLOPs、MAC、计算并行度、硬件平台架构与特性(算力、GPU内存带宽)

模型压缩

工业界主流的模型压缩方法有:知识蒸馏(Knowledge Distillation,KD)轻量化模型架构(也叫紧凑的模型设计)、剪枝(Pruning)、量化(Quantization)。

模型剪枝(Model Pruning):模型剪枝通过删除冗余的连接或参数来减小模型的大小。这可以通过各种技术来实现,包括结构化剪枝(如移除整个通道或层)、非结构化剪枝(如将参数的小值设为零)、以及稀疏化方法。

模型量化(Model Quantization):模型量化将模型参数从浮点数转换为较低位宽的整数或定点数。这种方法可以显著减少模型的存储需求和计算量,并且在现代硬件上执行更快。

深度可分离卷积(Depthwise Separable Convolution):深度可分离卷积将标准卷积拆分为深度卷积和逐点卷积两个步骤,从而减少了参数数量和计算量。这种方法在移动设备上特别受欢迎,因为它可以提供更高的性能和更小的模型尺寸。

模型压缩算法:模型压缩算法,如哈夫曼编码、矩阵分解和权重共享等,可以进一步减少模型的大小和计算量,同时尽量保持模型的性能。

架构搜索(Architecture Search):使用自动机器学习技术,如强化学习或进化算法,来自动搜索轻量级的模型架构。这种方法可以有效地探索大量的模型结构空间,并找到在给定任务上性能最佳的模型。

知识蒸馏(Knowledge Distillation):知识蒸馏通过从一个大型、复杂模型中提取知识,并将其转移到一个小型、简化的模型中来训练模型。这种方法可以在一定程度上保持模型性能,同时减小模型的大小。

轻量级模型设计思想:在设计模型时,可以采用一些轻量级的设计思想,如简化网络结构、减少层的数量、使用局部连接和少量参数的层等。

知识蒸馏

知识蒸馏是让小模型去拟合大模型,从而让小模型学到与大模型相似的函数映射。使其保持其快速的计算速度前提下,同时拥有复杂模型的性能,达到模型压缩的目的。

模型蒸馏的关键在于监督特征的设计,例如使用 Soft Target(软标签 KD) 所提供的类间相似性作为依据,或使用大模型的中间层特征图或 attention map 作为暗示,对小网络进行训练。整体的框架图如图下所示。
图片引用:华为云开发者联盟

一些结论

分析模型的推理性能得结合具体的推理平台(常见如:英伟达 GPU、移动端 ARM CPU、端侧 NPU 芯片等);目前已知影响 CNN 模型推理性能的因素包括:

  • 算子计算量 FLOPs(参数量 Params)
  • 卷积 block 的内存访问代价(访存带宽)
  • 网络并行度等。
  • 相同硬件平台、相同网络架构条件下, FLOPs 加速比与推理时间加速比成正比
  • 建议对于轻量级网络设计应该考虑直接 metric(例如速度 speed),而不是间接 metric(例如 FLOPs)。
  • FLOPs 低不等于 latency 低,尤其是在有加速功能的硬体 (GPU、DSP 与 TPU)上不成立,得结合具硬件架构具体分析。
    不同网络架构的 CNN 模型,即使是 FLOPs 相同,但其 MAC 也可能差异巨大。
    Depthwise 卷积操作对于流水线型 CPU、ARM 等移动设备更友好,对于并行计算能力强的 GPU 和具有加速功能的硬件(专用硬件设计-NPU 芯片)上比较没有效率。

(“流水线型 CPU”是指一种具有流水线执行指令的中央处理器(CPU)。在计算机科学中,CPU的流水线是指将指令执行过程分解为多个阶段,使得多个指令可以同时被处理,从而提高 CPU 的效率。每个阶段执行不同的指令处理任务,这样可以在同一时钟周期内同时执行多个指令。 ARM 架构是一种基于精简指令集(Reduced Instruction Set Computing,RISC)的处理器架构,被广泛应用于移动设备、嵌入式系统和其他低功耗领域。ARM处理器通常被设计成流水线型,以提高执行效率和性能。 Depthwise 卷积操作对于流水线型 CPU 和 ARM 架构等移动设备更友好的原因在于,它具有较低的计算复杂度和参数量,适合于这些设备的计算和存储资源限制。Depthwise 卷积是深度学习神经网络中的一种卷积操作,与传统的卷积相比,它将输入的每个通道分别与对应的卷积核进行卷积运算,然后将结果进行叠加。这种操作在一定程度上减少了计算量,更适合于流水线型 CPU 和移动设备等资源受限的环境。)

Depthwise 卷积算子实际上是使用了大量的低 FLOPs、高数据读写量(MAC)的操作。因为这些具有高数据读写量的操作,再加上多数时候 GPU芯片算力的瓶颈在于访存带宽,使得模型把大量的时间浪费在了从显存中读写数据上,从而导致 GPU 的算力没有得到“充分利用”。

GPU(图形处理器)的算力瓶颈在于访存带宽的原因主要有以下几点: 并行处理特性: GPU是针对大规模并行计算而设计的处理器。它拥有大量的处理单元(例如CUDA核心),可以同时执行大量的计算任务。然而,这些计算单元需要大量的数据来进行计算,因此高带宽的内存访问是确保这些处理单元保持高效率工作的关键。
数据密集型应用:许多GPU应用程序是数据密集型的,即它们需要大量的数据来进行计算。这些应用程序通常涉及大规模的矩阵运算、图像处理、深度学习等任务,这些任务需要频繁地从内存中读取和写入数据。因此,访存带宽的高低直接影响了这些应用程序的性能。
内存访问延迟:GPU的处理器通常比CPU更快,因此它们可以更快地处理计算任务。然而,如果在处理任务时需要等待数据从内存加载到处理器中,那么处理器就会处于空闲状态,从而影响了整体性能。高带宽内存可以降低内存访问延迟,从而提高GPU的效率。
内存带宽的限制:GPU芯片内部的计算单元通常能够以很高的速度进行计算,但是如果内存系统的带宽无法满足这些计算单元的需求,就会导致计算单元的闲置。因此,内存带宽的限制会限制GPU整体的计算性能。
因此,为了充分利用GPU的计算能力,需要不断提高GPU内存的带宽,以确保GPU能够高效地从内存中读取和写入数据,从而提高整体的计算性能。

大佬的建议

  • 在大多数的硬件上,channel 数为 16 的倍数比较有利高效计算。

  • 低 channel 数的情况下 (如网路的前几层),在有加速功能的硬件使用普通 convolution 通常会比 separable convolution 有效率。

  • 同样大小的通道数可以最小化 MAC。这意味着如果在模型设计中保持通道数相对一致,可以最大程度地减少模型的乘-累加操作(MAC)数量,从而提高模型的效率。

  • 分组数太多的卷积会增加 MAC。这指的是在进行卷积操作时,如果分组数过多,可能会增加模型的计算负担,导致更多的乘-累加操作(MAC)。

  • 网络碎片化会降低并行度。这表示当网络结构过于碎片化(即由于设计或者操作而导致计算操作在不同的部分之间不连续),可能会降低模型的并行计算能力,从而影响整体的性能。

  • 逐元素的操作不可忽视。这意味着在模型设计中,逐元素操作(例如逐元素的激活函数、归一化操作等)虽然看似简单,但也会对模型的性能产生重要影响,需要在设计中给予足够的重视。

  • GPU 芯片上33卷积比11与5*5快

  • 从解决梯度信息冗余问题入手,提高模型推理效率。比如 CSPNet 网络。

  • 从解决 DenseNet 的密集连接带来的高内存访问成本和能耗问题入手,如 VoVNet 网络,其由 OSA(One-Shot Aggregation,一次聚合)模块组成。

在这里插入图片描述

模型剪枝

深度学习模型中一般存在着大量冗余的参数,将权重矩阵中相对“不重要”的权值剔除(即置为 0),可达到降低计算资源消耗和提高实时性的效果,而对应的技术则被称为模型剪枝。
模型剪枝算法根据粒度的不同,可以粗分为4种粒度:

  • 细粒度剪枝(fine-grained):对连接或者神经元进行剪枝,它是粒度最小的剪枝。
  • 向量剪枝(vector-level):它相对于细粒度剪枝粒度更大,属于对卷积核内部(intra-kernel)的剪枝。
  • 核剪枝(kernel-level):去除某个卷积核,它将丢弃对输入通道中对应计算通道的响应。
  • 滤波器剪枝(Filter-level):对整个卷积核组进行剪枝,会造成推理过程中输出特征通道数的改变。

模型量化

模型量化是指将神经网络的浮点算法转换为定点。量化有一些相似的术语,低精度(Low precision)可能是常见的。

低精度模型表示模型权重数值格式为 FP16(半精度浮点)或者 INT8(8位的定点整数),但是目前低精度往往就指代 INT8。
常规精度模型则一般表示模型权重数值格式为 FP32(32位浮点,单精度)。
混合精度(Mixed precision)则在模型中同时使用 FP32 和 FP16 的权重数值格式。 FP16 减少了一半的内存大小,但有些参数或操作符必须采用 FP32 格式才能保持准确度。
模型量化过程可以分为两部分:将模型从 FP32 转换为 INT8(即量化算术过程),以及使用 INT8 进行推理。

在实践中将浮点模型转为量化模型的方法有以下三种方法:

  • data free:不使用校准集,传统的方法直接将浮点参数转化成量化数,使用上非常简单,但是一般会带来很大的精度损失,但是高通最新的论文 DFQ 不使用校准集也得到了很高的精度。
  • calibration:基于校准集方案,通过输入少量真实数据进行统计分析。很多芯片厂商都提供这样的功能,如 tensorRT、高通、海思、地平线、寒武纪
  • finetune:基于训练 finetune 的方案,将量化误差在训练时仿真建模,调整权重使其更适合量化。好处是能带来更大的精度提升,缺点是要修改模型训练代码,开发周期较长。
    目前已知的加快推理速度概率较大的量化方法主要有:
  • 二值化,其可以用简单的位运算来同时计算大量的数。对比从 nvdia gpu 到 x86 平台,1bit 计算分别有 5 到128倍的理论性能提升。且其只会引入一个额外的量化操作,该操作可以享受到 SIMD(单指令多数据流)的加速收益。
  • 线性量化(最常见),又可细分为非对称,对称和 ristretto 几种。在 nvdia gpu,x86、arm 和 部分 AI 芯片平台上,均支持 8bit 的计算,效率提升从 1 倍到 16 倍不等,其中 tensor core 甚至支持 4bit计算,这也是非常有潜力的方向。线性量化引入的额外量化/反量化计算都是标准的向量操作,因此也可以使用 SIMD 进行加速,带来的额外计算耗时不大。
  • 对数量化,一种比较特殊的量化方法。两个同底的幂指数进行相乘,那么等价于其指数相加,降低了计算强度。同时加法也被转变为索引计算。目前 nvdia gpu,x86、arm 三大平台上没有实现对数量化的加速库,但是目前已知海思 351X 系列芯片上使用了对数量化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值