分布式训练(记录)
为什么要分布式训练?
单机训练有物理上限:
显存不够(大模型根本放不下)
单机计算慢(数据量一多就耗时太长)
多卡并行性不高
分布式训练的常见方式
- Data Parallel(数据并行)
每个GPU上一份模型副本,数据划分好,梯度求完再聚合。
优点:简单,容易实现
缺点:模型太大会超显存
例如,之前我用过数据并行:多卡拷贝同一个模型、数据拆开、梯度同步、一起更新
train_sampler = torch.utils.data.distributed.DistributedSampler(train_dataset)
val_sampler = torch.utils.data.distributed.DistributedSampler(val_dataset, shuffle=False)
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=args.batch_size // dist.get_world_size(), shuffle=(train_sampler is None),num_workers=args.workers, pin_memory=True, sampler=train_sampler, drop_last=True)
- 貌似还有其他实现方法,后面慢慢补充
- Model Parallel(模型并行)
把模型切成几部分,分别放在不同GPU上。
优点:超大模型能跑
缺点:实现麻烦,通信开销大 - Pipeline Parallel(流水线并行)
模型分段,数据分批次轮流流经各段。
适合:超大模型 + 数据并行结合
代表:DeepSpeed、Megatron-LM - Hybrid Parallel(混合并行)
结合数据、模型、流水线多种并行方式。
后续在实践中在遇到更多的情况和实现方法在补充吧。。