DCNv4:对视觉应用的动态和稀疏算子的重新思考

摘要

https://arxiv.org/pdf/2401.06197.pdf
我们介绍了可变形卷积v4(DCNv4),这是一种高效且有效的运算符,专为广泛的视觉应用而设计。DCNv4解决了其前身DCNv3的局限性,通过两个关键改进:1. 去除空间聚合中的softmax归一化,以增强其动态属性和表达力;2. 优化内存访问以最小化冗余操作以提高速度。这些改进导致与DCNv3相比,收敛速度显著加快,处理速度大幅提升,DCNv4的前向速度提高了三倍以上。DCNv4在各种任务中表现出色,包括图像分类、实例和语义分割,尤其是图像生成。当将其集成到诸如U-Net之类的潜在扩散模型中的生成模型中时,DCNv4超过了其基线,突显了其增强生成模型的潜力。在实践应用中,将DCNv3替换为DCNv4在InternImage模型中创建FlashInternImage,可实现高达80%的速度提升和性能改进而无需进一步修改。DCNv4在速度和效率方面的进步,以及其在各种视觉任务中稳健的性能表现,表明其作为未来视觉模型的基础构建块的潜力。

1、简介

计算机视觉领域,关于卷积网络(ConvNets)和Transformer哪个性能更优越的争论一直在进行。近年来,具有注意力机制的大型视觉模型中的Transformer模型[12、25、44]取得了显著成果,显示出超越ConvNets的潜力。然而,诸如InternImage [38]和ConvNeXt [26]等最新研究工作表明,基于ConvNet的视觉模型在各种下游任务中仍保持稳健的性能、效率和简单性,并具有适当的归纳偏差[15、41]。值得注意的是,在图像生成等领域[29、31],卷积仍然是首选方法。这一情况突显了基于卷积的方法的持久价值。

基于卷积的优势,先进的ConvNet模型InternImage的核心操作符Deformable Convolution v3(DCNv3)创新地将稀疏注意力机制与卷积相结合:它以滑动窗口的方式处理每个输出位置,使用小窗口大小(例如3×3=9),这类似于局部稀疏操作符如卷积,同时动态地采样点并具有适应性的范围,并使用输入相关的注意力权重聚合空间特征。由于其小窗口大小和ConvNet的归纳偏差,DCNv3有望实现更快的收敛速度和更低的推理延迟,尤其是在与密集的全局[12]或局部窗口式[25]的注意力方法相比时。
在这里插入图片描述

尽管有这些优势,DCN尚未成为视觉主干模型的优选解决方案。这一观察结果促使我们对DCN操作符的持久限制进行调查。我们首先注意到的是运行速度。DCN的慢速已知是一个长期存在的问题[1],因为它在采样非附近位置时引入了额外的开销,使其不适合现代卷积算法。我们在图1a中进行的比较分析揭示了DCNv3可能比经过适当优化的密集全局注意力[9]慢,这突显了进一步优化的必要性。此外,我们发现DCNv3在初始主干训练阶段甚至比全局注意力收敛得更慢,如图1b所示,这有点出乎意料,因为DCNv3配备了ConvNet的归纳偏差。

为了克服这些挑战,我们提出了Deformable Convolution v4(DCNv4),这是对稀疏DCN操作符进行实际效率优化的创新改进。DCNv4具有更快的实现和改进的操作符设计,以提高性能,我们将对其进行详细阐述:

首先,我们对现有实现进行指令级内核分析,发现DCNv3已经相当轻量级。计算成本不到1%,而内存访问成本占99%。这促使我们重新审视操作符实现,并发现DCN正向过程中的许多内存访问是多余的,因此可以进行优化,从而获得更快的DCNv4实现。

其次,受到卷积无界权重范围的启发,我们发现空间聚合中的softmax归一化在DCNv3中是不必要的,因为对于每个位置具有专用聚合窗口的操作符来说,这并不是一个要求。直观地说,softmax将权重限制在0到1的值范围内,这将限制聚合权重的表达力。这一见解促使我们在DCNv4中移除了softmax,增强了其动态属性并提高了性能。

因此,DCNv4不仅比DCNv3快得多,而且前向速度提高了3倍以上。这一改进使DCNv4能够充分利用其稀疏属性,成为最快的常见核心视觉操作符之一。

我们进一步将DCNv3替换为DCNv4,创建了FlashInternImage。值得注意的是,与未进行任何额外修改的InternImage相比,FlashInternImage实现了 50 8 ˜ 0 50\~80% 508˜0的速度提升。这一改进使FlashInternImage成为最快的现代视觉主干网络之一,同时保持了卓越的性能。在DCNv4的帮助下,FlashInternImage显著提高了在ImageNet分类[10]和迁移学习设置中的收敛速度,并在下游任务中进一步证明了其性能的改进。

