昇思MindSpore 1.8:丰富的算法集与套件,实现高性能训练,降低部署门槛

经过社区开发者们两个月来的不断努力,昇思MindSpore1.8版本现已发布。在此版本中,发布的MindSpore Golden Stick,提供了丰富的模型压缩算法;开源大模型训练套件MindSpore Transformer、推荐网络训练套件MindSpore Recommender,帮助开发者实现高性能的模型并行训练和推荐网络大模型训练;持续升级自定义算子能力,实现多平台的统一算子开发表达;统一图像处理类接口、提供model.fit高阶API和早停功能,不断提升API接口易用性;新增180多个算子的functional接口,并支持NPU、GPU、CPU平台,方便开发者调用。下面就带大家详细了解下1.8版本的关键特性。


1  MindSpore Golden Stick,降低端侧AI部署门槛

MindSpore Golden Stick是华为诺亚实验室和昇思MindSpore团队基于昇思研发的模型压缩算法集,通过提供剪枝、量化等丰富的模型压缩算法,达到缩减模型参数量等效果,降低模型在端侧部署的门槛;此外,面向开发者还提供一套简单易用的算法接口,可降低模型压缩算法的应用成本。

MindSpore Golden Stick架构图

1.1  统一的算法接口和改图能力

模型压缩算法种类繁多,不同算法的应用方式往往各不相同,这增加了应用算法的学习成本。MindSpore Golden Stick对算法应用流程做了梳理和抽象,提供了一套统一的算法应用接口,最大程度缩减算法应用的学习成本,同时这也方便了在各种算法的基础上,对自动模型压缩等高阶技术的探索。

同时,MindSpore Golden Stick提供了通过接口修改前端网络的能力,算法开发者可以基于此能力制定通用的改图规则去实现算法逻辑,而不需要针对每个特定的网络都实现一遍算法逻辑,提升算法开发效率。

1.2  剪枝算法:SCOP[1],缩减模型功耗50%

MindSpore Golden Stick当前提供的一个结构化剪枝算法SCOP(Scientific Control for Reliable Neural Network Pruning,基于科学控制法的神经网络剪枝),在数据驱动下,设置了对照实验,通过引入对照特征来减少各种无关因素对剪枝过程的干扰,提高剪枝结果的可靠性。

ResNet50模型应用SCOP剪枝,并使用CIFAR-10数据集评估,实验结果如下表所示,在剪枝率45%的情况下,精度损失在0.5%以内,模型参数量下降超过50%,带来50%以上的部署功耗缩减和2倍以上的推理性能收益。

表 SCOP剪枝算法用于ResNet50的CIFAR-10数据集结果

模型

剪枝率

参数量

准确率

ResNet50

-

24M

93.2%

SCOP剪枝ResNet50

45%

11M

92.7%


1.3  量化算法:SLB[2],压缩模型8-32倍

MindSpore Golden Stick当前提供的一个量化算法是华为诺亚实验室自研的SLB(Searching for low-bit weights,基于权值搜索的低比特神经网络量化)。针对低比特网络量化,由于量化网络权值的有效解数量比较少,因此对网络的量化可以通过对权值搜索实现,也就是将量化过程转换成权值搜索的过程。与传统的量化算法相比,规避了不准确的梯度更新过程,能获得更好的准确率,在极低比特量化中更有优势。

对SLB算法做了简单的实验,结果如下图所示,在当前任务中,与全精度模型相比,4bit权重量化后的模型大小缩减为原来的1/8,但top1精度没有损失,1bit权重量化的精度损失在0.6%以内,此时可以获得32倍的模型压缩效果。

SLB权重量化算法用于量化ResNet18的CIFAR-10数据集结果,W32表示全精度模型,W4,W2,W1分别对应4bit、2bit和1bit权重量化模型

查看文档:https://www.mindspore.cn/golden_stick/docs/zh-CN/r0.1/index.html 


2  高性能的大模型训练套件MindSpore Transformer

