大规模预训练模型预训练工作记录

166 阅读2分钟

1.背景

2.训练

实现框架

训练配置

大文件读存

问题记录

  1. 训练过程在固定step卡住

photo_2021-11-04 18.03.08.jpeg

问题描述:使用小批量数据没问题,当使用一定数量数据时。他会在固定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传输的数据量更少,因此速度更快,效率更高。


参考

GPU/CPU利用率优化
分布式训练数据分发讲解