刚刚解决一个问题,迫不及待地记录下来,可以给后来人参考下。
===========================================
环境
操作系统:Ubuntu
框架:Tensorflow-GPU 2.5.0
显卡数:4
===========================================
场景
PART1:故事的开头是这样的,这台机器属于单机多卡服务器,有四张A800,我在训练文本纠错任务的时候,使用了MirroredStrategy进行分布式计算,一次性的全占了这4张显卡。话说这分布式计算的效率就是高,计算能力至少提升了2-3倍。
后来,来了一个小伙伴,协商之后,我俩各2张卡。可是,他并没有按照约定使用2号和3号卡,而是使用了0号和3号卡(显卡排序是从0开始的)。
想着如此的话,那我就直接用1号和2号吧。
PART2:考虑如此,我立刻就想到了三个解决方案。
方案1:设置"CUDA_VISIBLE_DEVICES"环境变量。将其设置为"1,2"。
方案2:为MirroredStrategy指定"devices"参数["/gpu:1","/gpu:2"]。
方案3:手动设置set_visible_devices,使用PhysicalDevice强制指定。
PART3:结果全部都是OOM,我的第一反应就是,没有设置成功。因为,tensorflow打印出来的日志是,devices 0,1。这明显是不对啊,我们不是设置的1、2设备吗?怎么会如此?
===========================================
调整思路
找了很久没有找到问题在哪里,重新理一下思路吧。是不是可以先将CUDA_VISIBLE_DEVICES位置为0、1、2、3,把所有的显卡都设置为可用状态(即使0、3已经被占用),再使用【方案3】强制更改和指定GPU。可是,依旧不行,这是为什么?无法理解、无法想象,突然,想到是不是我设置的Batch Size 太大了?网络可以构建,但是无法训练,把Batch Size 修改小了,可以了。
===========================================
分析原因
原来是因为,之前我使用了默认的分布式模式,全部占用了4张卡,Batch Size 设置得比较大。后来算力降低了,没有更多的资源了,就导致了OOM的问题了。尤其是加上Tensorflow 给出的提示信息有很强的误导(如果指定了1、2设备,日志打印的是0、1devices,误导我,以为没有设置成功。分布到了0这个设备上,而0这个设备已经在被其他人使用了)。
后来,三个方案经过测试,都是可以的。
===========================================
总结
1、错误的日志信息会很大程度上误导人的判断。
2、理论知识的重要性,在实践当中得到了充分体现。
3、算力问题依旧是最大的问题。
如有疑问请到君羊:195889612