CVPR 2022 Oral|SBP:针对视频任务的内存优化策略,节省80%GPU显存!

ai基础知识总结简单一点(AI前沿知识针对任务的内存优化策略)(1)

论文:https://arxiv.org/abs/2203.16755

ai基础知识总结简单一点(AI前沿知识针对任务的内存优化策略)(2)

导读

这篇文章是 CVPR 2022 Oral。

ai基础知识总结简单一点(AI前沿知识针对任务的内存优化策略)(3)

本文设计了一种针对视频任务训练的内存优化策略。实际上,这一思路从某种角度可以看做是对18年论文Backdrop: Stochastic Backpropagation中所述的随机反向梯度的一种扩展和实用化。

本文提出了一种名为随机反向传播(SBP)的内存有效的方法,用于训练视频上的DNN。这是基于这样的发现,即对于反向传播而言,不完整执行时的梯度仍然可以有效地以最小的精度损失来训练模型,这可以归因于视频的高冗余性。SBP保持所有前向传播路径,但在每个训练步骤中随机和独立地删除每个网络层的反向传播路径。它通过消除对应于反向传播路径的缓存激活值的需求,从而降低GPU存储成本。而这个量可以通过可调节的保持率(keep-ratio)来控制。实验表明,SBP可以应用于视频任务的各种模型,在动作识别和时间动作检测任务上,可节省高达80.0%的GPU存储,并且提升10%的训练速度,而准确率下降了不到1%。

ai基础知识总结简单一点(AI前沿知识针对任务的内存优化策略)(4)

贡献

训练视频理解模型的普遍挑战之一是GPU内存的可用性有限。尽管视频模型,例如动作识别和时间动作检测,众所周知的,受益于视频整个跨度上捕获上下文特征的设计。然而对于端到端训练来说,它们并不总是可行的,他们需要尽可能多取输入帧(例如,通常数百个)。例如,当使用Resnet-50作为特征提取器,并以128帧作为输入、批次大小设为4时,训练时间动作检测器中,特征提取器本身就要耗费超过40 GB内存,这可能超过了大多数现代GPU的极限。

另一方面,视频数据本身是高度冗余的,这实际上暗示了一些优化的可能。作者观察到,在视频模型中,不同帧的激活图和梯度在底层位置上是相似的,但在顶层位置上就会有越来越多的不同。例如图1中所示的,在Kinetics-400上的视频Swin的示例。在模型训练期间,底层看似相似的特征(即细粒度信息)的微小差异对于生成顶层特征的差异至关重要。但是在更新这些底层的参数方面,它们可能不会有太大影响。因此,作者假设完整的激活图(前向路径中的)对于提取重要语义信息是必要的,但对于梯度(反向路径)可能是不必要的。

因此视频任务中存在多种训练范式,这当然也与目标任务相关。例如视频目标分割任务中,许多方法会对不同的视频随机采样片段(clip)送入模型中。模型每次处理一个片段,而非整个视频连续送入模型中处理。另外也有一些方法会完全按照图像的训练方式,只是利用光流来关联时序信息。而本文主要所讨论的是视频理解类的任务,例如动作识别、时间动作定位以及在线动作检测等等。这些任务通常依赖于视频长期上下文信息。此时显存不足的问题尤其突出,这也为端到端训练的设计提供了巨大的阻碍。这类视频任务中常见的模型可以归类为两种:树模型和图模型。

因此本文主要关注于这两类方法的训练过程的改进,更具体来说,主要针对StT类方法和Video Transformer类方法的优化。

在本文中,作者提出了一种名为随机反向传播(SBP)的内存节省技术。与以前同时删除前向和反向路径的工作[Vatt: Transformers for multimodal self-supervised learning from raw video, audio and text]不同,SBP随机删除一定比例的反向传播中的独立的反向路径,同时保持所有前向路径。此外,作者发现,这种随机移除反向路径的策略可以以层次化的方式进行,在此过程中,作者直接删除每一层中某些随机采样的神经元的连接路径。请注意,由于反向传播算法的链式依赖性,这将导致网络参数的不完全的梯度计算。但是,作者从经验上发现,只要保留整体计算图,梯度虽然未被完整计算,但是仍然可以有效的更新网络的参数。这使得SBP易于实现(例如文中给的示例代码就和PyTorch自带的checkpoint机制的实现非常类似),而无需考虑跨层依赖的变化。SBP的存储节省来自避免在被删除的计算路径上缓存相应的激活图。由于内存可以安全地重用,因此反向过程几乎不会使用(最多一层)额外的内存,这使得激活缓存成为了训练过程中主要内存成本的来源。因此,节省量仅取决于保持率,并且其较低时,节省内存的程度也更显著。