目前Transformer已经广泛地应用在深度学习的各个领域,为了结合昇思丰富的并行能力和高性能优化特性,让开发者能够轻松上手Transformer类网络训练,社区专门提供的MindSpore Transformer是一个开源的Transformer类网络训练和推理套件。套件提供了典型网络,例如GPT、T5、VIT等基础模型的训练能力,并结合昇思MindSpore丰富的并行训练能力,实现高性能的模型并行训练。通过实验得出,在相同的硬件条件下,昇思MindSpore比Megatron的性能要优越18%以上。

2.1  多维度混合并行与图算融合优化

MindSpore Transformer主要应用了如下两种技术:

1. 多维度混合并行,包含优化器并行、多副本并行等技术。通过优化数据并行维度上的冗余参数和通信计算并发,可有效提升网络的训练性能。

2. 图算融合优化:昇思的图算融合功能可以自动实现算子融合和编译优化,提升模型的内存效率和训练速度。在MindSpore Transformer的所有模型和数据/模型并行模式下,图算融合均已大范围应用并取得了显著效果。

2.2  性能对比

昇思研发团队分别在8p、16p和32p A100集群上测试了百亿规模GPT(hiddensize=5120, num_layers=35, num_heads=40)性能,模型并行路数设置为8,数据并行数分别为1、2、4,Global Batch为1024。Megatron配置Micro Batch Size=2(Megatron已达到上限),MindSpore配置Micro Batch Size=8(MindSpore已达到上限),相比Megatron,昇思MindSpore的内存利用率更高,可以训练更大的Batch Size。

图 吞吐率对比

如上图所示,8P Megatron的最大吞吐率为7.4 k samples/s,MindSpore 最大吞吐率为9.3k samples/s,超过Megatron 25%;16P Megatron的最大吞吐率为13.6k samples/s,MindSpore最大吞吐率为16.9k samples/s,超过Megatron 24%;32P Megatron的最大吞吐率为20.1k samples/s,MindSpore最大吞吐率为23.8k samples/s,超过Megatron 18%。

开源链接:https://gitee.com/mindspore/transformer 


3  高性能的推荐网络训练套件MindSpore Recommender

推荐系统中部署了多种点击率(CTR)模型,为提高推荐点击率,需要对深度CTR模型进行高效的训练,推荐网络的训练性能是模型实时性的重要因素之一。昇思MindSpore 1.8版本提供了推荐网络大模型训练套件—MindSpore Recommender,结合昇思MindSpore自动并行、图算融合以及分布式Embedding Cache等基础能力,实现了推荐网络大模型的高性能训练。在套件中提供了主流推荐网络模型(如Wide&Deep)端到端的训练流程,包括数据集预处理、模型训练、Benchmark等,为开发者提供了一站式的推荐大模型训练能力。

3.1  推荐大模型训练架构

技术架构图

1. 自动并行:通过模型并行实现Sparse计算(Embedding)多卡自动切分,数据并行实现Dense计算与集合通信并发执行,有效提升网络的整体训练性能。

2. 分布式Embedding Cache:采用多级Embedding Cache、多级计算流水等设计,实现了大规模特征向量的存储与高性能训练。

3. 分布式计算图:通过分布式计算图切分与执行,实现了大规模特征向量的分布式存储与高性能本地计算。

3.2  性能对比

基于GPU V100集群Wide&Deep模型训练(batch_size=16000, vocab_size=5860000),如下图所示,单机八卡上昇思MindSpore的吞吐率优于HugeCTR 35%。

图 Wide&Deep训练吞吐率

开源链接:https://gitee.com/mindspore/recommender 


4  自定义算子持续升级,统一表达支持高效添加算子

年初发布昇思MindSpore1.6版本提供了多平台的统一算子开发接口Custom,能够快捷地进行不同类型自定义算子的定义和使用。为了进一步提升自定义算子的体验,昇思MindSpore1.8版本提供统一的MindSpore Hybrid DSL表达,支持包括Ascend,GPU和CPU在内多平台的统一算子开发表达,可以在全平台同时满足快速验证和实时编译的需求。此外,1.8版本提供接入Julia算子的自定义算子新模式,成为业界首个支持Julia语言的AI框架。

4.1  跨平台统一的MindSpore Hybrid DSL表达

