自PyTorch 1.x发布迭代后,使用PyTorch原生自带的DDP进行分布式训练逐渐形成了主流。本文为您介绍如何使用AIACC-Training,对基于PyTorch框架搭建的模型进行分布式训练加速的方法,以及可能遇到的问题和解决办法。
适配PyTorch DDP API(推荐)
背景信息
关于PyTorch DDP的更多信息,请参见PyTorch官网。
代码适配与运行
示范用例
AIACC-Training软件包路径中为您提供了已适配DDP的示例代码。您可以通过以下操作体验训练过程。
适配Horovod API
前提条件
已将Perseus更新至1.3.2或以上版本,否则会影响您使用PyTorch的相关加速功能。
操作步骤
import perseus.torch.horovod as hvd
如果您的训练代码是非分布式代码,可以参考以下操作步骤将训练代码升级为Horovod接口的分布式训练代码。
常见问题
模型数据存放位置冲突,导致报错Input type (CUDAFloatTensor) and weight type (CPUFloatTensor) should be the same
通常情况下,是因为存在模型的参数不在GPU中,而输入数据在GPU中,遗漏了model的cuda操作导致。您可以通过增加model.cuda()
将模型转移到GPU上来解决该问题。
出现报错RuntimeError: all tensors must be on devices[0]
请排查:
- 是否在程序初始化时候指定了gpu_ids,如
torch.cuda.set_device(hvd.local_rank())
。 - 是否采用DataParallel的时候没有统一设置。请设置一致的device_ids,如
nn.DataParallel(model.cuda(), device_ids=str(hvd.local_rank()))
。
加载模型显存OOM
一般是由于模型数据太大导致,可以通过将模型导入为CPU内存来解决此问题,如torch.load(pretrain, map_location='cpu')
。
系统提示退出异常
首先请确保您已经正确完成了代码的适配操作。具体操作,请参见代码适配与运行。
发生该异常可能出自多个模型的组合问题。您需要将多个模型的named_parameters进行合并,然后再传递给Perseus进行Optimizer的封装。另外,多个模型组合时的广播参数需要设置为广播所有参数,因此,也需要进行state_dict的参数合并。
系统提示端口被占用
请先确认已有的端口是否被其他进程占用,如果有,可以使用pkill python
命令进行进程杀除。
在Torch 1.9版本,默认使用的启动方式为torch.distributed.run,该方式使用默认的rdzv_backend作为训练的launcher,但是在启动训练之前就已经创建了服务,而代码里如果有dist.init_process_group()
则会继续创建该服务,因此导致冲突,单机多卡情况下可以增加配置选项--standalone
解决该问题。