昇思 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 数据集结果
1.3 量化算法:SLB[2],压缩模型 8-32 倍
MindSpore Golden Stick 当前提供的一个量化算法是华为诺亚实验室自研的 SLB(Searching for low-bit weights,基于权值搜索的低比特神经网络量化)。针对低比特网络量化,由于量化网络权值的有效解数量比较少,因此对网络的量化可以通过对权值搜索实现,也就是将量化过程转换成权值搜索的过程。与传统的量化算法相比,规避了不准确的梯度更新过程,能获得更好的准确率,在极低比特量化中更有优势。量化算法:SLB[2],压缩模型 8-32 倍
对 SLB 算法做了简单的实验,结果如下图所示,在当前任务中,与全精度模型相比,4bit 权重量化后的模型大小缩减为原来的 1/8,但 top1 精度没有损失,1bit 权重量化的精度损失在 0.6%以内,此时可以获得 32 倍的模型压缩效果。
SLB 权重量化算法用于量化 ResNet18 的 CIFAR-10 数据集结果,W32 表示全精度模型,W4,W2,W1 分别对应 4bit、2bit 和 1bit 权重量化模型
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%。
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 训练吞吐率
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 后端加速科学计算任务。
4.2 业界首个支持 Julia 语言的 AI 框架
Julia 是一种速度快且使用简单的高级通用编程语言,最初设计是用于科学计算领域,而由于其高效而实用的特性,近些年来越来越受到青睐,逐步迈向主流编程语言。昇思 MindSpore 1.8 版本在算子开发接口 Custom 提供 Julia 模式,把基于 Julia 语言开发的算子和基于昇思开发的模型有机地结合在一起。开发者可以采用 Julia 算子加速运算,也可以使用 Julia 生态高效地开发算子。如此,开发者在模型移植、快速验证以及模型加速等场景下使能 Julia 算子,在基于昇思 MindSpore 开发的模型中享受 Julia 语言对计算带来的收益。
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.运行方式举例,如下图所示。
6 支持边训练边推理和早停功能
6.1 提供 model.fit 高阶 API
之前的训练及推理分别通过 model.train 和 model.eval 两个接口执行,如果在训练过程中需要查看验证集的评估指标来监控模型效果,需手动实现;而昇思 MindSpore1.8 提供 model.fit 高阶 API,对 model.train 及 model.eval 进行了封装,保证原有功能的情况下简化了开发流程,开发者只需传入对应的参数,即可一行代码实现自动化训练及推理。
6.2 实现 EarlyStopping 和 ReduceLROnPlateau 功能
为及时掌握训练过程中模型的状态、实时观察模型各参数的变化情况和实现训练过程中自定义的一些操作,昇思提供了回调机制(Callback)来实现上述功能,对标业界框架,昇思 MindSpore1.8 版本新增 EarlyStopping 及 ReduceLROnPlateau 两个 Callback,可用于 model.train 和 model.fit 中,实现指定指标的 Epoch 级别的验证:当指标值变差,超过可容忍阈值或等待时间超过可容忍 Epoch 数时,EarlyStopping 将终止训练过程实现早停,而 ReduceLROnPlateau 将按照开发者指定的学习率衰减规则,改变学习率。
7 支持网络的常量输入可变,提升编译效率
当前图编译机制是除 Tensor 外所有顶层网络的输入都被当做常量值,如标量、tuple、list 和 dict。而常量值是不能求导的,而且在编译优化阶段会被常量折叠掉。
另外,当网络的输入是 tuple[Tensor],list[Tensor]或 dict[Tensor]时,即使里面 Tensor 的 shape 和 dtype 没有发生变化,在多次调用同一个网络去得到结果时,由于输入都被当做常量值去处理了,无法忽略掉里面 Tensor 的具体数值,所以导致网络每次都会被重新编译,降低训练效率。
为解决以上的问题,昇思 MindSpore1.8 版本新增了 mutable 接口去设置网络的常量输入为“可变的”,也就是把这个输入当做像 Tensor 一样的变量,从而可以对其求梯度以及防止网络被重复编译。接口用法也比较简单,在传参时对网络输入用 mutable 接口进行包裹即可,如下图所示。
图 用例对 tuple[Tensor]类型的输入进行包裹
8 MindSpore Reinforcement,提供高性能分布式训练和原生蒙特卡洛树搜索算法
8.1 通过 Dataflow Fragment 实现灵活,高性能的分布式训练。
当前分布式强化学习框架主要以 Python 函数的方式实现强化学习算法,虽然具有直观的编程 API,但在多机并行和异构加速上却很有挑战。
MindSpore Reinforcement v0.5.0 提供基于 Dataflow Fragment 的分布式策略(DP),支持将深度强化学习算法分割成多个数据流片段,并映射到异构设备上执行。相同的算法可以根据不同的分布式策略而部署到单机多卡或多机多卡上。下图中展示了基于 Dataflow Fragment 的分布式策略,以及对应的训练加速效果,在多机多卡分布式训练场景下可大幅缩短算法的训练时间。
图 分布式策略示意图(左:分布式策略 1; 右:分布式策略 2)
图 不同分布式策略下的训练时间
8.2 蒙特卡洛树搜索(MCTS)
蒙特卡洛树搜索(MCTS)是一种决策搜索算法,以 MCTS 为基础的强化学习算法(如 AlphaGo)获得成功之后,MCTS 在强化学习算法中的应用越来越广泛。
图 MSTC 算法伪代码
MindSpore Reinforcement v0.5.0 提供了通用可扩展的 MCTS 算法。 开发者可以使用 Python 在强化学习算法中直接调用框架内置的 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.
评论