AscendSpeed提供两种数据并行方式,分别是Local Distributed Data Parallel(以下简称为LocalDDP)和torch Distributed Data Parallel(以下简称torchDDP)。
class DistributedDataParallel(DistributedDataParallelBase):
"""DDP with contiguous buffers options to storre and accumulate gradients.
def __init__(self, module,
accumulate_allreduce_grads_in_fp32,
use_contiguous_buffers):
参数说明:
两者都存在hook机制,保证原有的训练过程不受影响:程序提供hook接口,用户可以写一个hook函数,然后钩在hook接口,即程序的主体上从而可以插入到中间执行。DDP使用hook技术把自己的逻辑插入到module的训练过程中去。parameter在反向梯度计算结束后提供了一个hook接口。DDP把Ring-Reduce的代码写成一个hook函数,插入到这里。每次parameter的反向梯度计算结束后,程序就会调用这个hook函数,从而开启Ring-Reduce流程。
训练脚本参数配置示例,加粗部分为DDP功能配置参数示例:
python pretrain_gpt.py \ --DDP-impl local \ --num-layers 30 \ --hidden-size 4096 \ --num-attention-heads 32 \ --micro-batch-size 4 \ --global-batch-size 8 \ --seq-length 2048 \
通过修改输入参数--DDP-impl的值来确定使用何种类型的DDP,可选值“torch”和“local”.其中与localDDP相关的输入参数--no-contigous-buffers-in-local-ddp若设置了则表示在local DDP中不使用连续存储空间。
def unwrap_model(model, module_instances=(torchDDP)):
return_list = True
if not isinstance(model, list):
model = [model]
return_list = False
unwrapped_model = []
for model_module in model:
while isinstance(model_module, module_instances):
model_module = model_module.module
unwrapped_model.append(model_module)
if not return_list:
return unwrapped_model[0]
return unwrapped_model