经过社区开发者们两个月来的不断努力,昇思MindSpore1.8版本现已发布。在此版本中,发布的MindSporeGoldenStick,提供了丰富的模型压缩算法;开源大模型训练套件MindSporeTransformer、推荐网络训练套件MindSporeRecommender,帮助开发者实现高性能的模型并行训练和推荐网络大模型训练;持续升级自定义算子能力,实现多平台的统一算子开发表达;统一图像处理类接口、提供model.fit高阶API和早停功能,不断提升API接口易用性;新增180多个算子的functional接口,并支持NPU、GPU、CPU平台,方便开发者调用。下面就带大家详细了解下1.8版本的关键特性。
1MindSporeGoldenStick,降低端侧AI部署门槛
MindSporeGoldenStick是华为诺亚实验室和昇思MindSpore团队基于昇思研发的模型压缩算法集,通过提供剪枝、量化等丰富的模型压缩算法,达到缩减模型参数量等效果,降低模型在端侧部署的门槛;此外,面向开发者还提供一套简单易用的算法接口,可降低模型压缩算法的应用成本。
MindSporeGoldenStick架构图
1.1统一的算法接口和改图能力
模型压缩算法种类繁多,不同算法的应用方式往往各不相同,这增加了应用算法的学习成本。MindSporeGoldenStick对算法应用流程做了梳理和抽象,提供了一套统一的算法应用接口,最大程度缩减算法应用的学习成本,同时这也方便了在各种算法的基础上,对自动模型压缩等高阶技术的探索。
同时,MindSporeGoldenStick提供了通过接口修改前端网络的能力,算法开发者可以基于此能力制定通用的改图规则去实现算法逻辑,而不需要针对每个特定的网络都实现一遍算法逻辑,提升算法开发效率。
1.2剪枝算法:SCOP[1],缩减模型功耗50%
MindSporeGoldenStick当前提供的一个结构化剪枝算法SCOP,在数据驱动下,设置了对照实验,通过引入对照特征来减少各种无关因素对剪枝过程的干扰,提高剪枝结果的可靠性。
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倍
MindSporeGoldenStick当前提供的一个量化算法是华为诺亚实验室自研的SLB。针对低比特网络量化,由于量化网络权值的有效解数量比较少,因此对网络的量化可以通过对权值搜索实现,也就是将量化过程转换成权值搜索的过程。与传统的量化算法相比,规避了不准确的梯度更新过程,能获得更好的准确率,在极低比特量化中更有优势。
对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高性能的大模型训练套件MindSporeTransformer
目前Transformer已经广泛地应用在深度学习的各个领域,为了结合昇思丰富的并行能力和高性能优化特性,让开发者能够轻松上手Transformer类网络训练,社区专门提供的MindSporeTransformer是一个开源的Transformer类网络训练和推理套件。套件提供了典型网络,例如GPT、T5、VIT等基础模型的训练能力,并结合昇思MindSpore丰富的并行训练能力,实现高性能的模型并行训练。通过实验得出,在相同的硬件条件下,昇思MindSpore比Megatron的性能要优越18%以上。
2.1多维度混合并行与图算融合优化
MindSporeTransformer主要应用了如下两种技术:
1.多维度混合并行,包含优化器并行、多副本并行等技术。通过优化数据并行维度上的冗余参数和通信计算并发,可有效提升网络的训练性能。
2.图算融合优化:昇思的图算融合功能可以自动实现算子融合和编译优化,提升模型的内存效率和训练速度。在MindSporeTransformer的所有模型和数据/模型并行模式下,图算融合均已大范围应用并取得了显著效果。
2.2性能对比
昇思研发团队分别在8p、16p和32pA100集群上测试了百亿规模GPT(hiddensize=5120,num_layers=35,num_heads=40)性能,模型并行路数设置为8,数据并行数分别为1、2、4,GlobalBatch为1024。Megatron配置MicroBatchSize=2,MindSpore配置MicroBatchSize=8,相比Megatron,昇思MindSpore的内存利用率更高,可以训练更大的BatchSize。
图吞吐率对比
如上图所示,8PMegatron的最大吞吐率为7.4ksamples/s,MindSpore最大吞吐率为9.3ksamples/s,超过Megatron25%;16PMegatron的最大吞吐率为13.6ksamples/s,MindSpore最大吞吐率为16.9ksamples/s,超过Megatron24%;32PMegatron的最大吞吐率为20.1ksamples/s,MindSpore最大吞吐率为23.8ksamples/s,超过Megatron18%。
开源链接:https://gitee.com/mindspore/transformer
3高性能的推荐网络训练套件MindSporeRecommender
推荐系统中部署了多种点击率模型,为提高推荐点击率,需要对深度CTR模型进行高效的训练,推荐网络的训练性能是模型实时性的重要因素之一。昇思MindSpore1.8版本提供了推荐网络大模型训练套件—MindSporeRecommender,结合昇思MindSpore自动并行、图算融合以及分布式EmbeddingCache等基础能力,实现了推荐网络大模型的高性能训练。在套件中提供了主流推荐网络模型端到端的训练流程,包括数据集预处理、模型训练、Benchmark等,为开发者提供了一站式的推荐大模型训练能力。
3.1推荐大模型训练架构
技术架构图
1.自动并行:通过模型并行实现Sparse计算多卡自动切分,数据并行实现Dense计算与集合通信并发执行,有效提升网络的整体训练性能。
2.分布式EmbeddingCache:采用多级EmbeddingCache、多级计算流水等设计,实现了大规模特征向量的存储与高性能训练。
3.分布式计算图:通过分布式计算图切分与执行,实现了大规模特征向量的分布式存储与高性能本地计算。
3.2性能对比
基于GPUV100集群WideDeep模型训练,如下图所示,单机八卡上昇思MindSpore的吞吐率优于HugeCTR35%。
图WideDeep训练吞吐率
开源链接:https://gitee.com/mindspore/recommender
4自定义算子持续升级,统一表达支持高效添加算子
年初发布昇思MindSpore1.6版本提供了多平台的统一算子开发接口Custom,能够快捷地进行不同类型自定义算子的定义和使用。为了进一步提升自定义算子的体验,昇思MindSpore1.8版本提供统一的MindSporeHybridDSL表达,支持包括Ascend,GPU和CPU在内多平台的统一算子开发表达,可以在全平台同时满足快速验证和实时编译的需求。此外,1.8版本提供接入Julia算子的自定义算子新模式,成为业界首个支持Julia语言的AI框架。
4.1跨平台统一的MindSporeHybridDSL表达
MindSporeHybridDSL支持在不同平台用统一的表达开发算子,一次开发便可以在所有后端使用。此外,开发的算子接入Custom接口时,既可以通过hybrid模式即时编译运行,亦可通过pyfunc模式解释运行方便快速验证。
此外基于MindSporeHybridDSL提供新的调度原语,帮助hybrid类型自定义算子在Ascend后端使能多面体模型的专用处理器来实现上述功能,对标业界框架,昇思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
8MindSporeReinforcement,提供高性能分布式训练和原生蒙特卡洛树搜索算法
8.1通过DataflowFragment实现灵活,高性能的分布式训练
当前分布式强化学习框架主要以Python函数的方式实现强化学习算法,虽然具有直观的编程API,但在多机并行和异构加速上却很有挑战。
MindSporeReinforcementv0.5.0提供基于DataflowFragment的分布式策略,支持将深度强化学习算法分割成多个数据流片段,并映射到异构设备上执行。相同的算法可以根据不同的分布式策略而部署到单机多卡或多机多卡上。下图中展示了基于DataflowFragment的分布式策略,以及对应的训练加速效果,在多机多卡分布式训练场景下可大幅缩短算法的训练时间。
图分布式策略示意图
图不同分布式策略下的训练时间
详情参考:https://gitee.com/mindspore/reinforcement/tree/master/example/ppo
8.2蒙特卡洛树搜索
蒙特卡洛树搜索是一种决策搜索算法,以MCTS为基础的强化学习算法获得成功之后,MCTS在强化学习算法中的应用越来越广泛。
图MSTC算法伪代码
MindSporeReinforcementv0.5.0提供了通用可扩展的MCTS算法。开发者可以使用Python在强化学习算法中直接调用框架内置的MCTS算法,也可以通过扩展来完成自定义逻辑,框架自动将算法编译成计算图,实现高效执行。
详情参考:https://gitee.com/mindspore/reinforcement/tree/master/example/mcts
9参考文献
[1]Tang,Yehui,etal.Scop:Scientificcontrolforreliableneuralnetworkpruning.NeurIPS2020:10936-10947.
[2]YangZ,WangY,HanK,etal.Searchingforlow-bitweightsinquantizedneuralnetworks.NIPS,2020.
TAG:百科 | 数码 | 昇思MindSpore1 | 8 | 昇思 | MindSpore
文章链接:https://keji.96ws.com/48198.html