Machine learning 微调Caffe深度学习检查失败:错误==cudaSuccess内存不足

Machine learning 微调Caffe深度学习检查失败:错误==cudaSuccess内存不足,machine-learning,deep-learning,caffe,Machine Learning,Deep Learning,Caffe,我对深度学习及其框架比较陌生。目前,我正在试验Caffe框架,并尝试微调Vgg16_places_365 我使用的是Amazone EC2实例g2.8XL,带有4个GPU(每个都有4 GB的RAM)。但是,当我尝试训练我的模型(使用单个GPU)时,我遇到了以下错误: 检查失败:错误==cudaSuccess(2对0)内存不足 在我做了一些研究之后,我发现解决这个内存不足问题的方法之一是减少train.prototxt中的批处理大小 最初,我将批大小设置为50,并迭代地将其减小到10(因为当ba

我对深度学习及其框架比较陌生。目前,我正在试验Caffe框架,并尝试微调Vgg16_places_365

我使用的是Amazone EC2实例g2.8XL,带有4个GPU(每个都有4 GB的RAM)。但是,当我尝试训练我的模型(使用单个GPU)时,我遇到了以下错误:

检查失败:错误==cudaSuccess(2对0)内存不足

在我做了一些研究之后,我发现解决这个内存不足问题的方法之一是减少train.prototxt中的批处理大小

最初,我将批大小设置为50,并迭代地将其减小到10(因为当batch_size=10时,它起作用)。 现在,这个模型正在接受培训,我很确定这将需要相当长的时间。然而,作为这个领域的新手,我很好奇这个批量大小和另一个参数之间的关系,比如学习率、步长,甚至是我们在solver.prototxt中指定的最大迭代


批次大小对模型质量的影响程度(如精度)。如何使用其他参数来利用质量。另外,除了减少批量大小或扩大我的机器,还有其他方法来解决这个问题吗

要回答关于批量大小、学习率和最大迭代次数等参数之间关系的第一个问题,最好阅读数学背景。一个很好的起点可能是这个stats.stackexchange问题:。答案将简要讨论批量大小和学习率之间的关系(根据您的问题,我假设学习率=步长),并为进一步阅读提供一些参考

为了回答您的最后一个问题,在您正在微调的数据集和固定的模型(即VGG16)(即固定大小的输入数据和固定大小的模型)的情况下,您将很难避免大批量的内存不足问题。但是,如果您愿意减少输入大小或模型大小,则可以使用更大的批处理大小。根据精细调整的具体方式(和内容),可以通过丢弃已学习的层或减少完全连接层的数量/大小来减小模型大小


剩下的问题,即批量大小对质量/精度的影响有多大以及其他参数如何影响质量/精度,如果不知道您试图解决的具体问题,则很难回答。例如,batchsize对达到的精度的影响可能取决于各种因素,如数据集中的噪音、数据集的维度、数据集的大小以及其他参数,如学习率(=步长)或动量参数。对于这类问题,我建议,例如,第11章可能会提供一些关于选择这些超参数(即批量大小、学习率等)的一般指南。

解决问题的另一种方法是使用机器上的所有GPU。如果您的GPU上有
4x4=16
GB内存,那就足够了。如果在命令模式下运行caffe,只需添加--gpu参数,如下所示(假设有4个gpu被索引为默认的0,1,2,3):

但是,如果您使用的是python接口,那么还不支持使用多个GPU运行

我可以指出一些一般性提示来回答您关于批量大小的问题: -batchsize越小,学习的随机性越高-->训练数据过拟合的可能性越小;不收敛的概率更高。 -caffe中的每次迭代都会获取一批数据,并向前运行,最后以反向传播结束。 -假设您的培训数据为50000,批量大小为10;然后在1000次迭代中,10'000个数据被送入网络。在相同的场景中,如果batchsize为50,则在1000次迭代中,网络将看到所有的培训数据。这被称为一个时代。您应该设计您的batchsize和最大迭代次数,使您的网络能够接受一定数量的历次训练。
-caffe中的stepsize是将学习率乘以gamma值之前解算器将运行的迭代次数(如果已将训练方法设置为“步长”)

真棒的答案,谢谢你的参考。所以,如果我能正确理解的话,通常情况下,批量大小决定了我们在进行权重更新之前查看的示例数量。换句话说,批量越小或越小,训练信号的噪声就越大,对吗?如果是这样的话,这是否意味着当我们减少批量大小时,我们应该提高学习率?另外,说到前面提到的两种选择——减少输入大小或减少模型大小——我对此有点担心。据我所知,某些模型的输入大小是固定且唯一的,因此修改它将导致错误。另一方面,由于我使用的是vgg或googlenet等现有模型,如果我丢弃一些层或减小完全连接层的大小,那么它的意义有多大(在计算速度和模型质量方面)?是的,您对batchsize的理解是正确的。但是,减小批量大小并不一定意味着提高学习率,反之亦然。对于您的第二个问题:如果数据集是固定的(例如图像大小),则减小输入大小不是一个选项,但如果您重新训练(并因此调整大小)完全连接的层(只有完全连接的层限制为原始输入大小),则可能不会在VGG模型中导致错误。例如,可以通过减小完全连接层的大小(同时保持卷积层)来减小模型大小。谢谢您的回答。使用多个GPU将是一个不错的选择,但是,仍然尝试找出如何优化所有参数,以便
 build/tools/caffe train --solver=solver.prototxt --gpu=0,1,2,3