【发布时间】:2018-11-27 20:48:05
【问题描述】:
我正在研究旨在根据氨基酸序列预测蛋白质结构的 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 的批量大小并继续进行呢?问题是速度。使用两个隐藏层,八个批次我花了大约 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 操作?
感谢您的任何建议!
【问题讨论】:
标签: tensorflow keras profiling cross-validation