MindSpore Hybrid DSL支持在不同平台用统一的表达开发算子,一次开发便可以在所有后端使用。此外,开发的算子接入Custom接口时,既可以通过hybrid模式即时编译运行,亦可通过pyfunc模式解释运行方便快速验证。

此外基于MindSpore Hybrid DSL提供新的调度原语,帮助hybrid类型自定义算子在Ascend后端使能多面体模型的专用处理器(DSA)调度器,实现手自一体的算子调度协助代码生成,帮助开发者基于Ascend后端加速科学计算任务。

查看文档:https://www.mindspore.cn/tutorials/experts/zh-CN/r1.8/operation/op_custom.html

4.2  业界首个支持Julia语言的AI框架

Julia是一种速度快且使用简单的高级通用编程语言,最初设计是用于科学计算领域,而由于其高效而实用的特性,近些年来越来越受到青睐,逐步迈向主流编程语言。昇思MindSpore 1.8版本在算子开发接口Custom提供Julia模式,把基于Julia语言开发的算子和基于昇思开发的模型有机地结合在一起。开发者可以采用Julia算子加速运算,也可以使用Julia生态高效地开发算子。如此,开发者在模型移植、快速验证以及模型加速等场景下使能Julia算子,在基于昇思MindSpore开发的模型中享受Julia语言对计算带来的收益。

查看文档:https://www.mindspore.cn/tutorials/experts/zh-CN/r1.8/operation/op_custom.html


5  MindSpore Data统一图像处理类接口,提升接口API易用性

昇思MindSpore1.8版本中,MindSpore Data模块对于图像类数据预处理操作进行重新设计及改造,从原有的c_transforms和py_transforms两种类型操作合并为transforms统一接口,同时对其中包含的各类数据处理算子进行归一合并,减少开发者混用算子的转换操作,并基于算子上下文实现自动的算子输出格式转换,极简易用,同时对资深开发者仍然保留了手动选择算子策略的能力。

5.1  实现方式

将c_transforms和py_transforms相同的功能合并为同一个接口,内部保留两种底层实现,执行时优先使用C层实现,保证高效率;不同的功能分别保留C层和Python层底层实现,执行时只有唯一方式。

5.2  实现后总结

1. 包的导入方式统一,如下图所示。

2. 数据处理接口统一,如下图所示。

3. 运行方式举例,如下图所示。

详情参考:https://www.mindspore.cn/docs/zh-CN/r1.8/api_python/mindspore.dataset.vision.html 


6       支持边训练边推理和早停功能

6.1  提供model.fit高阶API

之前的训练及推理分别通过model.train和model.eval两个接口执行,如果在训练过程中需要查看验证集的评估指标来监控模型效果,需手动实现;而昇思MindSpore1.8提供model.fit高阶API,对model.train及model.eval进行了封装,保证原有功能的情况下简化了开发流程,开发者只需传入对应的参数,即可一行代码实现自动化训练及推理。

详情参考:https://mindspore.cn/docs/zh-CN/r1.8/api_python/mindspore/mindspore.Model.html#mindspore.Model.fit 

6.2  实现EarlyStopping和ReduceLROnPlateau功能

为及时掌握训练过程中模型的状态、实时观察模型各参数的变化情况和实现训练过程中自定义的一些操作,昇思提供了回调机制(Callback)来实现上述功能,对标业界框架,昇思MindSpore1.8版本新增EarlyStopping及ReduceLROnPlateau两个Callback,可用于model.train和model.fit中,实现指定指标的Epoch级别的验证:当指标值变差,超过可容忍阈值或等待时间超过可容忍Epoch数时,EarlyStopping将终止训练过程实现早停,而ReduceLROnPlateau将按照开发者指定的学习率衰减规则,改变学习率。

详情参考:https://mindspore.cn/docs/zh-CN/r1.8/api_python/mindspore/mindspore.EarlyStopping.html 

https://mindspore.cn/docs/zh-CN/r1.8/api_python/mindspore/mindspore.ReduceLROnPlateau.html 


7  支持网络的常量输入可变,提升编译效率