SBP是一种通用技术,可以被应用于多种视频任务和模型。实验结果表明,SBP训练仅使用0.2×〜0.5×GPU内存,并提升了1.1×~1.2×的训练速度,Kinetics-400和Epickitchen-55上的时间动作检测的任务中,仅有少于1%的精度损失。而在Thumos'14上的时间动作检测中,也有小于1%的mAP损失。

方法

本文提出了一个内存有效的策略,随机反向传播(SBP),用于训练视频模型。由于浅层的高冗余性,反向传播中,SBP会随机去掉一部分梯度计算。这可以节省内存是因为不再需要跟踪用于计算梯度的某些激活。

ai基础知识总结简单一点(AI前沿知识针对任务的内存优化策略)(5)

当模型定义时,其反向传播可以看做一个有向无环图(Directed Acyclic Graph (DAG)),表示为G(V,E),其中顶点V对应着为梯度计算缓存的激活,而边E则是用于计算梯度的各个操作。因为模型可以看做不同层的堆叠,所以也可以按照层的方式来组织V中的元素,即V中元素按照对应层序号li来划分成多个Vli。这里的Vli表示层li的输出,而Vl0表示模型输入。每个Vli可以看做是一系列特征向量,例如,如果Vli是一个CxDxHxW的量,就可以把它看做是DxHxW个顶点的集合。这里每个顶点(论文中称为“node”),是一个C维的特征向量。

如图3所示,作者通常将整个模型分为两个部分:1)空间模型(虚线以下)和2)时间模型(虚线上方)。

树模型是一种具有树状DAG的特殊类型,其孩子节点通常仅与一个父节点相连。它是最简单的模型结构之一,但在长期视频任务中被广泛采用。为了更好地说明SBP,作者首先在树模型上引入SBP,然后将其扩展到更多的一般图模型。

树模型上的SBP

在树模型中的树模型上的SBP,每个节点仅连接到相邻层相同位置的节点(如图3A所示)。在长视频任务中,大多数方法使用一个空间backbone(例如Resnet)来提取帧特征。这样的模型可以看作是树模型,因为帧的处理是彼此的。

图3a显示了在树模型上如何完成SBP。几个顶层用于进行时间建模,从多个帧中捕获时间信息。由于底层的冗余比顶层更大,因此仅在底层梯度上执行移除,并保持顶层中的梯度。在正常的端到端训练期间,由于下面结构中特征尺寸要比顶层结构中的高得多,所以大多数内存都在底层消耗。SBP在底层中移除梯度,消除了跟踪相应中间节点的必要性,从而可以节省大量内存。

图模型上的SBP

在更通用的图模型中,每个节点都可能连接到相邻层处的所有节点(如图3b所示)。Vision Transformer是一种全连接的图模型。图3B显示了在图模型上如何完成SBP。

在树模型中,采样节点的梯度与使用所有节点训练的梯度完全相同。例如,在图3a中,作者为节点6计算的梯度始终是相同的,无关于Node-9,11,5,7是否被采样。而图模型中,因为所有顶层节点将传播梯度到底层节点,采样节点的梯度计算将会随着从上到下越来越不精确。然而,由于从上到下冗余性越来越多,所以这也不是什么大问题。跨层维持采样节点不变也将可以缓解这一问题。作者为所有层设置一个均匀均匀的保持率,以简化参数的识别。但是作者注意到,可以制定一种系统的策略来设置层特定的保持率。

为什么可以仅用部分梯度来有效的学习?

ai基础知识总结简单一点(AI前沿知识针对任务的内存优化策略)(6)

作者认为这是因为删除了帧之间的冗余,但保留了所有重要的信息。如图1所示,因为帧之间,底层上的激活图和这些激活图的梯度非常相似,因此去掉某些帧的梯度不会过度伤害模型。图4也支持了这一点。 范围在0到1支之间的CKA相似性[Similarity of neural network representations revisited]用于测量两个神经网络之间表征的相似性。

帧丢弃(FD)[Vatt: Transformers for multimodal self-supervised learning from raw video, audio and text]仅使用基线所使用的帧的数量的1/4进行训练,这相当于在所有层中去掉3/4的梯度。

FD的曲线是使用1/4数量帧训练的模型与使用所有帧训练的模型(即基线)之间的CKA相似性。前6层相似性非常高(>0.9),这意味着丢弃一部分梯度并不会显着降低模型的性能。

与帧选择模型的比较

帧选择方法[Smart frame selection for action recognition, Scsampler: Sampling salient clips from video for efficient action recognition]使用轻量级网络从视频中采样帧,然后将采样帧送到目标模型。

假设使用相同的帧采样器,SBP和帧选择方法之间的差异在于是否保留未采样帧的前向传播路径。

