1.背景
2.训练
实现框架
训练配置
大文件读存
问题记录
- 训练过程在固定step卡住
问题描述:使用小批量数据没问题,当使用一定数量数据时。他会在固定step卡住,观察资源占用:在卡住之前,CPU利用率几乎拉满,GPU利用率和内存很低,卡住之后GPU利用率却占满了。
可能原因:1. DataLoader的计算是在cpu中执行,在此模型中,需要计算图像从base64编码转位Image,再resize、crop、transform到一个Tensor向量。这一步是计算密集行,shm-size太小导致死锁; 2. DataLoader没有把足够的data load出来,比如在预处理某张图片时进入了死循环;在分布式训练时,只要有一个GPU没有得到batch_size的数据,那么其他GPU就会一直等待这个GPU,造成这种100%利用率并卡住的情况;
处理方案:将DataLoader中的计算部分工作预先做好,计算好所有sample的Tensor向量存下来,训练数据时候直接加载。
3.知识点记录
基础概念:
note:物理节点,一台机器或者容器,节点可以有多个GPU。
rank:表示进程的编号/序号。
local_rank:指一个note上进程的相对序号。
word size:一个分布式训练任务中rank的数量。
DDP模式和DP模式说明:DDP在各进程梯度计算完成之,各进程需要将梯度进行汇总平均,然后再由 rank=0 的进程,将其 broadcast 到所有进程后,各进程用该梯度来独立的更新参数。而 DP是梯度汇总到GPU0,反向传播更新参数,再广播参数给其他剩余的GPU。
由于DDP各进程中的模型,初始参数一致 (初始时刻进行一次 broadcast),每个进程有自己的optimizer,而每次用于更新参数的梯度也一致,因此,各进程的模型参数始终保持一致。而在DP中,全程维护一个 optimizer,对各个GPU上梯度进行求,而在主卡进行参数更新,之后再将模型参数 broadcast 到其他GPU.相较于DP, DDP传输的数据量更少,因此速度更快,效率更高。