我对Tensorflow相对较新,仍在努力了解如何提高性能。我使用TF时间轴工具检查我的代码的执行情况,我惊讶地发现执行看起来像是串行的,如下图所示:
以下代码是我用来设置数据输入的代码:
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传输时间重叠。所以我的问题是:
答案 0 :(得分:2)
配置文件看起来是串行的,因为({1}}的{并行调用'中的操作都不包含在时间线跟踪中。 _parse_function()
跟踪区域将与管道中的某些操作重叠,但IteratorGetNext
意味着大部分工作将在后台线程中异步执行。
David Parks' comment说得好:预取缓冲区大小为dataset.prefetch(8192 * 3)
批次可能比您需要的大,并且可能会导致内存压力。通常将预取缓冲区大小设置为较小的值(例如1或2)足以使预处理与训练重叠;在那之后不久我会期待收益递减。尝试将8192 * 3
参数增加到num_parallel_calls
,看看是否会增加培训的吞吐量。