2

我对 Tensorflow 比较陌生,仍在努力理解如何提高性能。我使用 TF Timeline 工具检查了我的代码的执行,我惊讶地发现执行看起来像是串行的,如下图所示:

来自分析的屏幕截图

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

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 的并行使用,那又有什么意义呢?
4

1 回答 1

4

_parse_function()该配置文件看起来是串行的,因为时间线跟踪中不包含任何操作(并行调用) 。跟踪区域将与管道中的IteratorGetNext一些操作重叠,但这dataset.prefetch(8192 * 3)意味着大部分工作将在后台线程中异步执行。

David Parks 的评论提出了一个很好的观点:8192 * 3 批次的预取缓冲区大小可能比您需要的大,并且可能会导致内存压力。通常将预取缓冲区大小设置为一个较小的值(例如 1 或 2)足以将预处理与训练重叠;我预计在那之后不久收益会递减。尝试增加num_parallel_calls参数以Dataset.map()查看这是否会增加训练的吞吐量。

于 2017-12-04T17:59:20.470 回答