此外,DCNv4显示出作为各种架构和任务中的通用视觉操作符的潜力。我们将DCNv4集成到其他现代主干架构中,包括ConvNeXt [26]和ViT [12],替换depthwise卷积[6]和密集自注意力层[35]。令人惊讶的是,这些精心设计的网络使用DCNv4时无需任何超参数调整即可表现出与原始网络相当的性能,同时速度更快,这表明动态、稀疏的DCNv4的高效性和有效性。此外,我们探索了DCNv4在生成模型中的潜力,将其作为新的应用领域。具体来说,我们将其应用于用于潜在扩散模型[29]的U-Net [30]架构中,用DCNv4替换常规卷积。实验结果表明, D C N v 4 \mathrm{DCNv} 4 DCNv4 在图像生成方面比基线表现更好,这表明使用DCNv4改进生成模型的巨大潜力。

我们将发布我们的DCNv4实现,并希望这个高效的运算符能够促进视觉社区的未来研究。

2、相关工作

视觉模型中的核心操作符:标准卷积[17]是最普遍和最有影响力的操作符,构成了大多数计算机视觉架构的支柱[14, 16, 32]。然而,许多具有独特特征的操作符在计算机视觉的发展中共同发挥着至关重要的作用。Depthwise separable convolution(DWConv)[6]将空间和通道操作分离,在开发轻量级和高效的模型方面具有重要作用[26,27]。RepLKNet [11]表明,利用大型内核深度卷积的纯卷积网络可以在效率和效果方面取得有竞争力的性能。Deformable Convolution(DCN)系列[7, 38, 47]通过向卷积核添加可学习的偏移量,显著提高了卷积的适应性。与卷积相反,注意力机制[35]具有建模长距离依赖的能力,并已成功应用于各种计算机视觉任务[3, 12, 24, 33]。窗口注意力[25,36]通过将注意力操作限制在固定大小的窗口中,减少了普通注意力所固有的计算复杂性。为了减轻普通注意力所涉及的高计算复杂性,可变形注意力[48]使每个查询集中于一定数量的关键采样点,这些采样点的位置和权重都是动态确定的。这种高效的方法在后续的艺术感知方法中得到广泛应用[4,19,21,22,43,45]。DynamicConv [40]和dynamicDWNet [13]通过整合动态权重增强了Depthwise卷积(DWConv),从而能够使用实例特定的动态适应权重。对于非网格结构化数据,稀疏操作符[34, 37, 42]利用双线性插值或参数化方式获得的动态权重。

视觉主干中的内存访问成本(MAC):如之前的研究[18, 27]所强调的,尽管浮点运算次数(FLOPs)是衡量模型复杂性的常用指标,但它并不能准确地表示模型的运行速度或延迟。在实际情况中,模型的运行速度受到多种因素的影响,而不仅仅是FLOPs。内存访问成本(MAC)在这方面起着特别重要的作用。[27]。通过减少对高带宽内存(HBM)的访问次数,Flash-Attention [9]在实践中实现了显著更快的速度,尽管与普通注意力相比,其浮点运算次数更高。虽然DCN操作在FLOPs方面没有劣势,但在相同的FLOPs预算下,与DW-Conv相比,它们的延迟要长得多,这主要是由于大量的内存访问成本。在本工作中,我们对与DCN操作相关的内存访问成本进行了深入分析和优化,显著加快了DCN的运行速度。

3、方法

3.1、重新思考可变形卷积的动态属性

重新审视DCNv3:给定一个输入 x ∈ R H × W × C \mathbf{x} \in \mathbb{R}^{H \times W \times C} xRH×W×C ,其中高度为 H ,宽度为 W ,通道数为 C ,每个点 p 0 p_{0} p0 的DCNv3操作由式 (2) 定义。
y g = ∑ k = 1 K m g k x g ( p 0 + p k + Δ p g k ) , (1) \mathbf{y}_{g} = \sum_{k=1}^{K} \mathbf{m}_{g k} \mathbf{x}_{g}\left(p_{0}+p_{k}+\Delta p_{g k}\right), \tag{1} yg=k=1Kmgkxg(p0+pk+Δpgk),(1)
y = concat ⁡ ( [ y 1 , y 2 , … , y G ] ,  axis=-1  ) , (2) \begin{aligned} \mathbf{y} & =\operatorname{concat}\left(\left[\mathbf{y}_{1}, \mathbf{y}_{2}, \ldots, \mathbf{y}_{G}\right], \text { axis=-1 }\right), \end{aligned} \tag{2} y=concat([y1,y2,,yG], axis=-1 ),(2)
其中 G 表示空间聚合组的数量。对于第 g 组, x g , y g ∈ R H × W × C ′ \mathbf{x}_{g}, \mathbf{y}_{g} \in \mathbb{R}^{H \times W \times C^{\prime}} xg,ygRH×W×C 表示切片的输入/输出特征图,其中 C ′ = C / G C^{\prime}=C / G C=C/G 表示组维度; m g k ∈ R \mathbf{m}_{g k} \in \mathbb{R} mgkR 表示第 g 组中第 k 个采样点的空间聚合权重(也称为调制标量),条件是输入 x \mathbf{x} x 并按 K 维度进行 softmax 归一化; p k p_{k} pk 表示预定义的网格采样点 ( − 1 , − 1 ) , ( − 1 , 0 ) , … , ( 0 , + 1 ) , … , ( + 1 , + 1 ) {(-1,-1),(-1,0), \ldots,(0,+1), \ldots,(+1,+1)} (1,1),(1,0),,(0,+1),,(+1,+1) 中的第 k 个位置,与常规卷积中的采样位置相同,而 Δ p g k \Delta p_{g k} Δpgk 是对应于第 g 组中网格采样位置 p k p_{k} pk 的偏移量。在 DCNv3 操作符之前和之后,可以在 x 和 y \mathbf{x} 和 \mathbf{y} xy 上应用 1 × 1 1 \times 1 1×1 的点对点卷积,以增强模型的表达能力,遵循可分离卷积 [6]。DCNv3 是卷积和注意力机制的组合:一方面,它以滑动窗口的方式处理输入数据,遵循卷积并具有其固有的偏置;另一方面,采样偏移量 Δ p \Delta p Δp 和空间聚合权重 m \mathbf{m} m 是从输入特征动态预测的,这显示了其动态属性,并使其更像是一种注意力机制。我们比较了具有各自属性的不同操作符,如图 2 所示。
在这里插入图片描述

