分布式训练分为这几类:
按照并行方式来分:模型并行 vs 数据并行
按照更新方式来分:同步更新 vs 异步更新
按照算法来分:Parameter Server算法 vs AllReduce算法
torch.nn.DataParallel
torch.nn.DataParallel(module, device_ids=None, output_device=None, dim=0):
这个函数主要有三个参数:
- module:即模型,此处注意,虽然输入数据被均分到不同gpu上,但每个gpu上都要拷贝一份模型。
- device_ids:即参与训练的gpu列表,例如三块卡, device_ids = [0,1,2]。
- output_device:指定输出gpu,一般省略。在省略的情况下,默认为第一块卡,即索引为0的卡。此处有一个问题,输入计算是被几块卡均分的,但输出loss的计算是由这一张卡独自承担的,这就造成这张卡所承受的计算量要大于其他参与训练的卡。