技术干货|昇思MindSpore 1.5版本中的亲和算法库——MindSpore Boost

有过AI网络训练的朋友们都知道,基于深度学习训练的AI收集越多的数据,使用越大的网络进行训练,能得到更好的精度。同时,越多的数据、越大的网络也意味着越大的算力消耗。如果能有一个算法库,在同等算力资源下,提供更加高效的训练算法效率,那不香吗?为此,我们在MindSpore框架下,隆重推出亲和算法库,旨在为MindSpore用户提供简单易用、高效的训练加速算法。

众所周知,训练是一个复杂的计算过程,端到端训练包含很多步骤,如下图所示,包含数据加载和增广模块、网络前反向计算模块、梯度/激活通信模块、权重更新模块以及网络收敛迭代次数。深度学习训练过程本身是个高冗余的计算过程,我们围绕这些模块分别进行计算优化,最终实现不同AI任务和AI网络下,端到端训练效率最优化。

图1:端到端训练要素

本次中央媒体技术院联合MindSpore推出MindSpore Boost 1.0版本,其整体架构如下图所示。在1.0中,我们为大家提供了包含数据、网络、通信、训练策略和优化器等维度的加速算法。

图2:MindSpore Boost 1.0架构

值得一提的是,在这些算法的基础上,我们还为用户提供两种调用模式:1.高阶模式:用户可直接调用其中的算法接口,但这种模式需要用户了解算法的调用方式和原理,更加适用于高阶用户;2.简易模式:在众多算法的基础上,我们进行进一步接口的封装,为用户提供三种不同层级的选择,即O1/O2/O3,随着层级的递增,其加速比例增加,这种模式下,用户无需了解算法细节, 仅需要在调用Model的训练入口时,打开加速开关和选择加速层级即可,使用方法如下图所示。

图3:简易模式使用示意

上述算法及调用模式,目标都是为了在不同的AI场景下,保持用户训练精度的同时,为用户提供高效的训练体验。本篇文章还将为用户介绍其中两个自研算法特性:LessBN算法和亲和冻结算法。

 Less BN算法

在正式特性发布前早在2020年8月,我们就已经给各位开发者设计了一个彩蛋,此次MLPerf v0.7(人工智能行业权威“跑分”榜单),Less BN算法加持MindSpore应用在超大规模集群256块AI芯片训练中,首次去除67% BN,加速15%,助力跑出83.4秒的成绩, 超过谷歌256个TPUv4的109.2秒。

1、背景技术

众所周知,深度神经网络已在计算机视觉中取得很大进展。2015年,Google首先提出BN并将其嵌入到深度网络结构中,该技术的应用极大的促进了深度网络向超大规模发展。其中极具代表的工作是微软提出的101层的ResNet模型,在ImageNet图像识别比赛中,以96.43%(TOP5准确率)的正确率率先超过人类的水平。至此之后,BN作为深度网络的基础默认组件在计算机视觉的各个领域应用愈来愈广泛。

图4:BN在CNN网络中的位置,通常Conv-BN-ReLU

BN之所以在深度神经网络训练中能够起到如此重大的作用,学术界及业界最主要的观点认为BN层通过对输入的数据(或特征)进行归一化之后,使得每层前向波动控制在一定范围内,让整个训练过程更稳定。可以看到,使用BN后,训练过程中的loss和gradient的波动更平稳,同时训练更稳定也在一定程度上避免了网络对噪声的敏感性,模型的鲁棒性更高。

图4:Standard: 未加上BN,Standard+BatchNorm:加上BN。

(a)训练过程中的loss值变化曲线;(b)训练过程中的gradient变化曲线。

BN的具体计算过程如下所示,尽管其能够带来训练收敛的稳定性上,但是其主要计算过程为非矩阵运算,且计算复杂度很高(依赖于m的大小)。

图5:BN的计算过程

现有主流AI芯片(GPU或昇腾芯片)中,主要计算核心为矩阵运算。通过分析上述BN的计算过程,易见BN并不能有效利用现有AI芯片的核心算力,导致其在深度神经网络训练中成为一大性能瓶颈。在典型网络中,BN占整个深度神经网络的开销比例,如下所示。

表1:BN在ResNet50,YOLO v3的开销占比

基于现有的AI芯片架构,如何在去掉BN的前提下,提升模型训练效率,同时能够达到使用BN时的精度和稳定性,成为当前训练加速的一大关键问题。而对开发者来说,已经习惯在每一个Conv后加上BN,如何能使用更少BN达到精度不变性能提升更是非常困难。

2、算法原理

全文将以ResNet50结构剖析LessBN相关技术,BlockBN/LastFN/GC优化器三大组件,即可实现训练加速15%,精度持平。

图5:Less BN算法整体算法流程

3、BlockBN

业界普遍认为归一化层可以稳定训练、实现较高的学习率、加速收敛并提高泛化能力,所以去除BN后优先需解决梯度爆炸训练不稳定的问题。早期探索去除BN的典型工作如Fixup,通过分析标准初始化无法恰当处理残差连接的梯度流,从而导致梯度爆炸。通过对残差层卷积缩放权重同时引入标量multiplier稳定训练ResNet网络结构。

