【问题标题】:TensorFlow: Is dequeueing single examples a bottleneck?TensorFlow:出列单个示例是一个瓶颈吗?
【发布时间】:2017-02-08 12:29:25
【问题描述】:

在 TF-slim documentation(参考 read 函数)中,我意识到有多个阅读器将解析的 TF-examples 输入(入队)到队列中,但是有一个函数 dequeue一次只能出列一个元素。当我创建批次时,这会导致我的训练出现瓶颈吗?改用dequeue_many 会更好吗?

当我之前训练我的模型时,我在 TensorBoard 上注意到并行读取器队列总是满的 - 这是引起关注的原因还是入队操作应该比出队操作更快?一般来说,出队操作出列的示例应该与入队操作的读者数量一样多吗?

这是我对队列的可视化:

我的猜测是,在任何时候让更多的示例出队可能是件好事,只要有一个 min_after_dequeue 参数可以确保队列中有足够的示例在任何一点被洗牌(实际上,多久洗牌发生了吗?)。但是,一次性将多个示例出列的权衡是什么?

【问题讨论】:

  • 如果队列已满,则可能意味着下游管道的任何部分都是瓶颈,即卷积层等。我会怀疑那些在指责出队之前的人
  • 感谢您的回答!我确实有一个相当慢的 GPU(800 系列),所以我将批量大小限制在相当小的范围内。我可以知道在多个读者入队后单个出队操作是否通常发生得足够快?使用 this 与 dequeue_many 的权衡是什么?

标签: python machine-learning tensorflow computer-vision deep-learning


【解决方案1】:

这个answer 展示了如何进行分析,例如,每个出队操作在一个线程上花费了 60 微秒。如果您在 dequeue 之上使用tf.batch,它将并行运行多个 dequeue 操作,因此平均每个 dequeueue 可能会下降到 12 微秒。这意味着只有当您的计算时间少于 12 微秒时,它才会成为瓶颈。不久前,当我检查时,调度单个 GPU 内核调用需要 5 微秒,因此任何具有超过 2 个 GPU 操作的网络都需要更长的时间来评估,dequeue 不会成为瓶颈。

【讨论】:

  • GPU Op 是指单个sess.run 调用吗?如果我在像sess.run([train_op, metrics_op]) 这样的运行中运行多个操作,这是否会构成两个 GPU 操作,并且构建的图形的大小会影响 GPU 调用时间吗?我在文档中发现的一件事是train.batch 在出队操作之前完成了出队操作。这个单一的出队操作是否足够快,不会导致train.batch 的入队操作出现瓶颈?
  • 我想象张量如何流动的方式是:在 RandomShuffleQueue 中并行排队 tf-examples(并行读取器)-->单独出列 tf-examples(并行读取器)-->解码一个 tf-example到一组图像和标签张量(解码器)--> 将tf.train.batch 中的张量在内部但一个接一个地并行排入 FIFO 队列(train.batch)--> 使用 dequeue_many 将一批示例出列( train.batch) --> 用于预处理/推理等
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-14
  • 2010-11-18
  • 1970-01-01
  • 2019-02-03
  • 2018-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多