当前图编译机制是除Tensor外所有顶层网络的输入都被当做常量值,如标量、tuple、list和dict。而常量值是不能求导的,而且在编译优化阶段会被常量折叠掉。

另外,当网络的输入是tuple[Tensor],list[Tensor]或dict[Tensor]时,即使里面Tensor的shape和dtype没有发生变化,在多次调用同一个网络去得到结果时,由于输入都被当做常量值去处理了,无法忽略掉里面Tensor的具体数值,所以导致网络每次都会被重新编译,降低训练效率。

为解决以上的问题,昇思MindSpore1.8版本新增了mutable接口去设置网络的常量输入为“可变的”,也就是把这个输入当做像Tensor一样的变量,从而可以对其求梯度以及防止网络被重复编译。接口用法也比较简单,在传参时对网络输入用mutable接口进行包裹即可,如下图所示。

图 用例对tuple[Tensor]类型的输入进行包裹

详情参考:https://www.mindspore.cn/docs/zh-CN/r1.8/api_python/mindspore/mindspore.mutable.html#mindspore.mutable 


8  MindSpore Reinforcement,提供高性能分布式训练和原生蒙特卡洛树搜索算法

8.1  通过Dataflow Fragment实现灵活,高性能的分布式训练

当前分布式强化学习框架主要以Python函数的方式实现强化学习算法,虽然具有直观的编程API,但在多机并行和异构加速上却很有挑战。

MindSpore Reinforcement v0.5.0提供基于Dataflow Fragment的分布式策略(DP),支持将深度强化学习算法分割成多个数据流片段,并映射到异构设备上执行。相同的算法可以根据不同的分布式策略而部署到单机多卡或多机多卡上。下图中展示了基于Dataflow Fragment的分布式策略,以及对应的训练加速效果,在多机多卡分布式训练场景下可大幅缩短算法的训练时间。

图 分布式策略示意图(左:分布式策略1; 右:分布式策略2)

图 不同分布式策略下的训练时间

详情参考:https://gitee.com/mindspore/reinforcement/tree/master/example/ppo 

8.2  蒙特卡洛树搜索(MCTS)

蒙特卡洛树搜索(MCTS)是一种决策搜索算法,以MCTS为基础的强化学习算法(如AlphaGo)获得成功之后,MCTS在强化学习算法中的应用越来越广泛。

图 MSTC算法伪代码

MindSpore Reinforcement v0.5.0提供了通用可扩展的MCTS算法。 开发者可以使用Python在强化学习算法中直接调用框架内置的MCTS算法,也可以通过扩展来完成自定义逻辑,框架自动将算法编译成计算图,实现高效执行。

详情参考:https://gitee.com/mindspore/reinforcement/tree/master/example/mcts 


9  参考文献

[1] Tang, Yehui, et al. "Scop: Scientific control for reliable neural network pruning." NeurIPS 2020: 10936-10947.

[2] Yang Z, Wang Y, Han K, et al. Searching for low-bit weights in quantized neural networks. NIPS, 2020.


(免责声明:本网站内容主要来自原创、合作伙伴供稿和第三方自媒体作者投稿,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证有关资料的准确性及可靠性,读者在使用前请进一步核实,并对任何自主决定的行为负责。本网站对有关资料所引致的错误、不确或遗漏,概不负任何法律责任。
任何单位或个人认为本网站中的网页或链接内容可能涉嫌侵犯其知识产权或存在不实内容时,应及时向本网站提出书面权利通知或不实情况说明,并提供身份证明、权属证明及详细侵权或不实情况证明。本网站在收到上述法律文件后,将会依法尽快联系相关文章源头核实,沟通删除相关内容或断开相关链接。 )

赞助商
2022-08-15
昇思MindSpore 1.8:丰富的算法集与套件,实现高性能训练,降低部署门槛
经过社区开发者们两个月来的不断努力,昇思MindSpore1.8版本现已发布。在此版本中,发布的MindSpore Golden Stick,提供了丰富的模型压缩算法;开源大模型训练套件MindSpore Transformer、推荐网络训练套件MindSpore Recommender,帮助开发者实现高性能的模型并行训练和推荐网络...

长按扫码 阅读全文