softmax归一化:卷积和DCNv3之间的一个关键区别在于,DCNv3使用softmax函数对空间聚合权重 m \mathbf{m} m 进行归一化,遵循缩放点积自注意力机制的惯例。相反,卷积在其权重上并不使用softmax,并且仍然工作得很好。为什么注意力需要softmax的原因很简单:对于 Q , K , V ∈ R N × d \mathbf{Q}, \mathbf{K}, \mathbf{V} \in \mathbb{R}^{N \times d} QKVRN×d 的缩放点积自注意力机制,其定义如下:

softmax ⁡ ( 1 d Q K ⊤ ) V (3) \operatorname{softmax}\left(\frac{1}{\sqrt{d}} Q K^{\top}\right) V \tag{3} softmax(d 1QK)V(3)

其中 N 是同一注意力窗口中的点数(可以是全局 [12] 或局部 [25]),d 是隐藏维度,Q,K,V 是从输入计算得出的查询、键和值矩阵。在式 (3) 中需要使用 softmax 操作进行注意力计算;如果没有 softmax,可以先计算 K ⊤ V ∈ R d × d K^{\top} V \in \mathbb{R}^{d \times d} KVRd×d ,对于同一注意力窗口中的所有查询,这将退化为线性投影,导致性能下降。然而,对于像深度卷积和 DCNv3 这样的卷积算子,每个点都有自己专用的聚合窗口,每个聚合窗口中的值已经不同,并且没有“键”的概念,因此这种退化问题不再存在,归一化也变得不必要。事实上,使用 softmax 将固定在 0-1 范围内的卷积权重归一化,可能会对操作的可表达性造成很大限制,并使学习速度变慢。

在这里插入图片描述
为了证实这一假设,我们训练了一个 ConvNeXt 模型,并在卷积前对深度卷积权重的 7 × 7 7 \times 7 7×7 窗口应用了 softmax。我们从表 1 中的结果观察到,模型的性能和收敛速度都显著下降。这表明,对于每个位置有专用的聚合窗口的算子,如卷积或 DCN,与经过 softmax 归一化、范围有限的权重相比,范围不受限制的聚合权重提供了更好的表达能力。

增强动态属性:受到这一观察的启发,我们移除了 D C N v 3 \mathrm{DCNv}3 DCNv3 中的 softmax 归一化,将范围从 0 到 1 的调制标量转换为类似于卷积的不受限制的动态权重。如图 2 所示,这一改变进一步增强了 DCN 的动态属性,而其他算子具有某些限制,例如值范围有限(注意力/DCNv3)或具有与输入无关的聚合权重的固定聚合窗口(卷积)。图1b 显示,通过进行此更改,DCNv4 的收敛速度显著快于 DCNv3 和其他常见算子,包括卷积和注意力。第 4 节中的结果进一步表明,DCNv4 在预训练和迁移学习设置中均表现良好。

3.2、加速 DCN

理论上,DCN 作为一个具有 3 × 3 3 \times 3 3×3 窗口的稀疏算子,其运行速度应该快于其他采用更大窗口大小的常见算子,例如密集注意力或 7 × 7 7 \times 7 7×7 的深度卷积。然而,我们发现情况并非如此,如图 1a 所示。在本小节中,我们首先对 GPU 效率进行理论分析,指出内存访问成本会因读取内存的方式而产生很大的差异。我们根据观察结果进行优化,通过节省额外的内存指令,显著提高了 DCN 的速度,使稀疏算子的速度优势成为现实。

GPU 效率的理论分析 我们从对 DCNv3 算子的计算行为的理论检查开始研究。我们采用 roofline 模型来评估其性能,重点关注理论浮点运算和内存访问成本(MAC)。对于形状为 (H, W, C) 的输入和输出张量,DCNv3 算子需要 36 H W C F L O P s 36 H W C FLOPs 36HWCFLOPs,其中 3 × 3 3 \times 3 3×3 表示卷积核的空间维度,因子 4 用于每个采样点的双线性插值。

