dw如何制作多个网页,seo技术网站建设,腾讯云服务器cvm,中网建站目录 问题描述及配置网上资料查找1.tqdm问题2.dataloader问题3.model(input)写法问题4.环境变量问题 我的卡死问题解决方法 问题描述及配置
在使用hugging face开源库accelerate进行多GPU训练#xff08;单机多卡#xff09;的时候#xff0c;经常出现如下报错
[E Process… 目录 问题描述及配置网上资料查找1.tqdm问题2.dataloader问题3.model(input)写法问题4.环境变量问题 我的卡死问题解决方法 问题描述及配置
在使用hugging face开源库accelerate进行多GPU训练单机多卡的时候经常出现如下报错
[E ProcessGroupNCCL.cpp:828] [Rank 1] Watchdog caught collective operation timeout: WorkNCCL(OpTypeBROADCAST, Timeout(ms)1800000) ran for 1808499 milliseconds before timing out.
[E ProcessGroupNCCL.cpp:587] [Rank 0] Watchdog caught collective operation timeout: WorkNCCL(OpTypeALLREDUCE, Timeout(ms)1800000) ran for 1808493 milliseconds before timing out.而且程序能正常运行几十个epoch然后在运行中间卡死。卡死的位置永远是出现在测试集进行eval结束之后而不是出现在对训练集的训练过程中。
例如我每40个epoch进行一次测试eval那么卡死经常会出现在第80个epoch或者第120个epoch的位置有时候还会出现在第400个epoch。
在卡死的时候每个GPU使用率达到100%一条100%的直线但是CPU使用率降到0%一条0%的直线
完整报错如下图所示
网上资料查找
我查阅网上资料有很多种方法解决如下问题虽然网上所查阅到的方法都没有解决我的问题但是在这里都记录一下或许对大家有用
1.tqdm问题
有说在训练过程中如果使用了tqdm打印进度条会出现卡死的问题需要将所有tqdm代码都删除
2.dataloader问题
dataloader分为两种问题
有的博客说使用pytorch中的dataloader对dataset进行封装的时候在多GPU训练的情况下会卡死所以需要去除dataloader的封装直接使用dataset进行训练但是我认为这种说法不可靠有的博客说使用dataloader的时候如果设置了drop_lastFalse或者是设置了shuffleTrue会导致开始我认为这种说法也不可靠
3.model(input)写法问题
在给予模型输入进行正向传播的时候我们通常写法是
outputmodel(input)一些说法说这种写法在多GPU训练的时候在模型进行eval的时候需要改一下
outputmodel.module(input)这样即可解决问题
4.环境变量问题
环境变量问题应该是最主要的一个解决方案即更改环境变量。更改环境变量有很多方法这里说一下在bash中临时更改环境变量的方法
即在bash中输入
export NCCL_P2P_LEVELNVL或者输入
export NCCL_P2P_DISABLE1然后再运行多GPU训练的代码
我的卡死问题解决方法
我经过长时间调试发现我的问题出在这里
我每次在eval的时候都会判断这次测试集的loss是否和以往的相比是否是最小的如果是最小的那么获取这一个epoch的模型参数问题就出现在获取模型参数这里红框画出来的 或者如果不加self.accelerator.wait_for_everyone()也是一样的会出现同样的问题 卡死就在获取模型参数的部分这里就是“有概率”出现卡死因为运行一次可能没问题但是如果我每40个epoch就运行一次eval那么在第80个第120个epoch就会卡死。
我猜测这是由于accelerate是通过多进程来控制多个GPU进行训练的这里多个进程都去获取模型参数所以才会出现卡死的情况。
因此解决方法如下 在判断条件中要加上判断是否在主进程中然后去掉self.accelerator.wait_for_everyone()
这样就解决了卡死的问题。