大规模神经网络最新文献综述:训练高效DNN、节省内存使用、优化器设计( 二 )


大规模神经网络最新文献综述:训练高效DNN、节省内存使用、优化器设计
文章图片
激活卸载
卸载(又被称为内存交换)是一种通过在前向传递期间将激活转移到CPU内存并将它们预取回GPU内存 , 以进行相应的向后计算来节省GPU内存的技术 。
由于CPU和GPU之间PCI总线的带宽有限 , 必须优化选择传输激活 , 以及何时传输的选择 。
在vDNN[Rhuetal.,2016]研究中 , 作者通过仅卸载卷积层的输入来遵循对CNN有效的启发式方法 , 然而它不能很好地推广到一般DNN上 。 另有研究[Leetal.,2018]考虑了激活生命周期来选择卸载的内容 , 并使用图搜索方法来识别插入卸载/预取操作的时刻 。 AutoSwap[Zhangetal.,2019]通过为每个变量分配优先级分数来决定卸载哪些激活 。
权重卸载
前面提到的很多方法也适用于卸载权重 , 这是因为卸载权重依赖于适用于任何张量的通用技术 , 比如TFLMS、AutoSwap或者SwapAdvisor 。
不适合单个GPU的模型的并行性
在模型并行化中 , 只需要传达激活信息 , 并且传输只发生在分配给不同处理器的连续层之间 。 本章节提到的工作如下表4所示 。
大规模神经网络最新文献综述:训练高效DNN、节省内存使用、优化器设计
文章图片
如果多个小批量被pipeline化 , 则可以加快模型并行化中的执行速度 , 从而同时激活了多个训练迭代 , 具体可见[Huangetal.,2019] 。 一旦在所有这些小批量上计算了前向和后向阶段 , 权重就会更新 。 这种方法实现起来相当简单 , 但也导致计算资源大部分处于空置状态 。 [Narayananetal.,2019]中提出的PipeDream方法仅强制前向和后向任务针对给定的小批量使用相同的模型权重 , 改进了这一训练过程 。
减少执行更新的频率也已被证明有助于限制权重过期(Narayananetal.,2021a) 。 [Yangetal.,2021]提出的PipeMare根据pipeline阶段向后调整学习率和模型权重 。
对pipeline方法中激活导致的存储成本进行建模是一项艰巨的任务(Beaumontetal.,2021b) 。 例如 , [Fanetal.,2021]中的DAPPLE、[LiandHoefler,2021]中的Chimera使用1F1B(One-Forward-One-Backward)调度来减少与激活相关的内存消耗 。 1F1B是一种同步权重更新技术 , 尽可能早地安排每个微批次的反向传递 , 以释放激活占用的内存 。
有些论文专门处理具有挑战性的拓扑 。 比如 , 为了解决高通信成本和异构网络能力的问题 , [ZhanandZhang,2019]中的Pipe-torch提出了一种更新的动态规划策略 , 该策略假设计算和通信之间没有重叠 。 [Parketal.,2020]中的Pipe解决了异构GPU的其他问题 , 采用的方法是将这些异构GPU分成虚拟worker , 并在每个虚拟worker中运行pipeline并行化 , 同时依赖worker之间的数据并行化 。
用于跨设备模型训练的优化器
零冗余优化器
2020年 , Rajbhandari,S.等人在论文《ZeRO:MemoryOptimizationstowardTrainingTrillionParameterModels》中提出了零冗余优化器(ZeroRedundancyOptimizer,ZeRO) , 将它作为一种减少内存使用的数据并行化实现 。 根据在设备上划分的张量 , 该算法具有三个阶段 , 即阶段1-优化器状态、阶段2-优化器状态和梯度和阶段3-优化器状态、梯度和模型超参数 。
2021年 , Ren,J.等人在论文《ZeRO-Offload:DemocratizingBillion-ScaleModelTraining》中将ZeRO与Zero-Offload内部参数更新的CPU端计算统一起来 , 其中梯度被迁移至存储参数副本的CPU , 更新的权重迁移回GPU 。
低精度优化器
为了进一步减少内存使用 , 低精度优化器(low-precisionoptimizer)有了用武之地 。 这些方法使用低精度格式拉力表示优化器状态以及状态的辅助向量 。 并且 , 误差补偿技术可以被用来维持跟踪统计的近似准确率 。