在这里插入图片描述

按照[27]中概述的框架,DCNv3的MAC计算为 2 H W C + 27 H W G 2 H W C + 27 H W G 2HWC+27HWG。第一项对应于输入/输出特征图的大小,第二项对应于DCNv3的偏移量和聚合权重,其中 G 组。假设组维度为 16,我们近似 G 为 C / 16 C / 16 C/16,得到大约 3.7 H W C M A C 3.7 HWC MAC 3.7HWCMAC。然而,这是在假设无限缓存和每个值只进行一次内存读取的理想情况下得出的,这在并行计算环境中常常是不现实的,因为并发线程执行需要同时进行数据访问。

为了估计最大的内存访问需求,我们考虑一个没有缓存的场景,其中每个输出位置都需要进行新的内存读取,双线性插值涉及 36 次读取,偏移/聚合权重涉及 27 次读取,并有一次写入操作,导致 MAC 为 64 H W C 64 HWC 64HWC。这比理想情况大 17 倍。

这一分析揭示了计算与内存访问之间的比率存在巨大差距(范围从 0.6 到 9.7 ),突显出内存访问优化的巨大潜力。值得注意的是,尽管 DCNv3 使用输入依赖的动态偏移量导致非确定性内存访问,但同一组内的通道共享偏移值这一事实是确定的。这促使我们提出一种特定的优化策略来提高 DCNv3 的速度。

消除冗余工作负载:在之前对 DCN 内核的 CUDA 实现中,对于形状为 ( H , W , C ) 1 (H, W, C)^{1} (H,W,C)1 的输入、偏移 ( H , W , G , K 2 × 2 H, W, G, K^{2} \times 2 H,W,G,K2×2) 和聚合权重 ( H , W , G , K 2 H, W, G, K^{2} H,W,G,K2) ,我们将创建总计 H × W × C H \times W \times C H×W×C 个线程以最大限度地提高并行性,其中每个线程处理一个通道的输出位置。值得注意的是,每个组内的 D = C / G D=C / G D=C/G 个通道对于每个输出位置共享相同的采样偏移和聚合权重值。使用多个线程在相同输出位置上处理这些 D 个通道是浪费的,因为不同线程会多次从 GPU 内存中读取相同的采样偏移和聚合权重值,这对于内存受限的操作来说是至关重要的。在每个输出位置使用一个线程处理同一组内的多个通道可以消除这些冗余的内存读取请求,大大减少内存带宽的使用。由于采样位置相同,我们也可以只计算一次 DCN 中使用的双线性插值系数。具体来说,如果每个线程处理 D ′ D^{\prime} D 个通道,读取偏移和聚合权重的内存访问成本以及计算双线性插值系数的计算成本都可以降低 D ′ D^{\prime} D 倍。

消除冗余内存指令:实际上,仅仅重复使用线程处理多个通道并不会看到速度上的提升。原因是当 D ′ D^{\prime} D 增加时,我们创建的线程数减少,现在每个线程的工作负载增加了 D ′ D^{\prime} D 倍。这实质上降低了 CUDA 内核的并行度。幸运的是,由于双线性插值只需要对所有 D ′ D^{\prime} D 个通道执行一次,DCN 内核的计算量现在变得很轻,并且大部分工作负载是读取不同通道的输入值的内存指令。当内存布局为通道最后时,所有 D ′ D^{\prime} D 个通道的值都是连续的,我们可以利用向量化的加载:例如,从内存中读取四个 32 位浮点值,而不是使用四个指令四次读取一个 32 位浮点值,我们可以使用单个指令一次性加载一个 128 位打包的值,从而减少每个线程的指令数和执行时间。当将最终结果写入 GPU 内存时,我们可以应用类似的技巧,以最小化内存访问时间并提高内存带宽利用率。此外,现代的半精度数据格式( f l o a t 16 / b f l o a t 16 float16/bfloat16 float16/bfloat16)将需要加载的字节数减半,这意味着在相同的内存带宽下,使用半精度格式时的内存效率可以提高一倍。然而,在原始的 DCNv3 实现中,我们没有看到使用半精度数据带来的速度提升,这可能是由于数据访问和计算的开销过大,而在我们的新实现中,速度提升是显著的。值得注意的是,上述优化技术也可以应用于 DCNv1/v2 和可变形注意力 [48],因为它们具有相似的性能瓶颈和问题。

