其他特性
切分策略传播
在算子级并行中,需要用户配置正向网络中每个算子的切分策略(若不配置,则默认使用数据并行的策略)。而切分策略传播特性可以仅配置若干个算子的切分策略,为未配置切分策略的算子自动生成可行的切分策略,并且达到最小化通信开销的效果。
Parameter Server模式
Parameter Server(参数服务器)是分布式训练中一种广泛使用的架构,相较于数据并行同步的AllReduce训练方法,Parameter Server具有更好的灵活性、可扩展性以及节点容灾的能力。参数服务器既支持同步SGD(Stochastic Gradient Descent,随机梯度下降),也支持异步SGD的训练算法。在扩展性上,将模型的计算与模型的更新分别部署在Worker和Server两类进程中,使得Worker和Server的资源可以独立地横向扩缩(新增或者删除Worker和Server资源)。另外,在大规模数据中心的环境下,计算设备、网络以及存储经常会出现各种故障而导致部分节点异常,而在参数服务器的架构下,能够较为容易地处理此类故障而不会对训练中的任务产生影响。
通信算子融合
在分布式训练场景下,跨设备甚至跨节点的数据传输是制约扩展性以及算力利用率的瓶颈。通信算子融合是一种提升网络资源利用率、加速数据传输效率的重要方法,其将相同源节点和目的节点的通信算子打包同时执行,以避免多个单算子执行带来的额外开销。
通信子图提取与复用
在分布式训练场景下,随着模型规模的扩大,训练时所需要的通信算子数量不断增多,一方面会增加模型编译的通信耗时;另一方面会消耗大量的流资源,当所需的流数量超过硬件限制,模型规模就无法继续扩大,从而成为大模型发展的一个瓶颈。通过对通信算子进行归类,提取通信子图并进行复用,可以减少图编译中的通信算子数量。一方面可以减少通信耗时,减少模型编译耗时;另一方面减少了流的占用,使得模型可以进一步扩展。
数据集切分
在进行分布式训练时,需要将训练数据集导入到每个设备上。常见的导入方式有两种:1)以数据并行的方式导入,即将数据按batch维度进行切分,每个设备导入一部分。2)每个设备导入全量的数据。另外,当数据的某些维度特别大时(如遥感图片的H/W维可能特别大),即使样本数很少,也需要对图片进行切分,即将数据按H/W维度进行切分,每张设备读取一部分图片。此特性能支持将数据集按特定维度切分,以满足大幅面图片处理领域的训练诉求。
函数式算子切分
在动态图模式下,指定网络结构中的某个部分以图模式执行,并进行各种并行操作。
在K8s集群中使用ms-operator进行分布式训练
MindSpore Operator 是MindSpore在Kubernetes上进行分布式训练的插件。CRD(Custom Resource Definition)中定义了Scheduler、PS、Worker三种角色,用户只需配置yaml文件,即可轻松实现分布式训练。
当前ms-operator支持普通单Worker训练、PS模式的单Worker训练以及自动并行(例如数据并行、模型并行等)的Scheduler、Worker启动。详细流程请参考ms-operator。
特性相关接口说明
特性类别 |
特性接口 |
说明 |
作用 |
---|---|---|---|
自动并行 |
set_auto_parallel_context(search_mode=mode) |
用于指定策略搜索算法,其值为字符串类型,可选值为:1,“sharding_propagation”:表示使用切分策略传播算法进行策略搜索;2,“dynamic_ programming”:表示使用动态规划算法进行策略搜索;3,“recursive_programming”:表示使用双递归算法进行策略搜索; |
自动并行可以让用户不配置或者少量配置算子的切分策略,而由框架搜索出切分策略。 |
set_algo_parameters(fully_use_devices=bool_value) |
用于设置搜索策略时是否需要将算子切分到所有设备上。其值为bool类型,默认为True。 |
如果将算子切分到所有设备上,则能缩小搜索空间,提高搜索速度,但搜索出来的策略并非全局最优。 |
|
set_auto_parallel_context(all_reduce_fusion_config=config) |
配置梯度AllReduce算子融合策略,其值为list类型。例如:[20, 35],表示将前20个AllReduce融合成1个,第20~35个AllReduce融合成1个,剩下的AllReduce融合成1个。 |
减少AllReduce通信算子的操作次数,提高通信效率 。 |
|
通信算子融合 |
set_auto_parallel_context(comm_fusion=config) |
设置通信算子的融合配置,当前支持AllReduce、AllGather、ReduceScatter通信算子的配置。其值为dict类型,如comm_fusion={“allreduce”:{“mode”:“auto”,“config”:None}}。其中“mode”有三种选项:“auto”:自动按照数据量阈值64MB进行算子融合,配置参数“config”为None。 “size”:按照手动设置数据量阈值的方式进行通信算子融合,配置参数“config”类型为int,单位MB。“index”:仅“allreduce”支持配置index,表示按照通信算子序列号进行融合的方式,配置参数“config”类型为list。 例如:[20,35],表示将前20个AllReduce融合成1个,第20~35个AllReduce融合成1个,剩下的AllReduce融合成1个。 |
减少AllReduce/AllGather/ReduceScatter通信算子的操作次数,提高通信效率。 |
通信子图提取与复用 |
export MS_COMM_COMPILER_OPT=integer_value |
用于开启通信子图提取与复用,并配置可以复用的通信算子的上限。可以设置为-1或正整数,设为-1表示使用框架默认的通信算子复用上限。默认不设置该环境变量,即关闭通信子图提取与复用。 |
减少图编译中的通信算子数量,减少使用的通信流数量,降低编译耗时,提升编译性能。 |
数据集切分 |
set_auto_parallel_context(dataset_strategy=config) |
配置数据集的切分策略。其中,config为Union[str,tuple]。当传入字符串时,有两种选项:“full_batch”:表示数据集不切分;data_paralel”:表示数据集按数据并行的方式切分。当传入tuple时,tuple中的内容代表数据集的切分策略,类似于primitive的shard()接口。若不调用此接口,则默认采用“data_parallel”的方式。 |
当样本数比卡数少时,可以采用“full_batch”的方式进行导入;当样本数大、模型参数小时,可以采用“data_parallel”的方式导入; 当数据集是高分辨率图像数据时,可以采用配置tuple切分策略的方式导入。 |
分布式推理 |
infer_predict_layout(*predict_data) |
使用推理数据进行一次预编译,输出算子的切分信息。 |
获取推理时所有权重的切分信息。 |
load_distributed_checkpoint(network,checkpoint_filenames,predict_strategy=None,train_strategy_filename=None) |
加载分布式权重,需每台机器预先放置全量的ckpt。其中network代表推理网络,checkpoint_filenames代表checkpoint文件,predict_strategy为infer_predict_layout()的输出,train_strategy_filename为训练时保存的算子切分策略信息。 |
加载分布式权重,以进行分布式推理。 |
|
函数式算子切分 |
shard(in_strategy,out_strategy=None,parameter_plan=None,device=”Ascend”,level=1)Cell的成员方法 |
设置cell的输入、输出及关键参数的切分策略,其余算子的并行策略由切分策略传播得到。in_strategy/out_strategy指定输入/输出张量的切分策略,parameter_plan指定关键参数的切分策略,device指定执行设备,level指定切分策略传播算法的模式。 |
在PyNative模式下指定某个cell实例以图模式执行,并且依据指定的输入输出和关键参数的切分策略进行算子级别的模型并行,其余的部分仍以PyNative模式执行数据并行。 |
mindspore.shard(fn,in_strategy,out_strategy=None,parameter_plan=None,device=”Ascend”,level=1) |
传入的fn为cell实例或函数,其余输入和shard相同,返回值为函数,再调用此函数时,会以图模式执行算子级别的模型并行。 |
此用法可以指定某个函数/cell实例进行算子级别的模型并行,具体功能和cell的shard方法相同。 |