作者强调保持所有帧的前向传播路径是重要的。进行时间建模的顶层从所有框架中学习全局时间信息,因此,学到的特征中包含较小的冗余,如图1所示。删除前向路径,如帧选择方法,将影响时间建模。因为更不冗余的时间模型只能从一组采样的帧中学习。如图4所示,在顶层使用SBP保持梯度保持CKA相似性高于使用FD直接丢弃梯度。

与梯度丢弃[Regularizing metalearning via gradient dropout]的比较

SBP和梯度丢弃都是在反向传播中丢弃梯度。作者的SBP旨在通过丢弃大量(即75%)的反向路径来节省内存,而梯度丢弃策略的旨在通过随机置零(zero out)较小比例(10%~20%)的梯度来正则化训练过程。作者探索了梯度丢弃在新方向上的应用,并且设计了一种策略以删除反向路径,这可以实现节省内存的目的。

使用

树模型常被用在长期视频任务中,这需要使用数以百计的帧作为输入。对于短期视频人物而言,例如动作识别,全连接图模型,例如Video Transformer实现了最佳性能。

Spatial-then-Temporal (StT) Models

对于诸如在线动作检测和离线动作检测等长期任务而言,大多数现有方法都是StT的模型。StT模型是树模型的实例(图3a)。他们首先使用空间模型(使用滑动窗口的2D或3D-CNN)来提取每个帧/或片段的空间特征,然后将提取的特征馈送到时间模型(RNN,Transformer等)中进行时间建模。

将时间模型表示为fs,时间模型表示为ft,输入的视频x看做是一个CxDxHxW大小的包含着D帧大小为HxW图像的clip,作者忽略了batch维度。空间模型取大小为CxKxHxW的输入,这里K是输入的视频chunk中的帧数。例如2D-CNN取单帧作为输入,此时K=1,而3D-CNN则是多帧一起送入。此类模型的前向传播就是每次对空间模型送入一段K帧图像获取中间特征,所有特征汇聚后由时间模型得到最终结果。

该模型中,空间模型主要提取空间和局部时间信息。而时间模型则用于从空间模型的输出中聚合全局时间语义特征。由于时间模型包含着更少的冗余性,SBP因此仅用于空间模型中。

SBP可以通过使用预定义的采样函数,划分输入帧到两个集合来实现:集合1保持梯度,集合2丢弃梯度。前向传播期间,跟踪集合1中帧对应的所有激活,而只跟踪集合2中帧对应的特征。然后可以拼接提取的特征在时间模型ft上做一个完整的前向传播和反向传播。

Video Transformer

对于短期视频任务,例如行为识别,Video Transformer例如TimeSformer和Video Swin Transformer实现了卓越的性能。这里基于这类工作来实例化SBP。

在树模型中,一个时间位置的输入节点独立于空间模型中其他时间位置的节点,因此作者可以轻松地在其上应用SBP。但是,在Video Transformer中,由于注意力层的点积运算,不同时间位置的节点相互依赖。作者通过在层级别应用SBP,而非树模型中的模型级别,从而解决此问题。

ai基础知识总结简单一点(AI前沿知识针对任务的内存优化策略)(7)

图5显示了如何将SBP应用于Transformer层。对所有层进行采样相同的节点(图5中的灰色节点)。在点积注意力中,所有key和value节点都与每个query节点有关。给定输出中采样节点的梯度,为了准确计算query中相应节点的梯度,对所有key和value节点进行采样。对所有key和value节点进行采样只会稍微增加内存消耗,因为注意力重量构成了注意力操作中GPU存储消耗的大头。假设query、key和value都是(hxd)xn大小的,并且注意力权重的形状是hxnxn,这里的h、d和n是头的数量,每个头的维度,和token的数量。Video Transformer中,n通常远大于头的维度,例如在Video Swin中,n=392,而d=32。因此注意力权重是内存占用的大头。

Video Transformer中,作者认为最顶层的数层,本文中使用3层,作为时间模型,这些部分有着完整的反向传播路径,而SBP仅用于剩下的那些层中,这可以看作是空间模型。

实现

ai基础知识总结简单一点(AI前沿知识针对任务的内存优化策略)(8)

算法1中给出了对于任意操作f的实现,这包括StT模型中的空间模型,和Video Transformer中的点乘注意力以及多层感知机。只有被采样的需要计算梯度的输入会被保存用于反向传播。反向传播期间,SBP会对采样输入重新前向传播和回传梯度。这可以充分利用现代深度学习框架中的自动微分引擎,所以效率很高,几乎没有开销。

空间和时间复杂度

对于StT模型,Ms是空间模型需要的内存,而Mc时间模型需要的内存。因此最终的空间占用率是(rMs Mc)/(Ms Mc),这接近于r,因为Ms通常大于Mc的5倍到10倍。

