多GPU训练
Python’s GIL限制
Global Interpreter Lock
是一个互斥锁,用于保护对Python对象的访问,从而防止多个线程同时执行Python字节码。,确保任何时候只有一个线程在运行,无法将多个处理器的线程一起使用(使用multiprocessing库)
multiprocessing library
使用进程池 multiprocessing.Pool(p)
P为默认的CPU核心数
线程安全
Python线程共享内存,访问数据取决于调度算法
GIL保证一次只运行一个线程
GIL瓶颈
许多I/O,图像处理和NumPy数学运算在GIL之外
- 阻碍多线程Cpython程序充分利用多处理器优势
- GIL内部花费大量时间来解释CPython字节码的多线程程序
并行的方式计算Loss
DataParallel(DP)
每个部分输出保留在其GPU上,而不是将所有部分输出收集到 master节点上。 我们还需要分配我们的损失准则计算,以便能够计算和反向传播我们的损失。
Multi Machine(DDP)
Distributed training (torch.nn.DistributedDataParallel)
即使在单机设置中,DistributedDataParallel仍可以有效地替换DataParallel。
在每个节点上独立启动python脚本,通过PyTorch分布式后端同步
each training script
- 独立的optimizer :no parameter broadcast ( DataParallel is needed)
- 独立的Python解释器:避免在单个Python解释器中驱动多个并行执行线程而产生GIL-freeze。
调整每个机器(节点)的Python训练脚本
保证每个节点能分别运行脚本,每块GPU分配单独进程
- 初始化分布式后端以进行同步
- 封装模型并准备数据以在数据的单独子集上训练每个流程
1 | from torch.utils.data.distributed import DistributedSampler |
多节点启动
torch.distributed.launch
可在每个训练节点上产生多个分布式训练进程 GPU 0 to GPU(nproc_per_node-1)
1 | python -m torch.distributed.launch |