本文主要是介绍2024年6月10日~2024年6月16日周报,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 一、前段时间工作
- 二、完成情况
- 2.1 可变形卷积的学习
- 2.1.1 Introduction-介绍
- 2.1.2 Related Work-相关工作
- 2.1.3 Method-方法
- 2.1.3.1 可变形卷积动态属性的重认识
- 2.1.3.2 Speeding up DCN—加速DCN
- 2.2 部署可变形卷积
- 三、假期计划
一、前段时间工作
在之前一段时间主要完成了以下任务的学习:
- 1.完成毕业设计;
- 2.学习师兄的Deepwave博客;
- 3.部署可变形卷积v4
二、完成情况
2.1 可变形卷积的学习
- 标题: Efficient Deformable ConvNets: Rethinking Dynamic and Sparse Operator for Vision Applications(高效的可变形ConvNets:重新思考视觉应用中的动态和稀疏算子)
- 代码:https://github.com/OpenGVLab/DCNv4
- 摘要:我们介绍了Deformable Convolution v4(DCNv4),这是一个针对广泛视觉应用设计的高效有效的运算符。DCNv4解决了其前身DCNv3的限制,且有两个关键的增强: 1. 在空间聚合中移除了softmax归一化,以增强其动态特性和表达能力;2. 优化内存访问以减少冗余操作以提高速度。 这些改进使DCNv4相比DCNv3具有显著更快的收敛速度和大幅提高的处理速度,DCNv4的前向计算速度超过了其前身的三倍。DCNv4在各种任务中表现卓越,包括图像分类、实例和语义分割,尤其在图像生成方面。将其与诸如潜在扩散模型中的U-Net等生成模型相结合时,DCNv4的表现优于其基线,表明它在提升生成模型方面具有潜力。在实际应用中,将DCNv3替换为DCNv4到InternImage模型中以创建FlashInternImage,带来了高达80%的速度提升和更好的性能,无需进一步修改。DCNv4在速度和效率上的改进,加上其在各种视觉任务中出色的性能,展示了其作为未来视觉模型基础构建模块的潜力。
2.1.1 Introduction-介绍
在计算机视觉领域,关于卷积网络(ConvNets)和Transformer哪个性能更优的讨论一直存在。近年来,带有注意力机制的Transformer模型已经在大型视觉模型中取得了显著成果[12,25,44],显示出超越ConvNets的潜力。然而,像InternImage [38]和ConvNeXt [26]等最近的工作表明,基于ConvNet的视觉模型保留了强大的性能、效率、简单性和适合各种下游任务的归纳偏差[15,41]。值得注意的是,在图像生成[29,31]等领域,卷积仍然是首选方法。这种情况揭示了基于卷积的方法的持久价值。
基于卷积的优势,DCNv3(Deformable Convolution v3)作为先进ConvNet模型InternImage的核心运算符,创新地将稀疏注意力机制与卷积结合起来:它以滑动窗口的方式处理每个输出位置,窗口大小较小(例如3×3=9个点),这充当了类似卷积的局部、稀疏运算符,同时通过自适应范围动态采样点,并根据输入相关的注意力权重聚合空间特征。由于其较小的窗口大小和ConvNet的归纳偏差,预计DCNv3将实现更快的收敛速度和更低的推断延迟,特别是与密集全局[12]或基于局部窗口[25]的注意力方法相比。
尽管具有这些优势,DCN并没有成为视觉骨干模型的首选解决方案。这一观察结果促使我们调查DCN运算符的持续限制。我们首先注意到的是运行速度。DCN的缓慢速度被认为是一个长期存在的问题,因为它在采样非附近位置时引入了额外的开销,使其不适用于现代卷积算法。我们的比较分析(如图1a所示)显示,DCNv3甚至可能比经过适当优化的密集全局注意力还要慢,突显了进一步优化的必要性。此外,我们发现在初始骨干训练阶段,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能充分发挥其稀疏属性,成为最快速的常见核心视觉运算符之一。
我们进一步将InternImage中的DCNv3替换为DCNv4,创建了FlashInternImage。值得注意的是,与未进行任何额外修改的InternImage相比,FlashInternImage实现了50%到80%的速度提升。这一增强将FlashInternImage定位为最快速的现代视觉骨干网络之一,同时保持卓越的性能。在DCNv4的帮助下,FlashInternImage在ImageNet分类和迁移学习设置中显著提高了收敛速度,并在下游任务中进一步展示了改进的性能。
此外,DCNv4在各种架构和任务中都显示出作为通用视觉运算符的潜力。我们将DCNv4整合到其他现代骨干架构中,包括ConvNeXt [26]和ViT[12],替换深度可分卷积[35]和密集自注意力层[35]。令人惊讶的是,在没有任何超参数调整的情况下,这些精心设计的具有DCNv4的网络表现相当,同时速度更快,展示了动态稀疏DCNv4的有效性和效率。此外,我们探索了将DCNv4应用于生成模型作为新的应用领域的潜力。具体而言,我们将其应用于用于潜在扩散模型的U-Net架构,替换常规卷积。我们的实验结果显示,DCNv4在图像生成方面的表现优于基准线,显示了使用DCN来改进生成模型的巨大潜力。
我们将发布DCNv4的实现,并希望这一高效的运算符能促进视觉领域未来的研究。
2.1.2 Related Work-相关工作
- 视觉模型中的核心运算符:标准卷积[17]是最流行和最有影响力的运算符,构成了大多数计算机视觉架构的基础[14,16,32]。然而,许多具有独特特性的运算符共同在计算机视觉的发展中起着关键作用。深度可分离卷积(DWConv)[6]分离了空间和通道操作,在开发轻量级和高效模型方面至关重要[26,27]。RepLKNet [11]表明,纯卷积网络利用大核深度可分卷积可以在效率和有效性方面达到竞争性的性能。可变形卷积(DCN)系列[7,38,47]通过向卷积内核添加可学习的偏移量,显着提高了卷积的适应性。与卷积相反,注意力机制[35]具有建模远程依赖关系的能力,并已成功应用于各种计算机视觉任务[3,12,24,33]。窗口注意力[25,36]通过将注意力操作限制在固定大小的窗口中,降低了原始注意力的计算复杂度。为了减轻原始注意力所带来的高计算复杂度,可变形注意力[48]使每个查询能够集中在选定数量的关键采样点上,并动态确定位置和权重。这种有效的方法广泛用于以下领域的感知方法[4,19,21,22,43,45]。DynamicConv [40]和dynamicDWNet [13]通过结合动态权重[4,19,21,22,43,45]来增强深度可分卷积(DWConv),从而实现了动态权重的使用,使其能够动态适应。对于非网格结构化数据,稀疏算子[34,37,42]利用通过双线性插值或参数化方式获得的动态权重。
- 视觉骨干中的内存访问成本(MAC):正如以前的研究所强调的那样[18,27],FLOP虽然是衡量模型复杂性的常用指标,但并不能准确地表示模型的速度或延迟。在实际场景中,模型的运行速度受到多种因素的影响,而不仅仅是FLOP。在这种情况下,内存访问成本(MAC)起着特别重要的作用[27]。Flash—Attention [9]通过减少对高带宽内存(HBM)的访问次数,在实践中实现了更快的速度,尽管与普通注意力相比具有更高的FLOP。虽然DCN运营商在FLOP方面没有表现出劣势,但在相同的FLOP预算下,它们的延迟与DW—Conv相比要长得多,这主要是由于大量的存储器访问成本。在这项工作中,我们进行了深入的分析和优化的内存访问成本与DCN运营商,显着加快DCN的运行速度。
2.1.3 Method-方法
2.1.3.1 可变形卷积动态属性的重认识
重温DCNv3:给定输入 x ∈ R H × W × C x \in \mathbb{R}^{H\times W \times C} x∈RH×W×C,其中高度为 H H H,宽度为 W W W,通道数为 C C C。对于每个点 p 0 p_{0} p0,使用 K K K个点定义了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}_{gk}\mathbf{x}_{g}(p_{0}+p_{k}+\Delta p_{gk}) ,\tag{1} yg=k=1∑Kmgkxg(p0+pk+Δpgk),(1)
y = c o n c a t ( [ y 1 , y 2 , … , y G ] , a x i s = − 1 ) , (2) \mathbf{y} = \mathbf{concat}([\mathbf{y}_1,\mathbf{y}_2,\dots,\mathbf{y}_G],axis=-1),\tag{2} y=concat([y1,y2,…,yG],axis=−1),(2)
其中, G G G表示空间聚合组的数量。对于第 g − t h g-th g−th个组, x g , y g ∈ R H × W × C \mathbf{x}_g,\mathbf{y}_g\in\mathbb{R}^{H\times W \times C} xg,yg∈RH×W×C表示具有 C ′ = C / G C^{'}=C/G C′=C/G的组维数的切片输入/输出特征图; m g k ∈ R \mathbf{m}_{gk}\in\mathbb{R} mgk∈R表示第 g g g组中第 k k k个采样点的空间聚合权重(也称为调制标量),它是对输入 x x x条件化并通过softmax函数在维度 k k k上进行归一化的; p k p_{k} pk表示预定义网络采样的第 k k k个位置{(-1,-1),(-1,0),…,(0,+1),…,(+1,+1)}就像常规卷积中一样,并且 Δ p g k \Delta p_{gk} Δpgk是与第 g g g组中网络采样位置 p k pk pk对应的偏移量。在DCNv3运算符之前和之后可以对x和y进行1×1点卷积,以增强模型的表达能力[6],遵循可分离卷积的方法。DCNv3是卷积和注意力的组合:一方面,它以滑动窗口的方式处理输入数据,这遵循了卷积的方式并具有其归纳偏差;另一方面,采样偏移量∆p和空间聚合权重m是从输入特征动态预测的,显示了其动态特性,并使其更像是一个注意力机制。我们比较了不同的运算符,每个运算符都有其自己的特性,如图2所示。
Softmax 归一化:卷积和 DCNv3 之间的一个关键区别在于,DCNv3 使用 softmax 函数对空间聚合权重 m 进行归一化,遵循了缩放点积自注意力的惯例。相反,卷积没有在其权重上使用 softmax,但仍然能够很好地工作。注意力需要 softmax 的原因很明显:带有 Q 、 K 、 V ∈ R N × d Q、K、V\in\mathbb{R}^{N\times d} Q、K、V∈RN×d的缩放点积自注意力的定义如下:
s o f t m a x ( 1 d Q K T ) (3) softmax(\frac{1}{\sqrt{d}}QK^{T})\tag{3} softmax(d1QKT)(3)
其中,N 是同一注意力窗口中的点的数量(可以是全局的[12]或局部的[25]),d 是隐藏维度,Q、K、V 是从输入计算得到的查询、键和值矩阵。在注意力中,Eq. (3) 中需要进行 softmax 操作;如果没有 softmax,可以先计算 K T V ∈ R d × d K^TV ∈ \mathbb{R}^{d×d} KTV∈Rd×d,并且对于同一注意窗口中的所有查询,它退化为线性投影,从而导致性能退化。然而,对于深度卷积和 DCNv3 等卷积运算符,每个点都有自己专用的聚合窗口,并且每个聚合窗口中的值已经不同,而且没有“键”概念,因此这种退化问题不再存在,归一化变得不再必要。事实上,对于在固定的 0-1 范围内使用 softmax 对卷积权重进行归一化可能会对运算符的表达能力造成显著的限制,并且使学习速度变慢。
为了验证这一假设,我们训练了一个 ConvNeXt 模型,并在卷积前将深度卷积权重的 7×7 窗口应用了 softmax。从表1的结果中,我们观察到模型性能以及收敛速度显著下降。这表明,对于每个位置都有专用聚合窗口的运算符(如卷积或 DCN),具有无界范围的聚合权重比 softmax 归一化的有界范围权重具有更好的表达能力。
增强动态特性:受到这一观察的启发,我们在DCNv3中移除了softmax归一化,将调制标量从0到1转换为与卷积类似的无界动态权重。如图2所示,这种改变进一步增强了DCN的动态特性,其中其他运算符具有一定的限制,如有界值范围(注意力/DCNv3)或固定聚合窗口与输入无关的聚合权重(卷积)。图1b显示,通过进行这种改变,DCNv4的收敛速度显著快于DCNv3和其他常见运算符,包括卷积和注意力。第4节的结果进一步展示了DCNv4在预训练和迁移学习设置中的良好表现。
2.1.3.2 Speeding up DCN—加速DCN
理论上,DCN作为一个使用3×3窗口的稀疏运算符,应该比其他使用更大窗口大小的常见运算符,如密集注意力或7×7深度卷积,更快地执行。然而,我们发现事实并非如此,如图1a所示。在本小节中,我们首先对GPU效率进行了理论分析,显示了根据我们如何读取内存而产生的内存访问成本的巨大差异。我们进一步根据观察结果进行了优化,通过节省额外的内存指令,显著提高了DCN的速度,并将作为稀疏运算符的速度优势带入了现实。
GPU效率的理论分析:我们的研究从对DCNv3运算符的计算行为进行理论检查开始。我们采用屋顶线模型评估其性能,重点关注理论FLOPs和内存访问成本(MAC)。对于形状为(H,W,C)的输入和输出张量,DCNv3运算符需要36HWC个FLOPs,其中3×3表示卷积核的空间维度,因子4考虑了每个采样点的双线性插值。
根据[27]中概述的框架,DCNv3的内存访问成本(MAC)被计算为2HWC + 27HWG。第一项对应于输入/输出特征图的大小,第二项对应于DCNv3的偏移和聚合权重,其中G表示组数。我们将G近似为C/16,假设每个组的维度为16,因此得到约3.7HWC个MAC。然而,这假设了一个理想的情况,即具有无限缓存且每个值只需单个内存读取,这在并行计算环境中通常是不现实的,因为并发线程执行需要同时访问数据。
为了估计最大的内存访问需求,我们考虑了一个没有缓存的情景,每个输出位置都需要新的内存读取,其中包括36次双线性插值的读取、27次偏移/聚合权重的读取以及一次写操作,结果是64HWC的MAC。这比理想情况大17倍。
该分析揭示了计算与存储器访问的比率(范围从0.6到9.7)的巨大差距,突出了存储器访问优化的巨大潜力。值得注意的是,尽管DCNv3使用了依赖于输入的动态偏移,导致了不确定的内存访问,但一个确定的事情是同一组内的通道共享偏移值。这使得我们提出了一个具体的优化策略,以提高DCNv3的速度。
消除冗余工作量:在之前的CUDA实现中,对于形状为(H,W,C)的输入,偏移量 ( H , W , G , K 2 × 2 ) (H,W,G,K^2×2) (H,W,G,K2×2)和聚合权重 ( H , W , G , K 2 ) (H,W,G,K^2) (H,W,G,K2),我们将总共创建 H × W × C H×W×C H×W×C个线程以最大限度地提高并行性,其中每个线程处理一个通道的一个输出位置。值得注意的是,在每个组内, D = C / G D = C/G D=C/G个通道共享相同的采样偏移和聚合权重值,对于每个输出位置而言。在同一个输出位置上使用多个线程处理这些D个通道是浪费的,因为不同的线程会多次从GPU内存中读取相同的采样偏移和聚合权重值,这对于一个内存绑定的操作符来说是至关重要的。在每个输出位置上使用一个线程处理同一组内的多个通道可以消除这些多余的内存读取请求,大大减少了内存带宽的使用。由于采样位置相同,我们也可以仅计算DCN中使用的双线性插值系数一次。具体来说,如果每个线程处理 D ′ D' D′个通道,则读取偏移和聚合权重的内存访问成本,以及计算双线性插值系数的计算成本,都可以减少 D ′ D' D′倍。
消除冗余的内存指令:在实际操作中,仅通过让线程处理多个通道并不会看到速度的提升。原因在于,当D′增加时,我们创建的线程变少,而每个线程的工作量现在增加了D′倍。这实际上减少了CUDA内核的并行程度。幸运的是,DCN内核现在在计算方面变得轻量化,因为双线性插值只需为所有D′通道执行一次,且大部分工作量集中在从不同通道读取输入值的内存指令上。当内存布局是通道最后时,所有D′个通道的值是连续的,我们可以利用矢量化加载:例如,要从内存中读取四个32位浮点值,而不是使用四条指令分别读取四次32位浮点值,我们可以使用单条指令一次加载128位打包的值,从而减少指令数量并缩短每个线程的执行时间。我们可以在将最终结果写入GPU内存时应用类似的技术,最小化内存访问时间并提高内存带宽利用率。此外,现代的半精度数据格式(float16/bfloat16)使需要加载的字节数减半,这意味着在相同内存带宽下,使用半精度格式时内存效率可以提高两倍。然而,在原始的DCNv3实现中,我们并未看到使用半精度数据的速度提升,这可能是由于数据访问和计算带来的过多开销,而在我们新的实现中,速度提升显著。值得注意的是,上述优化技术也可以应用于DCNv1/v2和可变形注意力[48], 因为它们共享类似的性能瓶颈和问题。
2.2 部署可变形卷积
- Windows快速部署DCNv4(成功版):Windows快速部署DCNv4(成功版)
三、假期计划
本次假期主要有以下安排:
- 1.尝试将可变形卷积v4添加到网络中;
- 2.阅读与Deepwave相关思想的论文;
- 3.学习吴恩达的机器学习视频;
- 4.完成数学公式的学习;
- 5.思考如何修改损失函数;
这篇关于2024年6月10日~2024年6月16日周报的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!