使用 CPU 与 GPU 训练模型 - 速度与内存
Using CPU vs GPU to train a model - Speed vs memory
我正在尝试训练在
https://github.com/silicon-valley-data-science/RNN-Tutorial With a dataset generated through https://github.com/jupiter126/Create_Speech_Dataset(大约 340000 个带转录的小 wav 音频样本)。
当我使用 GPU 进行训练时,训练进行得相对较快,但是我无法在不达到 OOM 的情况下将 batch_train_size 设置为高于 25。
当我用 CPU 训练时,训练要慢得多,但我可以轻松地将 batch_train_size 设置为 250(可能高达 700,但尚未尝试)。
我对 GPU 上的小批次大小限制如何影响训练质量感到困惑,或者如果提高训练周期数可能会抵消这种影响...
换句话说,25 个样本在 10000 个纪元或 500 个纪元上的 500 个样本?
GPU 是 GTX 1060 和 6Gb 内存,CPU 是双 XEON 2630l v4(1.7Ghz 的 2*10 超线程内核)和 128Gb 内存。
当批量大时,可以更好地估计梯度,反之亦然。然而,有点嘈杂的梯度并不总是坏事。它们帮助网络摆脱(可能)糟糕的局部最小值,或者换句话说,它为优化器提供了探索其他可能更好的局部最小值的机会。据我所知,没有万无一失的方法可以知道最佳批量大小。一个经验法则是考虑从 32 到 128 之间的任何批量大小,但这同样取决于应用程序、您使用的 GPU 数量等。
关于速度,我的猜测是 GPU 总是会赢,即使批大小小 20 倍。您可以通过简单地测量处理一定数量的样本(而不是批次)所需的时间来计时。如果您观察到批量大小正在影响您的验证准确性和收敛性,那么您可能会考虑转向 CPU.
底线:进行上述测试,但根据我可用的信息,我会说继续进行 GPU 训练。
我在一个使用卷积神经网络的项目中试验了批量大小,发现了一些有趣的东西:批量大小是一个正则化器。
我有一个网络(在这种情况下是卷积网络,但这一点适用于您的情况)并且我有一个小型和大型数据集。
我对网络中的 20 多个超参数进行了全面的超参数搜索(为此训练了几天),包括批量大小、L2 正则化、dropout、卷积参数、全连接层中的神经元等。超参数搜索根据保留的验证数据集进行判断。
当我有小数据集(数千个样本的 10 个)时,超参数搜索有利于 L2 和 dropout 的更多正则化,这些值在验证集上产生了更好的结果。它还支持较小的批量大小。
当我有一个大数据集(数百万个样本)时,数据集本身足够大以避免过度拟合。超参数搜索有利于较低的 L2 正则化和 dropout(实际上它选择了 98% 的 dropout 保留概率)。而这次它支持大批量。
这是出乎意料的,我没有看到太多将批量大小作为正则化参数的文献,但在那些实验中我的结果非常清楚。
因此,直接针对您的观点,它可能会产生很小的差异,但您可能可以使用其他正则化技术进行补偿。通过更快地训练和测试更多的超参数组合,您将获得更多的里程,而不是专注于批量大小并牺牲您 运行 大量实验的能力。
This paper研究batch size和learning rate的关系。
他们没有降低学习率,而是将批量大小增加了相同的系数。
It reaches equivalent test accuracies after the same number of training epochs, but with fewer parameter updates, leading to greater parallelism and shorter training times.
简而言之,如果你使用更大的batch size,你可以使用更大的学习率来减少训练时间。
我正在尝试训练在
https://github.com/silicon-valley-data-science/RNN-Tutorial With a dataset generated through https://github.com/jupiter126/Create_Speech_Dataset(大约 340000 个带转录的小 wav 音频样本)。
当我使用 GPU 进行训练时,训练进行得相对较快,但是我无法在不达到 OOM 的情况下将 batch_train_size 设置为高于 25。
当我用 CPU 训练时,训练要慢得多,但我可以轻松地将 batch_train_size 设置为 250(可能高达 700,但尚未尝试)。
我对 GPU 上的小批次大小限制如何影响训练质量感到困惑,或者如果提高训练周期数可能会抵消这种影响...
换句话说,25 个样本在 10000 个纪元或 500 个纪元上的 500 个样本?
GPU 是 GTX 1060 和 6Gb 内存,CPU 是双 XEON 2630l v4(1.7Ghz 的 2*10 超线程内核)和 128Gb 内存。
当批量大时,可以更好地估计梯度,反之亦然。然而,有点嘈杂的梯度并不总是坏事。它们帮助网络摆脱(可能)糟糕的局部最小值,或者换句话说,它为优化器提供了探索其他可能更好的局部最小值的机会。据我所知,没有万无一失的方法可以知道最佳批量大小。一个经验法则是考虑从 32 到 128 之间的任何批量大小,但这同样取决于应用程序、您使用的 GPU 数量等。
关于速度,我的猜测是 GPU 总是会赢,即使批大小小 20 倍。您可以通过简单地测量处理一定数量的样本(而不是批次)所需的时间来计时。如果您观察到批量大小正在影响您的验证准确性和收敛性,那么您可能会考虑转向 CPU.
底线:进行上述测试,但根据我可用的信息,我会说继续进行 GPU 训练。
我在一个使用卷积神经网络的项目中试验了批量大小,发现了一些有趣的东西:批量大小是一个正则化器。
我有一个网络(在这种情况下是卷积网络,但这一点适用于您的情况)并且我有一个小型和大型数据集。
我对网络中的 20 多个超参数进行了全面的超参数搜索(为此训练了几天),包括批量大小、L2 正则化、dropout、卷积参数、全连接层中的神经元等。超参数搜索根据保留的验证数据集进行判断。
当我有小数据集(数千个样本的 10 个)时,超参数搜索有利于 L2 和 dropout 的更多正则化,这些值在验证集上产生了更好的结果。它还支持较小的批量大小。
当我有一个大数据集(数百万个样本)时,数据集本身足够大以避免过度拟合。超参数搜索有利于较低的 L2 正则化和 dropout(实际上它选择了 98% 的 dropout 保留概率)。而这次它支持大批量。
这是出乎意料的,我没有看到太多将批量大小作为正则化参数的文献,但在那些实验中我的结果非常清楚。
因此,直接针对您的观点,它可能会产生很小的差异,但您可能可以使用其他正则化技术进行补偿。通过更快地训练和测试更多的超参数组合,您将获得更多的里程,而不是专注于批量大小并牺牲您 运行 大量实验的能力。
This paper研究batch size和learning rate的关系。 他们没有降低学习率,而是将批量大小增加了相同的系数。
It reaches equivalent test accuracies after the same number of training epochs, but with fewer parameter updates, leading to greater parallelism and shorter training times.
简而言之,如果你使用更大的batch size,你可以使用更大的学习率来减少训练时间。