DCNv3 模块中的微设计:DCNv3 模块引入了多种微设计;随着核心内核的优化,它们对速度的影响变得不可忽视。我们确定了 DCNv3 设计中可以进一步优化的两点:首先,在移除 softmax 并将调制标量转换为动态聚合权重之后(如前文所述)。用于计算偏移和动态权重的线性层实际上可以合并为一个线性层。这减少了网络碎片化,消除了额外的开销,例如内核启动和同步,提高了 GPU 上的运行时效率;其次,在原始的 DCNv3 模块设计中,使用了一个由 d e p t h w i s e 3 × 3 c o n v depthwise 3 \times 3 conv depthwise3×3conv、层归一化(LN)、GELU 和线性层组成的复杂子网络来计算偏移和动态权重。遵循 Xception [6] 中的设计,我们删除了额外的 LN-GELU 层,并使用了原始的分离卷积结构,进一步减少了运行时间。我们通过经验发现,如果延迟是更高的优先级,也可以只进行微小的性能牺牲而删除 depthwise 卷积。

4、实验

本节中,我们将从速度和性能两个角度验证我们提出的 DCNv4 模块的有效性。我们首先对操作级别速度进行基准测试,并将 DCNv4 集成到主干模型中以进一步测试系统级别性能。所有速度测试结果均使用 NVIDIA A100 80G SXM GPU 获得。由于篇幅限制,我们将其他实验结果和实现细节(包括其他超参数设置和硬件/软件环境)放在补充文件中。

4.1、操作级别速度基准测试

设置:我们通过仅测量构建最先进视觉主干模型的几个代表性操作的时间来进行 op 级别的基准测试,包括使用 PyTorch 实现的完整注意力 [35] 和先进的 FlashAttention-2 [8] 实现、窗口大小为 7 × 7 7 \times 7 7×7 的窗口注意力 [25]、使用 cuDNN [5] 和 PyTorch 的 ATen 库 [28] 实现的深度卷积(窗口大小为 7 × 7 7 \times 7 7×7)。为了简化,我们只对空间聚合的核心操作进行基准测试,并且排除了附加的线性层,例如 qkv 投影和输出投影层,这些不包括在运行时测量中。请参阅补充文件以获得更全面的模块级别比较。对于输入规模,我们首先考虑使用 4 , 8 , 16 , 32 × 4,8,16,32 \times 4,8,16,32× 下采样率的通用分层 ConvNet/transformer 主干所使用的标准 224 × 224 224 \times 224 224×224 输入分辨率生成的特征图形状;我们还添加了像 ViT 这样具有下采样率 16 和更大隐藏维度的各向同性主干中的特征图形状。 对于分层特征图和各向同性特征图,我们将输入形状分别设置为 800 × 1280 800 \times 1280 800×1280 1024 × 1024 1024 \times 1024 1024×1024,这是目标检测中的常见做法 [15,20]。对于这两种输入集,批量大小分别为 64 和 1。对于具有头/组概念的运算符,我们将每个头/组的维度设置为 32,并在隐藏维度变化时更改头/组的数量。
在这里插入图片描述

结果:我们分别在表 2 和表 3 中展示了标准分辨率和高分辨率输入的基准测试结果。我们报告了使用 FP32 和 FP16 数据格式的结果,但 FlashAttention 没有 FP32 实现。使用 PyTorch 实现的密集全局注意力在输入分辨率较大时显著变慢,甚至超出内存。FlashAttention 显著提高了注意力的速度,在某些情况下甚至比 7 × 7 7 \times 7 7×7 窗口注意力更快,这表明适当的优化非常重要。然而,它并没有改变注意力的二次复杂性;当输入分辨率较高时,它仍然落后于本地/稀疏运算符,如窗口注意力或卷积。虽然 DCNv3 可以比使用纯实现方式的 DWConv 更快,但它比经过大量优化的 cuDNN 版本慢。相反,我们的 DCNv4 可以提供比 DCNv3 快 3 倍以上的速度提升,大大节省了运行时间。此外,DCNv4 可以成功利用使用 3 × 3 3 \times 3 3×3 稀疏窗口的优势,在各种设置下显著快于其他基线。
在这里插入图片描述

4.2、图像分类

设置:我们评估了 DCNv4 在 ImageNet 分类任务上的有效性。我们从强大的基准模型 InternImage [38] 开始,因为它在基于 ConvNet 的模型中表现出最佳性能。我们将 InternImage 中的原始 DCNv3 替换为 DCNv4,并创建了 FlashInternImage。所有其他实现细节,包括网络架构和超参数,均与 [38] 保持一致。我们还比较了 Swin-Transformer 和 ConvNeXt,它们是 Transformer 和 ConvNet 模型中的两个代表性基准。我们遵循常见的做法 [25,26,38],在 I m a g e N e t − 1   K ImageNet-1 \mathrm{~K} ImageNet1 K上对 FlashInternImage-Tiny/Small/Base 进行 300 个 epoch 的训练。首先在 ImageNet-22K 上对 FlashInternImage-Large 进行 90 个 epoch 的训练,然后在 I m a g e N e t − 1   K ImageNet-1 \mathrm{~K} ImageNet1 K 上进行 20 个 epoch 的微调。其他基准模型采用相同的设置以进行公平比较。
在这里插入图片描述

