使用CPU与GPU训练模型 - 速度与内存

时间:2017-05-03 14:19:20

标签: performance tensorflow cpu ram

我正在努力训练发现的模型 https://github.com/silicon-valley-data-science/RNN-Tutorial使用https://github.com/jupiter126/Create_Speech_Dataset生成的数据集(大约340000个带有成绩单的小wav音频样本)。

当我使用GPU进行训练时,训练速度相对较快,但是如果没有达到OOM,我就无法将batch_train_size设置为25以上。
当我使用CPU进行训练时,训练速度要慢得多,但我可以轻松地将batch_train_size设置为250(可能高达700但尚未尝试)。

我对GPU上的小批量限制如何影响培训质量感到困惑,或者如果提高时代数量可能会抵消这种影响......
换句话说,10000个时期的25个样本500个时代的500个样本?

GPU是GTX 1060,配备6Gb内存,CPU是双XEON 2630l v4(2 * 10超线程内核,1.7Ghz),128Gb内存。

3 个答案:

答案 0 :(得分:2)

我使用卷积神经网络在项目中试验了批量大小,发现了一些有趣的东西:批量大小是一个正则化器。

我有一个网络(在这种情况下是卷积,但这一点会延续到你的情况)并且我有一个小而大的数据集。

我对网络中的20个超参数进行了全面的超参数搜索(需要培训的天数),包括批量大小,L2正则化,丢失,卷积参数,完全连接层中的神经元等。超参数搜索被判断在持有的验证数据集上。

当我拥有小数据集(数千个样本中的10个)时,超参数搜索有利于L2和丢失的更多正则化,这些值在验证集上产生更好的结果。它也有利于较低的批量。

当我有一个大型数据集(数百万个样本)时,数据集本身足够大以避免过度拟合。超参数搜索有利于较低的L2正则化和丢失(事实上它选择了98%的丢失概率)。而这次它有利于大批量生产。

这是出乎意料的,我没有看到很多文献会将批量大小作为正则化参数,但在这些实验中我的结果非常清楚。

所以直截了当地说,它可能会产生一些小的差异,但你可以用其他正则化技术来弥补。通过更快地训练和测试更多超参数组合,您可以获得更多的里程,而不是专注于批量大小并牺牲您进行大量实验的能力。

答案 1 :(得分:1)

如果批量较大,则可以更好地估算梯度,反之亦然小批量。然而,有点嘈杂的渐变并不总是坏的。它们帮助网络摆脱(可能)糟糕的局部最小值,换句话说,它为优化器提供了探索其他局部最小值的机会,这可能会更好。据我所知,没有傻瓜式的方法来了解最佳批量大小。拇指规则是将批量大小从32到128考虑在内,但这又取决于应用程序,您使用的GPU数量等。

关于速度,我的猜测是,即使批量大小减小20倍,GPU总是会赢。您可以通过简单地测量处理一定量样品(而不是批次)所需的时间来计时。如果您发现批量大小正在影响验证的准确性和收敛性,那么您可能会考虑转移到CPU上。

结论:做上述测试,但根据我可获得的信息,我会说接受GPU培训。

答案 2 :(得分:1)

This paper研究批量大小和学习率的关系。 它们不会降低学习速度,而是以相同的因子增加批量大小。

  

在相同数量的训练时期后,它达到了相同的测试精度,但参数更新次数更少,导致更大的并行性和更短的训练时间。

简而言之,如果您使用更大的批量,您可以使用更大的学习率来缩短培训时间。