对于Video Transformer模型,d和n是多头注意力的头的维度和token的数量。其中需要计算梯度的激活图包括多个部分,2倍的输入(2hdn)、qkv向量(hdn),softmax前后总共2hnn大小的注意力权重,以及10hdn大小的MLP的参数。因此总共需要15hdn 2hdn的内存。SBP缩减query到hdnr,注意力权重是2hnnr,MLP到10hdnr。因此空间比例几乎正比于采样率r。因此内存小号的降低是显著的,如果r够小的话,例如0.25。这是因为训练阶段,大部分的内存占用是用于缓存梯度计算所需要的激活值,但是用SBP,只需要缓存部分采样的激活即可。

关于时间压缩比例,假设前向传播和反向传播的时间是相等的,那么完整的比例就是(1 2r)/2,因为实际上执行了1 r倍的前向传播和r倍的反向传播。

实验相似性度量

ai基础知识总结简单一点(AI前沿知识针对任务的内存优化策略)(9)

实验中,作者们引入了Similarity of neural network representations revisited中用于测量两个神经网络之间表征相似性的CKA相似性来度量Video Swin-T的相同层激活的相似度。图中展示了三种训练设定下与完整的端到端训练时(也就是“Video Swin”)的相似性。曲线FD(frame dropout)展示了使用 1/4 数量帧训练的模型与使用所有帧训练的模型(即基线模型“Video Swin”)之间的 CKA 相似性。从另一个角度来看,FD方案相当于在所有层中去掉3/4的梯度。

从图中可以明显看到三种结构对应的浅层结构表征的相似性。据我推测,作者这里展示的图的曲线对应的应该是训练完整的模型的表征相似度。

可见,使用SBP和FD的模型中,浅层都具有较高的相似性,而深层结构的相似度都不是很高。作者认为随机截断反传路径后,浅层特征仍然保持着较高的相似性的现象,意味着丢弃一部分梯度并不会显着降低模型的性能。同时使用SBP的方法在深层结构中的CKA相似性高于使用FD,作者认为这也暗示了在深层结构保持完整的梯度计算的意义。

但是值得关注的是,这样的截断操作可以看到对于深层特征有着比较明显的影响,而这似乎并没有对性能造成巨大的差异?又或者说,是否正是因为这样的差异,导致了最终性能仍然稍弱于完整的训练呢?从另一个层面来说,这里似乎也反映出了前向传播与反向传播之间的紧密耦合,虽然在SBP中前向传播中被完整的保留,但是反向传播的调整仍然造成了与原始基线表征上的明显差异。可惜的是,作者们对于这些并未给出更多分析。

行为识别

实验中SBP仅对浅层的时间维度均匀随机采样。这样可以使与帧相对应的节点要么都被采样或被丢弃。在所有层中,采样节点保持一致。

ai基础知识总结简单一点(AI前沿知识针对任务的内存优化策略)(10)

对比中,SBP 在性能和显存占用的权衡下实现了最佳。在重度依赖时间信息的数据集(Epic-55)上FD性能的严重损失也表明了在训练和推理过程中保持所有前向传播路径的重要性。

ai基础知识总结简单一点(AI前沿知识针对任务的内存优化策略)(11)

在于梯度检查点技术的对比中可以看到:

另外,按照文中所述,作者们也测试了SBP和O1级别的混合精度训练的搭配效果,发现这可以节省 Swin-T 超过约 50%的内存,而没有性能的下降。

ai基础知识总结简单一点(AI前沿知识针对任务的内存优化策略)(12)

前面的实验都是在时间维度上进行的。一帧的节点要么全部保留要么全部丢弃。作者们补充了在时间和空间上同时执行梯度丢弃的操作,使用了3D棋盘模式的时空梯度丢弃策略。在对比中,时间采样(即帧级别的处理)和时空采样(即 3D 棋盘形式)实现了相近的性能。这也反映了SBP用于空间采样以及被迁移到图像域的潜力。

时间行为检测

为了验证在长时间视频任务中的表现,作者们也在时间行为检测上进行了验证。

在线动作检测任务需要对实时视频流去检测正在发生在每一帧的动作,而不能利用未来信息。现存方法延续 StT 范式,基于提取的视频帧特征在时间模型上执行时序信息的建模。

ai基础知识总结简单一点(AI前沿知识针对任务的内存优化策略)(13)

在实验中可以看到:

ai基础知识总结简单一点(AI前沿知识针对任务的内存优化策略)(14)

针对SBP采样节点的方式,这里对比了三种策略:

时间动作定位

时间动作定位旨在检测未修剪视频中每个动作实例的时间边界。大多数现有方法遵循 StT 范式。

ai基础知识总结简单一点(AI前沿知识针对任务的内存优化策略)(15)

实验中,端到端训练性能优于冻结 backbone 的,但是显存占用也大得多。引入 SBP 后获得了更好的权衡。

ai基础知识总结简单一点(AI前沿知识针对任务的内存优化策略)(16)

笔云科技,人工智能应用实践先行者

,