结果:表 4 显示了不同规模的模型结果。除了模型大小和训练/推理分辨率外,我们还报告了每个模型在 FP32/FP16 数据格式下的整体吞吐量(每秒处理的图像数)。为了公平比较,我们使用 timm [39] 对 ConvNeXt 和 Swin Transformer 进行实现,这实际上比原始实现更快。配备 DCNv4 的 FlashInternImage 显著提高了 InternImage 的吞吐量,提高了 50 % ∼ 80 % 50 \% \sim 80 \% 50%80% ,并略微提高了模型性能。FlashInternImage 现在以更高的准确率与 ConvNeXt 的速度相匹配。值得注意的是,FlashInternImage-S 可以优于 ConvNeXt-B( 84.4 % v s . 83.8 % 84.4 \% vs. 83.8 \% 84.4%vs.83.8%)的同时还比它更快,这表明速度和准确率之间的权衡更佳。此外,FlashInternImage-L 甚至可以超过 ConvNeXt-XL 和 InternImage-XL,并比它们快 30 % ∼ 130 % 30 \% \sim 130 \% 30%130% (401 vs. 174),这表明我们的 DCNv4 模块非常有效。

4.3、高分辨率输入的下游任务

我们进一步评估了 DCNv4 在具有高分辨率输入的代表性下游感知任务中的性能,包括实例分割、语义分割和 3D 目标检测。我们保持与 InternImage 相同的所有实现细节,并仅更改主干模型以进行公平比较。在训练下游模型时,主干模型使用 ImageNet 的预训练权重进行初始化。
在这里插入图片描述

实例分割:我们使用两个代表性的实例分割框架(Mask R-CNN [15] 和 Cascade Mask-RCNN [2])在 COCO 数据集 [23] 上对 FlashInternImage 进行训练,训练计划为 1 × ( 12 个 e p o c h s ) 1 \times (12 个 epochs) 1×(12epochs) 3 × ( 36 个 e p o c h s ) 3 \times (36 个 epochs) 3×(36epochs)。结果在 表5 中展示。我们还报告了批量大小为 16 的 FPS,包括 FP32/FP16 数据格式。FlashInternImage 在所有模型规模和训练计划上都表现出优越的结果,实现了更高的速度与准确率的权衡。例如,FlashInternImage-T/S 在与相同规模的模型相比时表现出色,并且与更大的 InternImage-S/B 相当,但速度要快 80 % − 90 % 80 \%-90 \% 80%90%
在这里插入图片描述

语义分割:我们使用 UperNet [41] 在 ADE20K [46] 数据集上对 FlashInternImage 进行 160   K 160 \mathrm{~K} 160 K 次迭代训练进行语义分割。从 表6 中的结果可以得出与实例分割相似的结论,我们还报告了批量大小为 16 的 FP32/FP16 数据格式的 FPS。配备 DCNv4 的 FlashInternImage 可以显著提高速度,并在不同模型规模上进一步改进 InternImage 的性能,从而实现了新的最佳性能。
在这里插入图片描述

3D 检测:我们进一步在自动驾驶场景中的基于相机的 3D 物体检测任务上测试 DCNv4。我们使用 FlashInternImageSmall 和 Base 主干模型在 nuScenes 数据集上对 BEVFormer v2 [43] 进行 24 个 epoch 的训练,BEVFormer v2 是一个最先进的基于多相机的 3D 物体检测器。我们在 表7 中报告了 nuScenes 测试集上的结果,并报告了每个模型的 FPS。我们注意到 BEVFormer v2 中的头部分,如 BEV 编码器和对象解码器,还有待优化,运行时间超过 50 % 50 \% 50% (随着更快的骨干网络,这一比例甚至更高)。因此,我们还报告了骨干网络的 FPS,以便更清楚地说明。我们的结果表明,仅考虑骨干网络时,FlashInternImage 的速度是 InternImage 的两倍甚至三倍,同时性能相当,大大提高了模型效率。

4.4、DCNv4 作为通用运算符

在其他视觉骨干网络中的直接替换:我们验证 DCNv4 是否可以在使用其他运算符设计的架构中正常工作,例如 ConvNeXt 和 Vision Transformer (ViT)。为了实现这一目标,我们将在 ViT 和 ConvNeXt 中用 DCNv4 替换注意力模块和深度卷积层,并在 ImageNet-1K 上进行有监督学习,同时不改变任何其他架构和超参数,类似于 FlashInternImage 和 InternImage。结果在表4 中展示。我们可以看到,在这些针对特定运算符进行精心调整的架构中,我们的 DCNv4 同样表现出色。由于 DCNv4 的速度快,新模型甚至可以实现更高的吞吐量,展现了 DCNv4 的卓越性能。

