代码
MindSpore开源大模型训练框架——MindSpore Transformer,轻松训练大模型!

MindSpore开源大模型训练框架——MindSpore Transformer,轻松训练大模型!

MindSpore开源大模型训练框架——MindSpore Transformer,轻松训练大模型!

Transformer模型和自监督预训练模式的提出,给NLP、CV和多模态等多个人工智能应用领域开辟了新的方向。通过增加模型参数量和数据规模,预训练模型在实际领域的表现还在持续地提升。

另一方面,参数量的提升给模型训练带来了新的挑战。GPT-3、T5等大规模Transformer模型通常至少需要上百张GPU卡进行长达数月的训练,耗费几百万美金的训练成本。

模型并行是解决大模型训练时显存不足的一个主流方法,然而模型并行会不可避免的引入通信时间,造成计算资源的空闲等待。如何更加高效地、分布式地训练这些“巨无霸”们,是目前整个业界都在思考的一个问题。

目前,众多企业和开源机构推出了专门的Transformer模型训练库,其中以NVIDIA基于Pytorch开发的Megatron-LM训练库在各方面性能上较为领先。

本次我们开源了MindSpore Transformer模型训练库,相比Megatron,MindSpore Transformer训练库具有更全面的图算融合技术、更高的内存效率,在训练大规模Transformer模型时表现出了更高的性能。

一、

图算融合优化

MindSpore的图算融合功能可以自动实现算子融合和编译优化,提升模型的内存效率和训练速度。

图算融合技术的详情可以查看此处链接:

https://www.mindspore.cn/docs/zh-CN/r1.7/design/graph\_kernel\_fusion\_engine.html

Transformer大模型网络中包含大量的memory-intensive类型算子,融合优化空间非常大。为了获得极致性能,传统大模型训练框架通常手工实现大量的融合算子进行替代,需要投入大量的算子开发和调优工作量,同时也很难做到通用和泛化。

为了解决该问题,MindSpore使用了图算融合进行大模型的融合优化,并取得了可以媲美手工极致融合的性能优化效果。这也是目前业界首次完整将自动算子融合技术引入大模型优化场景,并作为主要融合优化手段的技术探索。

针对大模型场景,图算融合充分发挥自身多层次多维度融合子图生成、基于Polyhedral的高性能融合算子调度和优化等关键能力。既实现了极致优化性能,也显著减少了中间tensor占用和显存开销。这使得MindSpore Transformer训练库相比业界其它训练库,具有更好的性能泛化性和通用性,为后续持续进行模型创新提供性能保障。

二、

灵活易用的并行技术,

单卡到大规模集群的无缝切换

MindSpore Transformer利用MindSpore内置的并行技术,能够自动进行拓扑感知,高效地融合数据并行和模型并行策略,实现单卡到大规模集群的无缝切换。

低门槛的并行易用性 受益于MindSpore的并行能力。MindSpore Transformer能够从单卡一键拓展到多卡训练。

context.set_auto_parallel_context(parallel_mode="stand_alone") # 单卡
context.set_auto_parallel_context(parallel_mode="data_parallel") # 数据并行
context.set_auto_parallel_context(parallel_mode="semi_auto_parallel") # 半自动并行

用户可以在启动脚本中传入"--parallel_model=data_parallel"参数来使能上述功能。

丰富的并行特性,一键使能——如下代码展示了MindSpore Transformer库中进行模型并行的设置。MindSpore预定义了一套基础的并行策略,用户通过配置model_parallel模型并行数和data_parallel数据并行数,就可以直接实现Tranformer类网络的模型并行,实现大模型训练。

parallel_config = TransformerOpParallelConfig(model_parallel=config.model_parallel, # 模型并行
                                  data_parallel=config.data_parallel, # 数据并行
                                  recompute=True, # 开启重计算
                                  optimizer_shard=True) # 开启优化器并行
transformer = Transformer(hidden_size=config.hidden_size,
                          batch_size=config.batch_size,
                          ffn_hidden_size=config.hidden_size * 4,
                          src_seq_length=config.seq_length,
                          tgt_seq_length=config.seq_length,
                          encoder_layers=config.num_layers,
                          attention_dropout_rate=config.dropout_rate,
                          hidden_dropout_rate=config.dropout_rate,
                          decoder_layers=0,
                          num_heads=config.num_heads,
                          parallel_config=config.parallel_config)

受益于MindSpore丰富的并行能力,MindSpore Transformer整体代码量7000行即可实现Megatron几万行的代码量,在代码的灵活度和通用性上,MindSpore Transformer提供了更加清晰和易用的自定义能力。

此外,MindSpore Transformer库同时提供多种并行技术:流水线并行、优化器并行、MicroBatch Interlerved以及专家并行。

为了解决算子级模型并行引入的通信导致计算资源空闲的问题,我们创新性提出了MicroBatch Interlerved来实现模型的加速训练。用户可以持续关注仓库的最新进展并进行体验。

三、

实验结果

我们分别在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%。

四、

未来展望

大模型训练一直是业界的热点之一,国内外的大模型也在不断地推陈出新,MindSpore Transformer 库也将会持续不断的更新和演进。未来我们计划增加更多的预训练语言模型,例如MoE、多模态等大模型,欢迎关注和使用。

开源链接:

https://gitee.com/mindspore/transformer