【MindSpore2日训练营第六期】1.5版本新特性之Boost
MindSpore1.5版本推出亲和算法库Boost1.0,目标是在不同的AI场景下,保持用户训练精度的同时,为用户提供高效的训练体验。本次课程对Boost性能提升原理做了讲解,并提供了两种相对易实现的模式。
Boost能够实现性能提升的原理主要有三方面构成:
1、梯度冻结:
训练过程中反响的时间占了大头,如果可以减少反向的次数,也可以提高训练的速度。Boost通过梯度冻结实现了性能提升,具体过程为:将训练数据自动分组,并依据冻结概率生成冻结策略,这样在反向训练时,通过周期性排布,减少block从不训练切换为选练的次数。
2、 LessBN:
打开神经网络训练流程进行分析,以ResNet50为例,除卷积外,BatchNorm相关算子时间占比约为30%;通过合理的缩减不必要的BatchNorm,能够带来性能的提升。
Boost的做法是:根据设计,自动去除部分结构的BN,增加LastFN,以及梯度中心化,能够加速训练15%
3、自适应梯度融合
Boost实现的2种模式:
简易模式:MindSpore Boost简易模式分为三种级别,分别为“O1”“O2”“O3”,只需要在model构建时,通过“boost_level”进行选择和设置即可。
高阶模式,以LessBN为例,需要导入boost并调用LessBN()。
本次课程抛开原理的深层实现,相对平易、好实现,能够帮助普通开发者提升网络训练速度和良好的使用体验。
本次作业有两题:
1、在modelzoo的resnet或mobilenet-v2上,跑通boost简易模式调用
2、在modelzoo的resnet或mobilenet-v2上,跑通boost高阶模式lessbn算法调用
个人的解题思路为:
第一步:下载代码,在GPU上正常执行训练,可以跑通。
>>> bash run_standalone_train_gpu.sh /path/to/cifar-10-batches-bin /path/to/resnet50_cifar10_config.yaml
第二步:简易模式调用boost模式
/resnet/config/resnet50_cifar10_config.yaml: Line53 |
|
boost_mode: "O0" |
boost_mode: "O1" |
RuntimeError: mindspore/ccsrc/runtime/device/gpu/kernel_info_setter.cc:83 SupportedTypeList] Unsupported op [Centralization] on GPU
In file /home/dasblue/anaconda3/envs/msgpu/lib/python3.7/site-packages/mindspore/boost/less_batch_normalization.py(81)
x = self.multiplier * x
^
看起来像是算子的问题,然后提issue,链接:https://gitee.com/mindspore/mindspore/issues/I4HXJI
得到开发人员的答复是:当前boost模式仅支持在Ascend上运行,GPU下缺少该模式所需的部分算子。
第三步:高阶模式调用
/resnet/train.py: Line238 |
|
net = resnet(class_num=config.class_num) |
net = resnet(class_num=config.class_num) #--------------high-level boost mode------------- import mindspore.boost as boost net = boost.LessBN(net) #-------------------------------------------------------- |
按表修改代码后,是可以跑通的。
- 点赞
- 收藏
- 关注作者
评论(0)