来帕多瓦联培已经一个多月了,最近调代码跑实验又发现了这个问题。这里提供另外一个解决思路。一个原因还是 cpu没跟上gpu节奏。
通常我们都会用尽可能大的 batch 来占满显存。但是如果cpu的读取和传输跟不上的话就会导致gpu利用率时上时下,而且训练时间还会变长。
这里可以尝试减小batch,以减轻cpu工作负担,增加gpu利用率,同时还能加速训练。 举个例子。
训练 基于resnet101+deeplabv3的语义分割模型:
1. batch size为4:总训练时间一小时;
2. batch size为2:总训练时间半小时;
下图为batch size=4时的设备状态。
可以看到gpu中间是有很多次休息的。
同时训练时间也要一个多小时。
下图为batch size=2时的设备状态。
可以看到,仅仅降低了batch size,就把gpu利用率拉满了。
同时训练时间也缩短了不少。
最后小batch的问题可以通过累积几个batch梯度再优化来解决。
总结
说到底还是不够有钱,这样也好,多出来的内存还能再让我跑跑别的程序!