赞
踩
目标检测技术的突飞猛进与广泛应用使人们开始去关注目标检测器的准确率和速度。但是,目前 SOTA 的目标检测方法要么是通过一个大型网络来实现高准确率,要么用一个轻量级模型来追求速度,但牺牲了精度。本文中,作者提出了一个 YOLObile 框架,通过压缩-编译协同设计在移动设备上的实时的目标检测方法。提出了一个新的、针对任意核大小的 block-punched 裁剪机制。为了提高它在移动设备上的计算效率,作者采用了一个 GPU-CPU 协同机制和先进的编译器辅助优化方案。实验结果表明该裁剪机制为 YOLOv4 实现了 14 × 14\times 14× 的压缩率,mAP 为 49.0 49.0 49.0。在 YOLObile 框架下,作者在三星 Galaxy S20 手机上实现了 17 FPS 的推理速度。加入了 GPU-CPU 协同机制后,其推理速度增加到了 19.1 FPS,超越了原来的 YOLOv4 速度 5 × 5\times 5×。源码位于https://github.com/nightsnack/YOLObile。
目标检测是计算机视觉的主要任务之一,因为深度神经网络的技术突破,在学术界和工业界都有大量的研究。目标检测在众多的计算机视觉任务上都被广泛采用,包括图像标注、动作检测、目标追踪、分割等,有着广泛的应用,如自动驾驶、无人机避障、机器视觉、人机交互和增强现实。考虑到这些应用场景,当我们将其部署在低资源平台上时,如嵌入式平台和移动设备,我们就需要在保证高准确率的同时实现低延迟性。
在过去十几年,目标检测器主要可分为双阶段检测器和单阶段检测器。与双阶段检测器相比,单阶段检测器旨在速度和精度之间实现平衡,本文主要讨论这一类检测器。尽管投入了大量工作,代表工作如 YOLO、SSD 仍然需要大量的计算,才能取得高 mAP,限制了移动设备上实时部署。与上述方法相比,Sandler 等人、Huang 和 Chen 等人研究了轻量级目标检测架构。但是,它们虽然效率很高,但是准确率下降也很明显。
为了解决这个问题,人们开始关注模型压缩技术,尤其是权重裁剪方法。该方法被证明是降低计算量和内存消耗最有效的方法,不会牺牲准确性。通过降低权重的冗余性,结构稀疏的模型就可以实现更高的内存和能量效率,推理时延迟更低。一般而言,非结构化和结构化裁剪是权重裁剪的两个主要方向。非结构化裁剪以一种不规则的形式来去除权重,造成硬件加速困难。结构化裁剪会造成准确率显著下降,因为裁剪掉整个滤波器或通道会造成特征信息丢失。为了克服这些缺点,基于模式的裁剪又提了出来,它以知晓硬件的方式加入细粒度高的非结构化裁剪。但是它只能应用在 3 × 3 3\times 3 3×3卷积核的卷积层,严重制约了它的部署。
本文目的是实现一个实时的目标检测,研究为移动平台进行推理裁剪的全部优势。作者提出了 YOLObile 框架,通过压缩-编译协同设计,它是一个在移动设备上的实时的目标检测。作者将 SOTA 检测器 YOLOv4 作为检测架构。YOLObile 有若干个创新技术组成,包括一个新的基于模块的裁剪,它可以针对任意卷积核大小,以及编译器优化、一个 GPU-CPU 协同加速策略。更具体点,作者提出了一个创新的裁剪机制— block-punched 裁剪,它可以灵活地应用到任意大小的卷积层上以及全连接层。特定层的所有 DNN 权重会被分为一组大小相同的模块,每个模块内的权重都会被裁剪为相同的形状。为了提升 DNN 在移动设备上计算效率,YOLObile 也使用了 GPU-CPU 系统计算机制。YOLObile 使用编译器优化方案,实现了很高的硬件并行,包括压缩存储机制、块重排序和高并行的自动微调模型部署方案。实验结果显示 YOLObile 给 YOLOv4 带来了 14 × 14\times 14× 压缩率(权重),mAP 是 49.0 49.0 49.0。在三星 Galaxy S20 手机上实现了 19.1 FPS 的推理速度,要比原来的 YOLOv4 快 5 × 5\times 5×。
基于 DNN 的目标检测器可以分为两类:(i) 双阶段检测器和 (ii)单阶段检测器。
双阶段检测器将检测分为两个阶段:提取兴趣区域(RoI),然后基于 RoI 进行分类和边框回归。最具代表性的双阶段网络就是 R-CNN 系列。R-CNN 是第一个基于区域的 CNN 目标检测器,与之前的基于 HOG 特征的方法比,它取得了更高的检测表现。Faster R-CNN 提升了精度和检测效率。尽管它取得了较高的准确率,双阶段检测器的主要缺点就是高计算量和高延迟。
单阶段检测器 去除了 RoI 提取阶段,直接对候选边框做回归和分类。YOLO 采用一个统一的架构,从输入图像上提取特征图,将整个特征图作为候选区域来预测边框和类别。人们提出了 YOLOv2、YOLOv3和YOLOv4,精度和速度都有提升。SSD 是另一个具有代表性的单阶段检测器,构建了一个全卷积网络来预测一组固定个数的边框和得分。单阶段检测器在速度和精度之间做了优化平衡,但只在高性能的桌面 GPU 上。
所以,人们提出了运行在移动设备上的轻量级目标检测器,模型大小和推理速度都受限。SSDLite 是一个移动端的 SSD 变体,使用了一个移动架构。MobileNet 基于倒转残差结构,使用轻量的深度卷积来过滤特征。基于 YOLOv2,YOLO-LITE 提供了一个更小、更快、更高效的模型,在许多移动设备上都可以做到实时目标检测。Tiny-DSOD 基于深度监督目标检测(DSOD)的框架,通过深度密集模块(DDB)主干网络和深度FPN(D-FPN)的前端来做到移动端目标检测。但这些方法的准确率都牺牲了许多。在 COCO 数据集上,使用 A P @ [ 0.5 : 0.95 ] AP@[0.5:0.95] AP@[0.5:0.95]的标准,YOLO-LITE 的准确率下降到了 12.16,SSDLite 则只取得了 22.1,Tiny-DSOD 取得了 23.2。
作者接下来讨论了3个最流行的裁剪方案:细粒度非结构化裁剪、粗粒度结构化裁剪和基于模式的裁剪。
非结构化裁剪 可以裁剪权重矩阵中任意位置的权重,保证了更高的灵活性,可以搜索到最优化的裁剪结构,如图1(a)。因此,它通常可以取得很高的压缩率,而较低的精度损失。但是,非结构化裁剪会导致权重矩阵中的不规则稀疏,在计算过程中需要额外的索引来定位非零权值。这就使得 GPU 提供的硬件并行不能充分利用。因此,非结构化裁剪对于 DNN 推理加速不适用,甚至会造成速度的下降。
结构化裁剪 会裁剪掉 DNN 权重的整个通道或滤波器。如图1(b),滤波器裁剪会去除掉权重矩阵的整行,通道裁剪会去除掉权重矩阵的对应通道的连续列。结构化裁剪会保持权重矩阵的规则形状,维度下降了。因此,它是硬件友好的,可以利用硬件并行来加速。但是,结构化裁剪会造成精度的明显下降,因为裁剪后的特征变得粗粒度了。
基于模式的裁剪 被认为是一个细粒度的结构化裁剪机制。因为它在结构化灵活性和结构化规则性方面都很适当,所以同时保留了准确性和硬件的性能。基于模式的裁剪有两部分构成,即核模式裁剪和连接裁剪。核模式裁剪会在每个卷积核内裁剪掉固定数量的权重,如图2所示。它首先分析剩余权重的位置,形成一个特殊的核模式,然后再裁剪权重。不同的核可以用不同的模式类型,但是模式的总数是固定的。连接裁剪,作为核模式裁剪的补充,可以实现更高的压缩率。连接裁剪会裁剪掉整个卷积核,可以去除输入和输出通道之间的联系。但是,核模式是针对 3 × 3 3\times 3 3×3 卷积核特殊设计的,不适用于其它卷积核大小。该缺点就极大地限制了基于模式裁剪的应用场景。
随着移动端计算机视觉的应用推广,移动平台现有的性能急需取得突破。工业界和学术界都在研究移动端 DNN 的推理框架。在这些工作中,TensorFlow-Lite、Alibaba Mobile Neural Network 和 TVM 是3个代表性的、端到端的 DNN 推理框架,推理效率很高。它们使用了很多先进的性能优化技术,包括多种计算图优化、张量优化、半浮点支持;特别地,TVM 采用了一个更加先进的参数自动调参方法。但是,这些框架都无法支持移动端的稀疏(裁剪)的DNN模型。这就严重束缚了 DNN 移动端推理的性能。
为了克服该缺陷,人们提出了若干基于编译器的优化方法,支持稀疏 DNN 模型,极大地提升了移动端设备上端到端 DNN 推理的速度。但是,这些优化都只针对细粒度的、基于模式的裁剪方法而设计,如 PatDNN 和 PCONV, 3 × 3 3\times 3 3×3 卷积核是主要的加速部分。此外,常用层如 FC 层和 1 × 1 1\times 1 1×1层则不支持。
如上所述,SOTA 目标检测方法要么是准确率高,使用一个大型模型,要么是推理速度快,使用一个轻量模型但牺牲准确性。因此,它们都无法同时满足移动设备上准确性和低延迟的要求。我们就希望有一个方案能在移动设备上同时满足准确性和低延迟。
尽管基于模式的裁剪看上去不错,它在推理速度和准确率方面实现了平衡。但是,它只能用在 3 × 3 3\times 3 3×3 卷积层,限制了其应用。图3 是 3 × 3 3\times 3 3×3卷积层和非 3 × 3 3\times 3 3×3卷积层的比较。作者选择了4个具有代表性的方法,比较它们的权重和计算量的比例。例如,在 YOLOv4 中,非 3 × 3 3\times 3 3×3卷积层贡献了总权重个数和计算量的很大一块( 17 % 17\% 17%和 19 % 19\% 19%)。
编译器辅助的 DNN 推理加速是另一个不错的方案,用于移动端低延迟的 DNN 推理。在编译器优化的帮助下,低延迟 DNN 推理可以用在图像分类任务上。但是,该加速不够充分,无法满足目标检测任务的低延迟要求,因为它有大量的权值,需要更多复杂的计算。至此,作者提出了2个关键的设计目标:
为了实现目标1,作者提出了一个新的裁剪机制,block-punched 裁剪,在实现高度的硬件并行的同时,保持高准确率。除了 3 × 3 3\times 3 3×3 卷积层,它也可以用在其它类型的 DNN 层,如 1 × 1 1\times 1 1×1卷积层和全连接层。它尤其适用在资源受限的移动设备上的高效率 DNN 推理。如图4所示,特定层的所有权重会被分为多个相同大小的块,每个块都包含 m m m 个连续滤波器的 n n n 个连续通道。在每个块内,我们裁剪所有滤波器中相同位置的一组权重,也裁剪所有通道中相同位置的权重。换句话说,在一个块内,要裁剪的权重会穿通所有滤波器和通道的相同位置。注意,每个块内的裁剪权值个数是可变的,不同块中可以不一样。
从准确率角度来说,受到基于模式的裁剪启发,作者在 block-punched 裁剪中采用了一个细粒度结构化裁剪策略,增加结构灵活度,减轻准确率损失。
从硬件性能角度来说,与粗粒度结构化裁剪相比,本文 block-punched 裁剪机制利用合适的块大小和编译器级别的代码生成,能够实现很高的硬件并行。通常来说,一个 DNN 层的权值个数会非常大。即便我们将权重拆分为了块,每个块所需要的计算量也足以让计算资源消耗完,造成极高的并行压力,尤其是在资源有限的移动设备上。此外,该裁剪机制能够从内存和计算量角度更好地利用硬件并行。首先,在卷积计算时,每层所有的滤波器都共享输入。由于每个块内,所有滤波器的相同位置都会进行裁剪,这些滤波器就不会读取输入数据,因此减轻处理这些滤波器的线程的内存压力。其次,在每个块内裁剪各通道上的相同位置,这确保了所有的通道有着一样的计算索引,这样就解决了每个块内处理通道的线程所面对的计算分散的问题。
对于本文 block-punched 裁剪方法,块大小会影响准确率和硬件加速。一方面,因为较小的块大小具有更高的细粒度,所以就提供了更高的结构灵活度,这就会带来更高的准确率,但是会降低一定的速度。另一方面,较大的块大小能够更好地利用硬件并行,取得更快的加速,但是会造成精度损失。
为了判断出一个合适的块大小,作者首先考虑了设备的计算资源,判断出每个块的通道个数。例如,将智能手机中 CPU/GPU 的向量寄存器的长度作为每个块内通道的个数,从而实现更高的并行效果。如果每个块内通道的个数少于向量寄存器的长度,那么向量寄存器和向量计算单元都不会被充分利用。但是,增加通道个数并不会增加性能,甚至会造成严重的精度损失。所以,每个块内滤波器的个数应该根据情形来决定,仔细平衡准确性和硬件加速。
硬件加速可以通过推理速度来推断出,无需重复训练DNN模型即可得到,与模型的准确率相比可以很容易推导出。因此,作者将一个合理的最小推理速度设定为设计目标。只要块大小满足推理速度目标,我们就将保留其每个块中最小个数的滤波器,减轻准确率损失。5.3节中介绍了更多的细节信息。
在以前的权重裁剪算法中,主要使用了分组 Lasso 正则或 Alternating Direction Methods of Multipliers(ADMM)。但是它可能带来潜在的精度损失,或需要人工调节的压缩率。所以,作者采用了一个重新加权的分组 Lasso 方法。其基本思想就是系统地、动态地对惩罚做重新加权。该重新加权方法会降低较大的权重的惩罚,因为它们可能更加重要,而增加较小的权重的惩罚。
以 W i ∈ R M × N × K h × K w W_i\in \mathbb{R}^{M\times N\times K_h\times K_w} Wi∈RM×N×Kh×Kw 表示第 i i i 个卷积层的 4-D 权值张量,其中 M M M是滤波器个数, N N N是输入通道个数, K w K_w Kw和 K h K_h Kh是第 i i i层卷积核的宽度和高度。通用的重新加权裁剪问题就可表示为:
min W , b f ( W ; b ) + λ ∑ i = 1 N R ( α i ( t ) , W i ) \min_{W,b} f(W;b) + \lambda \sum_{i=1}^N R(\alpha_i^{(t)}, W_i) W,bminf(W;b)+λi=1∑NR(αi(t),Wi)
其中 f ( W ; b ) f(W;b) f(W;b)代表损失函数。 R ( ⋅ ) R(\cdot) R(⋅)是正则项,用于产生模型的稀疏性,超参数 λ \lambda λ控制准确率和悉数性的平衡。 α i ( t ) \alpha_i^{(t)} αi(t) 表示针对第 i i i层的权重 W i W_i Wi 的惩罚值集合。
对于该 block-punched 裁剪,每个 W i W_i Wi 都被分为 K K K 个块,大小都是 g i m × g i n g_im \times g_in gim×gin,即 W i = [ W i 1 , W i 2 , . . . , W i K , ] W_i=[W_{i1}, W_{i2},...,W_{iK},] Wi=[Wi1,Wi2,...,WiK,],其中 W i j ∈ R g i m × g i n W_{ij} \in \mathbb{R}^{g_im\times g_in} Wij∈Rgim×gin。所以,正则项就是:
R ( α i ( t ) , W i ) = ∑ j = 1 K ∑ h = 1 g m i ∑ w = 1 g n i ∣ ∣ α i j n ( t ) ∘ [ W i j ] h , w ∣ ∣ F 2 R(\alpha_i^{(t)}, W_i) = \sum_{j=1}^K \sum_{h=1}^{g_m^i} \sum_{w=1}^{g_n^i} ||\alpha^{(t)}_{ijn} \circ [W_{ij}]_{h,w}||_F^2 R(αi(t),Wi)=j=1∑Kh=1∑gmiw=1∑gni∣∣αijn(t)∘[Wij]h,w∣∣F2
其中 α i j n ( t ) \alpha^{(t)}_{ijn} αijn(t)用 α i j n ( t ) = 1 ∣ ∣ [ W i j ] h , w t ∣ ∣ F 2 + ϵ \alpha^{(t)}_{ijn}=\frac{1}{||[W_{ij}]_{h,w}^t||_F^2 + \epsilon} αijn(t)=∣∣[Wij]h,wt∣∣F2+ϵ1 来更新。
我们用一个预训练 DNN 模型来开始裁剪,然后通过重新加权正则裁剪算法来进行新一次的训练,就可得到裁剪后的模型。
为了实现第二个目标,作者提出了一个 GPU-CPU 协同计算机制,提升 DNN 在移动设备上的计算效率。如图5(a) 所是,多分支结构被广泛地应用在 SOTA 网络如 YOLOv4 中。移动设备有移动 GPU 和移动 CPU,目前的 DNN 推理框架如TFLite 和 MNN 要么只能在移动 GPU,要么移动 CPU 上来支持 DNN 推理,这就造成计算资源的浪费。当GPU使用时,CPU 大多数时间没有被充分利用。许多分支并没有互相依赖,它们可以在移动GPU和移动CPU上同步计算,来实现更高的效率和速度。
本文方法采用了 GPU-CPU 协同计算机制,来优化 DNN 的两种分支结构,1) 卷积层分支结构和 2) 非卷积操作的分支结构。这两类分支结构的例子如图5(a, b)所示。部署之前,我们根据速度来做线下设备的选择。
GPU 适合做高并行计算,如卷积计算,它在速度上要远远领先于 CPU。因此,对于卷积层的分支结构而言,如图5(a) 的 YOLOv4 中的 CSP 模块,我们用 GPU 来计算最耗时的分支,那么剩下的问题就是判断另一个分支是用 CPU 计算呢,还是仍用 GPU 来计算。
在图5(a),作者将分支1和分支2中的 GPU 计算时间表示为 t g 1 t_{g1} tg1和 t g 2 t_{g2} tg2,CPU的计算时间表示为 t c 1 t_{c1} tc1和 t c 2 t_{c2} tc2,数据拷贝时间是 τ \tau τ。在GPU上我们运算最耗时的分支1,对于分支2我们需要做个判断。当我们用 CPU 做并行计算时,我们也需要加上数据拷贝时间 τ \tau τ。GPU-CPU 并行计算时间 T p a r T_{par} Tpar 依赖于分支1和分支2的最大时间成本:
T p a r = max { t g 1 , t c 2 + τ } T_{par} = \max\{t_{g1}, t_{c2} + \tau\} Tpar=max{tg1,tc2+τ}
只用 GPU 的计算时间 T s e r T_{ser} Tser 是两个分支计算时间的和:
T s e r = t g 1 + t g 2 T_{ser} = t_{g1} + t_{g2} Tser=tg1+tg2
根据 T p a r T_{par} Tpar 的最小值及 T s e r T_{ser} Tser的最小值,我们可以选择最适合分支2的运行设备。注意,YOLOv4中每个分支结构的运行设备独立于其它分支结构。所以,所有分支结构的运行设备可以通过贪心算法解决。
另一方面,受到能源消耗制约,移动端 GPU 通常表现较差。对于计算要求不高的操作,如 pointwise 加法操作和 point-wise 乘法操作,移动 CPU 与 GPU 的速度接近甚至更快。因此,对于非卷积操作的分支结构,根据整体计算时间,每个分支既可用 CPU 也可用 GPU。
以 YOLOv4 中的 head 结构为例,如图5(b) 所示。对最后一个卷积层的输出做 transpose 和 reshape 操作,我们仍然需要多个非卷积操作来得到最终的输出。我们评估每个分支上非卷积操作的总GPU和CPU运行时间,表示为 t g 0 , t g 1 , t g 2 t_{g0},t_{g1},t_{g2} tg0,tg1,tg2和 t c 0 , t c 1 , t c 2 t_{c0}, t_{c1}, t_{c2} tc0,tc1,tc2。 T t o t a l T_{total} Ttotal表示3个分支的总计算时间。
现在针对3个分支,我们有8个可能的设备选择组合。例如,如果前2个分支使用 CPU,第3个分支使用GPU,总的计算时间就是 T t o t a l = max { t c 0 + t c 1 , t g 2 } T_{total} = \max\{t_{c0} + t_{c1}, t_{g2}\} Ttotal=max{tc0+tc1,tg2}。
注意,最终的输出都得挪到 CPU 上,这样在总的计算时间中我们就不考虑数据拷贝时间了。最后,作者选择总计算时间最短的组合,作为计算方案。该GPU-CPU协同机制能够有效地提升硬件利用率和DNN推理速度。
受 PatDNN 启发,YOLObile 用到了多个先进的编译器辅助优化办法。由于篇幅限制,作者简单地总结了一下。首先 YOLObile 使用裁剪信息(块和 punched 模式)来压缩存储网络权值,类似于知名的 Compressed Sparse Row 格式,进一步压缩索引数组。其次,YOLObile 重新排序块,提升内存和计算规则性,去除不必要的内存读取。此外,YOLObile 利用一个高度并行的自动调参模型,找到最佳的运行配置参数。YOLObile 为每一层都生成CPU和GPU代码,在推理时根据GPU-CPU协同机制调用最适合的代码。
Pls read paper for more details.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。