但该方法存在如下问题:

1、网络结构:该方法仅仅适用于ResNet网络结构,对其他结构不具有普适性;

2、底层优化:额外添加的两个单元(bias和multiplier),其计算性能上需要底层硬件特定指令进行优化。

另一篇工作如谷歌的NFNet也引入了类似的初始化和multiplier成功去除了BN。

可以看出残差分支引入好的初始化和multiplier对训练稳定性和精度提升都起到了重要作用。但好的初始化存在结构难泛化,multiplier存在硬件优化加速的问题,难以扩展到更多的网络结构并在特定硬件上实现训练加速,基于此分析通过保留残差分支最后的一个BN能同时稳定训练和提升精度。通过对训练过程中的multiplier值分析,可以看出multiplier通过动态调整每一层有效学习率稳定训练提升精度。除此外经过大量泛化性验证我们对更多的Conv后的BN范式进行探索,如Depthwise/Group/Downsample Conv并沉淀到LessBN范式库中通过MindSpore前端匹配自动去除Conv后不需要的BN,仅保留对初始化和精度影响更大的BN。

图6:Less BN初探

4、LastFN

同MimicNorm在网络最后一层增加BN稳定方差,我们实验也发现越靠近网络loss层的BN对精度影响更大,去除BN后在神经网络的在神经网络的训练初期,如果学习率较小,交叉熵函数给出的梯度会使最后一层方差下降, 学习率太大则会发散。LastBN前向稳定方差,保证每次更新就有较大的梯度值以保证快速收敛;反向利用scale(方差大BP梯度也会被缩小)调整学习率,方差大则等效学习率小,控制最后一层方差和网络等效学习率。LastBN和交叉熵函数之间形成反馈机制,保证梯度的稳定和较快的收敛速度。

尤其在混合精度下由于BN在不同硬件实现上的数值稳定性不同,将LastBN应用至不同硬件上(GPU/昇腾)精度表现不一致。本文使用硬件更为亲和的LastFN,修改自特征归一化技术,该技术先前在Reid上已被使用,同样保留multiplier来稳定训练。另外推理时通过EMA累加特征值通过重参数化融合至权重中,推理时保证LastFN导出结构和FC保持一致。LastFN结构在几乎不增加开销的前提下,利用归一化能力对输入特征(数据)进行归一化操作,相当于对loss进行平滑,有利于loss计算的数值稳定性,提升拟合能力,实现了在GPU/昇腾上一致的训练精度表现。

5、Gradient Centralization(GC)

除了以上两种重要组件通过结构重要性上间接稳定梯度使优化更容易,我们借鉴了BN对特征归一化的做法,对梯度进行类似的归一化操作来稳定梯度,业界普遍采用类似Weight Centralization/Standardization,本文采用了泛化性更好的梯度中心化技术(GC),类比于对特征归一化,如图所示梯度中心化对梯度进行中心化,相当于对权重空间进行了限制,权重只能在与e正交的超平面移动,缩小了优化空间,增强了泛化能力。

图7:GC算法示意图

理论分析GC可降低利普希茨值,梯度波动更小,使Loss曲线更加平滑,优化更简单,加速收敛,应用GC后训练Loss如图X所示。

6、效果

该技术在ModelZoo网络上整体效果如下。相比NFNet在4k后更大Batch下性能降低,LessBN仅使用约30%BN在超大集群规模1024下32k下也能实现完全保留BN的收敛效果。

7、MindSpore上Less BN调用方式

import mindspore.boost as boost

network = boost.LessBN(network)

group_params = [{'params': decayed_params, 'weight_decay': 0.0001, grad_centralization=True},

                          {'params': no_decayed_params},

                          {'order_params': network.trainable_params()}]

梯度冻结

1、背景

昇腾910是华为在2019年发布的AI芯片,在ResNet50上训练速度达到了V100的1.8倍,ResNet50训练90轮仅需1.75小时。如何更够更进一步提升训练速度呢,我们采集了ResNet50在昇腾910上的性能数据。通过这些数据,我们发现在ResNet50训练上反向的时间占比高达68%,远超前向。是否存在一些算法可以降低反向的时间而不影响精度呢。

ResNet50

单步时间分析

耗时[ms]

percent

Totol

112.8

100%

Forward

43.7

38.7%

Backward

68.1

60.4%

Optimizer

1.0

0.9%

2、方法

既然训练过程中反向的开销占据了网络训练开销的大头,那么是否可以通过减少反向的次数来提高训练速度呢。早期的探索,例如Freezeout,在训练过程中,由前向后逐层冻结网络各层,当某一层被冻结后,直到网络训练结束都不再进行训练。例如网络的第1层仅在第1至第30个epoch进行训练,30个epoch之后冻结不再更新参数,自然也无需进行反向计算。然而该方法在ResNet结构上有一定的精度损失,在VGG, MobileNet等网络上也并不适用,精度损失较大,具有比较大的局限性。又如Intelligently Freezing Layers,在神经网络训练过程中根据网络梯度的状态计算出一定的标准,根据这个标准判断是否需要冻结。然而该技术对网络训练的冻结间隔较大,每隔一个epoch计算一次freezing rate,进行一次决策,导致freezing rate在每个epoch中后期不准。freezing rate的计算复杂且需要device与host传递数据,速度overhead明显。精度泛化性不佳,在轻量级网络上掉点明显。是否有更好的方案减少反向的次数呢。以下是我们的策略。

