尽管数据集上存在多线程设置,TF时间轴仍显示串行执行

时间:2017-12-01 15:37:01

标签: tensorflow io profiling tensorflow-gpu tensorflow-datasets

我对Tensorflow相对较新,仍在努力了解如何提高性能。我使用TF时间轴工具检查我的代码的执行情况,我惊讶地发现执行看起来像是串行的,如下图所示:

screenshot from profiling

以下代码是我用来设置数据输入的代码:

filenames = tf.placeholder(tf.string, shape=[None])
dataset   = tf.data.TFRecordDataset(filenames, "ZLIB", 128 * 1024 * 1024)
dataset   = dataset.map(_parse_function, 13)
dataset   = dataset.batch(8192)
dataset   = dataset.prefetch(8192 * 3)
iterator  = dataset.make_initializable_iterator()
X, y      = iterator.get_next()

特别是,鉴于我已将map上的工作线程数设置为13(与我的硬件一致)并且还将预取设置为等于批量大小的3倍,我本来希望CPU能够完全与GPU和CPU / GPU传输时间重叠。所以我的问题是:

  1. 为什么这看起来是连续的?我误读了我看到的内容吗?
  2. 我使用数据集的方式有问题吗?我明白批量大小&最终应该调整预取大小以获得最佳性能,但是如果我没有看到CPU与GPU的并行使用,那又有什么意义呢?

1 个答案:

答案 0 :(得分:2)

配置文件看起来是串行的,因为({1}}的{​​并行调用'中的操作都不包含在时间线跟踪中。 _parse_function()跟踪区域将与管道中的某些操作重叠,但IteratorGetNext意味着大部分工作将在后台线程中异步执行。

David Parks' comment说得好:预取缓冲区大小为dataset.prefetch(8192 * 3) 批次可能比您需要的大,并且可能会导致内存压力。通常将预取缓冲区大小设置为较小的值(例如1或2)足以使预处理与训练重叠;在那之后不久我会期待收益递减。尝试将8192 * 3参数增加到num_parallel_calls,看看是否会增加培训的吞吐量。