【发布时间】:2016-10-03 20:58:40
【问题描述】:
我使用的是 tensorflow 0.10,我正在对 official HowTo on reading data 中的示例进行基准测试。本 HowTo 使用相同的 MNIST 示例说明了将数据移动到 tensorflow 的不同方法。
我对结果感到惊讶,我想知道是否有人有足够的底层理解来解释正在发生的事情。
在 HowTo 中基本上有 3 种读取数据的方法:
-
Feeding:在 python 中构建小批量并使用sess.run(..., feed_dict={x: mini_batch})传递它 -
Reading from files:使用tf操作打开文件并创建小批量。 (绕过在 python 中处理数据。) -
Preloaded data:将所有数据加载到单个tf变量或常量中,并使用tf函数将其分解为小批量。变量或常量被固定到 cpu,而不是 gpu。
我用来运行基准测试的脚本可以在 tensorflow 中找到:
-
Feeding: examples/tutorials/mnist/fully_connected_feed.py -
Reading from files: examples/how_tos/reading_data/convert_to_records.py 和 examples/how_tos/reading_data/fully_connected_reader.py -
Preloaded data (constant): examples/how_tos/reading_data/fully_connected_preloaded.py -
Preloaded data (variable): examples/how_tos/reading_data/fully_connected_preloaded_var.py
除了最后两个之外,我在未修改的情况下运行了这些脚本,因为它们崩溃了——至少对于 0.10 版——除非我添加额外的 sess.run(tf.initialize_local_variables())。
主要问题
在 GTX1060 上运行 100 个示例,执行 100 个小批量所需的时间:
-
Feeding:~0.001 s -
Reading from files:~0.010 s -
Preloaded data (constant):~0.010 s -
Preloaded data (variable):~0.010 s
这些结果让我很惊讶。我原以为Feeding 是最慢的,因为它几乎可以在 python 中完成所有操作,而其他方法使用较低级别的 tensorflow/C++ 来执行类似的操作。这与我的预期完全相反。有谁明白这是怎么回事?
次要问题
我可以访问另一台装有 Titan X 和旧版 NVidia 驱动程序的机器。相对结果大致与上述一致,除了Preloaded data (constant) 非常缓慢,单个小批量需要很多秒。
这是一个已知问题,即性能会因硬件/驱动程序而有很大差异吗?
【问题讨论】:
-
顺便说一句,这里是如何使它快速 - github.com/yaroslavvb/stuff/commit/… 。更多详情github.com/tensorflow/tensorflow/issues/…
-
这种缓慢可能是特定于小型模型的。这里的问题是数据计算线程缺乏数据。由于计算运行速度如此之快,数据预加载线程(您可以使用 tf.batch(...,num_threads=10) 进行更多操作)没有机会抢占它并加载更多数据
标签: python tensorflow