在扩散模型中进行直接替换:DCN 已被公认为感知任务的有效的运算符。随着生成模型成为 AI 生成内容 (AIGC) 的基本工具,我们也很好奇 DCNv4 是否能在基于扩散的生成模型上很好地完成生成任务。具体来说,我们选择 Stable Diffusion [29] 中使用的 U-Net [30] 作为基准,并用 DCNv4 替换 U-Net 中的注意力模块和常规 3x3 卷积。我们使用 U-ViT 的代码库,遵循其训练计划,并根据 Stable Diffusion 提供的图像自编码器提取的图像潜在值训练一个潜在扩散模型。我们将在表9中展示结果。我们可以看到,DCNv4 在生成建模中同样表现良好,与 U-Net 中的常规卷积相比,它在 FID/吞吐量方面取得了更好的结果,同时参数更少。请注意,架构/超参数可能不是为 DCNv4 优化的,重新设计模型或为 DCNv4 搜索新超参数可能会得到更好的结果。

在这里插入图片描述

4.5、消融实验

我们在第 3.2 节中描述的优化选择中进行了消融实验。结果在表10 中展示。表中的时间是在 56x56x128 的输入、批量大小为 64 和 4 组(每组 32 个通道)的条件下获得的。我们首先移除了 softmax 操作并改进了微观设计,这意味着我们将两个线性层合并为一个,并删除了在偏移/聚合权重计算中代价高昂的层归一化和 GELU 激活函数,简化了整体模块并提高了速度。然后,我们开始修改内核实现。首先,我们改变了并行执行模式,让每个线程处理 8 个通道而不是 1 个通道,从而可以节省从 GPU 内存中加载采样偏移和聚合权重值的无谓内存访问。正如我们所预期的那样,仅应用此更改不会增加速度,因为并行度降低,现在每个线程的工作负载增加了 8 倍。延迟反而增加了。通过重用双线性插值系数(第 4 行)消除冗余计算可以节省一些时间,但效果并不明显。通过向量化加载/存储消除冗余内存指令可以大大减少每个线程的工作负载,并大大加速 GPU 内核速度(第 5 行)。使用半精度数据类型(减少内核读取/写入所需字节数的一半)进一步增加了数据吞吐量,如第 6 行所示。最后,我们达到了最终的 DCNv4 设计,其效率是原始实现的 3 倍。

5、结论

我们提出了可变形卷积 v4 (DCNv4),一种高效的动态和稀疏运算符。通过重新思考可变形卷积中的动态属性并简化内存访问,DCNv4 成为比其前身 DCNv3 更快、更有效的运算符。配备 DCNv4 的 FlashInternImage 骨干网络不仅提高了速度,还改善了各种视觉任务的表现。我们进一步展示了 DCNv4 作为通用运算符的多功能性和有效性,通过将其集成到 ConvNeXt 和 ViT 等最先进的架构中,提高了吞吐量和准确性;它还适用于潜在扩散模型,显示出增强生成模型的潜力。

A、实现细节

环境:我们使用 A100 80GB SXM GPU 对所有实验进行吞吐量基准测试。软件环境是 PyTorch 1.13、CUDA 11.7、cuDNN 8.5。当测试 Flash Attention [8] 时,我们使用 Flash Attention 2.3.1。当测试 Swin Transformer 中的窗口注意力时,我们使用 timm 0.9.7 [39] 中的 PyTorch 实现。

COCO 的 2D 目标检测:为了验证我们方法在 2D 目标检测中的有效性,我们采用了两种目标检测方法:Mask R-CNN 和 Cascade Mask R-CNN,主要参考了 Internimage 的设置。按照常规做法,我们使用了两个训练计划:1x(12 个周期)和 3x(36 个周期),以分别评估模型的收敛速度和最终性能。对于 1x 计划,我们将图像的短边调整为 800 像素,长边不超过 1333 像素。在评估阶段,输入图像的短边始终设置为 800 像素。对于 3x 计划,短边调整为介于 480 和 800 像素之间的范围,而长边仍限制在 1333 像素。基础学习率设为每个批次 16 的 1 e − 4 1 \mathrm{e}^{-4} 1e4 。我们采用 AdamW 优化器,并加入权重衰减为 0.05 。骨干网络的初始化是预训练的分类权重。

ADE20K 的 2D 语义分割:我们采用了 UperNet 来验证我们方法在 ADE20K 数据集上的 2D 语义分割的有效性。我们的实验设置主要基于 InternImage。对于 FlashInternImage-T/S/B 和 FlashInternImage-L,我们分别使用学习率为 6 e − 5 6 \mathrm{e}^{-5} 6e5 2 e − 5 2 \mathrm{e}^{-5} 2e5 的 AdamW 优化器。FlashInternimage T/S/B 的裁剪大小设置为 512,而 FlashInternImage-L 的裁剪大小设置为 640。我们使用批量大小为 16 的所有模型进行 160k 次迭代,以确保与之前的方法进行公平比较。骨干网络的初始化也是预训练的分类权重。

nuScenes 的 3D 目标检测:我们采用了 BEVFormerV2 来验证我们方法在 nuScenes 数据集上的 3D 目标检测的有效性。遵循 BEVFormerV2 的设置,骨干网络的初始化是在 COCO 数据集上预训练的。与 BEVFormerV2 一致,我们使用了总共 8 秒的数据,包括过去和未来的信息。我们使用批量大小为 16、学习率为 4 e − 4 4 \mathrm{e}^{-4} 4e4 的 AdamW 优化器。我们训练模型 24 个周期。

