本文主要解决pytorch在进行模型训练时出现GPU的0卡占用显存比其他卡要多的问题。
如下图所示:本机GPU卡为TITAN RTX,显存24220M,batch_size = 9,用了三张卡。第0卡显存占用24207M,这时仅仅是刚开始运行,数据只是少量的移到显卡上,如果数据在多点,0卡的显存肯定撑爆。出现0卡显存更高的原因:网络在反向传播的时候,计算loss的梯度默认都在0卡上计算。因此会比其他显卡多用一些显存,具体多用多少,主要还要看网络的结构。
因此,为了防止训练由于 out of memory 而中断。比较笨的办法是将batch_size设为6,即每张卡放2条数据。
batch_size = 6时,其他不变,如下图所示
有没有发现问题?显存只用了1,2卡的显存只用了16G不到。就因为0卡可能会超那么一点点显存,而牺牲了batch_size。
那么没有更优雅的方法呢?答案是肯定的。那就是借用下transformer-xl中用到的 BalancedDataParallel类。代码如下(代码出处)&