我们通过对用户网络的参数进行自动分组,引入采样概率分布对训练反向过程进行细粒度的冻结控制。

在训练迭代步维度进行随机性排布,并使得网络的每一层参数在整个训练过程中都有一定概率进行更新,不会存在某组参数前期训练,后期完全冻结不再更新的情况,以保证精度的无损。

参数分组:对于用户的网络,我们遍历该网络结构所用到的参数,按照计算顺序进行排序并分成若干组(默认10组)。

概率分布模块:引入采样概率分布对训练过程进行细粒度的冻结控制,概率分布分为采样概率和冻结概率。采样概率控制网络每一层被采样到的概率,例如在某个训练迭代步采样到某一组参数,那么从该组参数直到网络的第一组参数都将会被进行反向冻结。一旦采样概率分布确定后,参数的冻结概率分布也随之确定。具体实现如下:

采样概率分布公式:

冻结概率分布公式:

上述公式中的p0代表在整个训练过程中,不冻结任何参数的概率,即整网训练概率。n表示网络参数的分组数量,参数组的index用i表示,从0到n-1. 采样概率部分公式f(x)既可以是连续函数,也可以是离散函数,例如根据每一组参数的实际测试开销占比确定相应的采样概率。第i组被冻结的概率为第i组到第n-1组参数的采样概率之和。所有组参数的采样概率之和为1. 冻结概率分布曲线所包络的面积大越大,训练开销降低得越多。

训练迭代步排布:根据概率分布模块选定的概率分布公式对训练迭代步进行精细的排布,以确定在训练过程中每一次迭代时哪些组参数进行冻结。以整网训练概率p0为0.5为例,由于p0等于0.5,则可以每隔一步进行一次整网训练,在step0, step2, step4…都进行整网训练。在step1, step3, step5…根据采样概率分布函数分别采样到第3,第5,第1···组参数,则分别冻结前3,前5,前1组参数,该排布方式称为随机排布(random mode)。

上图绿色方块代表活动层,前向和反向都进行,灰色方块代表冻结层,只进行前向,冻结反向。

通过参数的采样概率分布函数可以更灵活地在开销和精度之间进行折衷,甚至可以根据每一组参数的具体实测开销占比确定相应的采样概率。通过随机分布使得网络每一层的参数在整个训练过程中都有机会进行更新,保证了训练速度提升的同时精度跟基线持平;在用户角度层面来说操作简单,实现有效地加速训练的同时做到真正的用户无感知。

3、效果

该技术在ImageNet上进行训练和评测,在平均提速15%的情况下,精度基本保持跟基线持平. 精度测试结果如下表所示。

4、MindSpore上梯度冻结使用方法

from mindspore.boost import GradientFreeze

freeze_engine = GradientFreeze(param_groups=param_groups
freeze_p=0.5,
total_steps= steps_per_epoch * max_epoch)
network, optimizer = freeze_engine.freeze_generate(network, optimizer)

参考资料:

1. Brock A, Lim T, Ritchie J M, et al. Freezeout: Accelerate training by progressively freezing layers[J]. arXiv preprint arXiv:1706.04983, 2017.

2. Xiao X, Mudiyanselage T B, Ji C, et al. Fast Deep Learning Training through Intelligently Freezing Layers[C]//2019 International Conference on Internet of Things (iThings) and IEEE Green Computing and Communications (GreenCom) and IEEE Cyber, Physical and Social Computing (CPSCom) and IEEE Smart Data (SmartData). IEEE, 2019: 1225-1232.

3.Luo H, Jiang W, Gu Y, et al. A strong baseline and batch normalization neck for deep person re-identification[J]. IEEE Transactions on Multimedia, 2019, 22(10): 2597-2609.

4.Yong H, Huang J, Hua X, et al. Gradient centralization: A new optimization technique for deep neural networks[C]//European Conference on Computer Vision. Springer, Cham, 2020: 635-652.

5.Chen M, Gao K, Liu X, et al. THOR, Trace-based Hardware-driven Layer-Oriented Natural Gradient Descent Computation[C]//Proceedings of the AAAI Conference on Artificial Intelligence. 2021, 35(8): 7046-7054.

6.Zhang H, Dauphin Y N, Ma T. Fixup initialization: Residual learning without normalization[J]. arXiv preprint arXiv:1901.09321, 2019.

7.Brock A, De S, Smith S L, et al. High-performance large-scale image recognition without normalization[J]. arXiv preprint arXiv:2102.06171, 2021.

MindSpore官方资料

官方QQ群 : 486831414

官网:https://www.mindspore.cn/

Gitee : https : //gitee.com/mindspore/mindspore

GitHub : https://github.com/mindspore-ai/mindspore

论坛:https://bbs.huaweicloud.com/forum/forum-1076-1.html 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值