B、其他实验结果

具有高级头部的下游结果:我们采用了更高级的 DINO [45] 和 Mask2Former [4] 来进一步验证我们的 FlashInternImage 的有效性,如表1 和 表3 中所示。对于 COCO 的 2D 目标检测与 DINO 头部,我们使用 12 个周期训练我们的模型。在训练阶段,我们采用与上面介绍相同的多种尺度训练策略。其他设置,包括优化器、权重衰减和学习率,与 Mask-RCNN 中使用的设置相同。对于 ADE20K 的 2D 语义分割,我们将学习率设置为 1e-4,批量大小为 16 。对于 Base 和 Large scale,我们使用裁剪大小为 640 。其他设置与 UperNet 中使用的设置相同。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在更高级任务头部的应用下,我们的方法在准确度方面仍保持显著优势,同时在推理速度方面也具有竞争力。

其他骨干网络的下游结果:如表4 中所示,我们评估了 “ConvNext+DCNv4” 和 “ViT+DCNv4” 在下游任务中的性能,特别是使用 UperNet 头部的语义分割任务。我们的观察结果表明,将以前使用的 DWConv 或 Attention 替换为我们的 DCNv4 可以提高推理速度。对于 ConvNext,使用 DCNv4 而非 DWConv 可以获得更高的性能。
在这里插入图片描述

图像生成的可视化:为了更好地说明,我们在图1中展示了我们的潜在扩散模型与DCNv4的定性结果。DCNv4也可以很好地应用于这个生成任务。

模块级速度基准:我们在表2和5中展示了模块级速度基准结果,其中还考虑了每个操作中的附加线性投影层。我们还包括了一个混合通道信息的3x3窗口常规卷积。对于DCNv4,我们展示了两种变体:第一种实现移除了模块内部的输入/输出投影层(标记为轻量级)。我们在"ConvNeXt + DCNv4"实验中使用这个实现,因为它具有与原始深度卷积在ConvNeXt中相似的属性(仅执行空间聚合)和计算量/参数数量。第二种实现包括输入/输出线性投影,并在本文中描述的其他模型中使用。
在这里插入图片描述

在这里插入图片描述


http://www.niftyadmin.cn/n/5349717.html

相关文章

【笔试常见编程题01】删除公共字符串、组队竞赛、倒置字符串、排序子序列

1. 删除公共字符串 输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。 例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.” 输入描述 每个测试输入包含2个字符串 输出描述 输出删除后的…

【mongoDB】创建用户账号和权限

使用use database_name 命令创建或切换到一个数据库 查看用户 show users 输入该命令后,无数据表示该数据库没有用户 创建用户 user:" freedom " 表示用户名为freedom pwd:" 123456 ” 表示密码为123456 roles:[" root "] …

JVM篇----第九篇

系列文章目录 文章目录 系列文章目录前言一、分代收集算法二、新生代与复制算法三、老年代与标记复制算法前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 一、分代…

Flutter 点击空白处关闭软键盘,点击非TextField 关闭软键盘的方法

1:点击空白处(非控件上)关闭软键盘。 此方法有个问题,就是点击非空白区域,不会关闭软键盘,比如点击旁边的其他按钮,则软键盘还在。只适合点击空白处关闭软键盘 在 main.dart 入口 build 中增加 builder: (context, ch…

力扣0087——扰乱字符串

扰乱字符串 难度:困难 题目描述 使用下面描述的算法可以扰乱字符串 s 得到字符串 t : 如果字符串的长度为 1 ,算法停止如果字符串的长度 > 1 ,执行下述步骤: 在一个随机下标处将字符串分割成两个非空的子字符串…

【大数据】详解 Flink 中的 WaterMark

详解 Flink 中的 WaterMark 1.基础概念1.1 流处理1.2 乱序1.3 窗口及其生命周期1.4 Keyed vs Non-Keyed1.5 Flink 中的时间 2.Watermark2.1 案例一2.2 案例二2.3 如何设置最大乱序时间2.4 延迟数据重定向 3.在 DDL 中的定义3.1 事件时间3.2 处理时间 1.基础概念 1.1 流处理 流…

Spring Boot 项目的创建和启动

文章目录 什么是 Spring Boot创建Spring Boot 项目IDEA网页版 Spring Boot 的使用项目目录介绍项目启动实现 Hello 输出 什么是 Spring Boot Spring 的诞生是为了简化 Java 程序的开发的,而 Spring Boot 的诞生是为了简化 Spring 程序开发。 也就是说 Spring Boot…

DevOps系列文章之 GitLabCI汇总

GitlabCI环境搭建 前提 先安装 docker Docker容器化安装 docker pull gitlab/gitlab-ee:12.4.0-ee.0 创建挂载目录 mkdir -p /srv/gitlab mkdir -p /srv/gitlab/config # 映射到 Glitlab 容器中的配置目录 mkdir -p /srv/gitlab/logs # 映射到 Glitlab 容器中的日志目录 m…