我正在研究CNN模型,该模型旨在从其氨基酸序列预测蛋白质的结构。我正在Keras实施我的CNN。 Keras API是与TensorFlow 1.4.0捆绑在一起的,所以显然TensorFlow是我的后端。我已经安装了TensorFlow的GPU版本,我已经验证了GPU的使用情况。我的GPU有点老了,NVidia GTX 760。
当我执行3X交叉验证以帮助选择体系结构和超参数时,我的训练折叠中有50K示例,我的验证折叠中有25K样本。这些是相当大的数据集,但与我的计算机(16 GB)或GPU(2 GB)中可用的RAM相比,它们很小。完全解压缩并表示为float32值,由于滑动窗口引入冗余,所有折叠在一起,输入加目标值,占用316 MB。我已经预先计算了我的折叠,并将每个折叠的文件保存到磁盘。当我尝试使用体系结构和超参数时,每次试验都会使用相同的折叠。
我开始使用包含单个隐藏层的网络来查看我可以实现的内容,然后切换到两个隐藏层。我在早期的所有实验中都使用了64的固定批量。训练进行得足够快,我并不关心自己的速度。对给定体系结构执行3X交叉验证通常需要大约12分钟。
但是在上一次使用双层网络的实验中,我决定开始研究批量大小的影响。我了解到,较小的批量大小给了我更好的结果,达到了一定程度。批量大小为8是最小的,我可以指望不崩溃。我的损失值偶尔会翻转到批量大小为4的NaN,并且它们经常会以批量大小为1或2翻转到NaN。之后,网络变得无法处理。我知道梯度不稳定的可能性。我想我得到了一些。
那么为什么不使用8的批量大小并继续前进?问题是速度。使用两个隐藏层,8个批次花了我大约35分钟进行交叉验证。如上所述,64个批次占用了三分之一的时间。我的第一次实验有三个隐藏层,每次试验需要45到65分钟。我想使用更深入的网络调查潜在的数百个架构和超参数。对于小批量,我可以看到Keras中的逐批进度条进展得更慢。当一个纪元结束时,我可以看到更长的停顿。
是的,我可以将GPU升级到10系列。我认为这最多只会使我的吞吐量翻倍?是的,我可以在云中租用GPU时间。最终我可能会这样做。但是,如果我的软件效率低下,我绝对不想在云端放松它以烧钱。
这是我的理解(如果我错了请纠正我),当GPU用于普通的TF / Keras工作流程时,每个批次都会从GPU单独发送到CPU。如果我在3X交叉验证方案中训练50个网络,这意味着我将相同的数据发送到我的GPU 150次。正如我之前提到的,我的所有数据最多占用316 MB,大约占GPU可用RAM的15%。我是否可以设计一个工作流程,将这个316 MB发送到GPU 一次,如果是,那么这会对我的吞吐量产生有用的影响吗?直观地说,感觉应该是这样。
我应该考虑其他瓶颈吗?有没有办法分析TF或Keras操作?
感谢您的任何建议!
答案 0 :(得分:0)
好的。我知道您更担心Keras和您的硬件的吞吐量,但是我想在这里提及以下几点:
在这种情况下,如果您没有大量数据,则假设您正在针对固定时期进行训练(例如5个),那么自然而然地希望以较小的批次大小进行训练会获得更好的结果意味着与更高批生产数量相比,总体而言,反向支撑步骤数量更多。如果您正在训练固定数量的训练步骤,那么我不知道为什么会这样。
同样,我假设您在此处使用CNN的批量标准化。使用BN时,实际上从不建议使用较小的批处理大小,例如2或4(甚至8)。可能面对较小批号的NaN的原因之一是,如果当前批号的方差很小,并且如果epsilon值太小,则可能会有非常小的值,可能导致数值变小不稳定。但是更笼统地说,这可能是您提到的梯度不稳定性的情况。考虑使用渐变裁剪以查看是否有帮助。
在这里,我假设您只有1个GPU。不幸的是,您无法使用单GPU进行并行化。要澄清的是,您不必担心GPU RAM的数据大小。在大多数单GPU情况下,当前批次保留在CPU上,而GPU仅占用操作。相反,您应该担心GPU将要计算的参数的大小。由于1层实验和3层实验的操作差异很大,因此我认为这是不可能的,因为您不能同时在同一设备上放置多个操作。在这里,最适合您的方法是使用较大的批处理大小(不要太大-因为这将减少反向固定步骤的数量,以便进行固定时间段的训练),以便您可以在一次。
仅仅是超参数调整的技巧,您可以考虑使用Highway-CNNs。这些是从LSTM的门控机制中获得启发的,在LSTM的门控机制中,您可以指定大量的隐藏层,并且网络可以自行确定如何控制各层之间的信息流。简而言之,这实际上将消除您在调整网络深度方面的工作,并允许您调整其他超参数,例如学习率或过滤器大小等。
我希望至少其中一些对您有帮助并且对您有帮助;)