使用汇总操作训练 TensorFlow 模型比不使用汇总操作要慢得多

Posted

技术标签:

【中文标题】使用汇总操作训练 TensorFlow 模型比不使用汇总操作要慢得多【英文标题】:Training TensorFlow model with summary operations is much slower than without summary operations 【发布时间】:2017-07-13 09:48:27 【问题描述】:

我正在使用 TensorFlow r1.0 和 GPU Nvidia Titan X 训练一个类似 Inception 的模型。

我添加了一些汇总操作来可视化训练过程,使用代码如下:

def variable_summaries(var):
"""Attach a lot of summaries to a Tensor (for TensorBoard visualization)."""
    with tf.name_scope('summaries'):
        mean = tf.reduce_mean(var)
        tf.summary.scalar('mean', mean)
        with tf.name_scope('stddev'):
            stddev = tf.sqrt(tf.reduce_mean(tf.square(var - mean)))
        tf.summary.scalar('stddev', stddev)
        tf.summary.scalar('max', tf.reduce_max(var))
        tf.summary.scalar('min', tf.reduce_min(var))
        tf.summary.histogram('histogram', var)

当我运行这些操作时,训练一个 epoch 的时间成本约为 400 秒。但是当我关闭这些操作时,训练一个 epoch 的时间成本只有 90 秒。

如何优化图以最小化汇总操作的时间成本?

【问题讨论】:

也许不那么频繁地计算摘要?此外,TF 1.0 重构事物以提高效率——当使用钩子时,摘要与其他张量同时计算,因此所有中间量都被重用 我使用的是 TF 1.0。您能否更清楚地说明如何使用钩子?我尝试使用 CPU 来计算摘要,但没有太大帮助。我猜这是因为 GPU 和 CPU 之间的数据传输。 @YaroslavBulatov 在转向钩子之前,你能减少计算摘要的次数吗? 哦,是的,我当然可以。但实际上,我只是计算每个时期的摘要,而不是每个批次。如果我将摘要减少到每 10 个 epoch,恐怕我会丢失一些训练过程的信息。 【参考方案1】:

摘要当然会减慢训练过程,因为您需要执行更多操作并且需要将它们写入光盘。此外,直方图摘要会进一步减慢训练速度,因为与标量值相比,直方图需要从 GPU 复制到 CPU 的数据更多。 所以我会尽量少用直方图记录,这可能会有所作为。

通常的解决方案是仅每 X 个批次计算摘要。由于您每个时期只计算一个摘要,而不是每个批次,因此可能值得尝试更少的摘要日志记录。

取决于您的数据集中有多少批次,但通常您不会因为收集的日志少一点而丢失太多信息。

【讨论】:

有没有一种方法可以在 GPU 上保留直方图,并且只是复制回来以记录每个 epoch,但仍保留完整的记录数据?

以上是关于使用汇总操作训练 TensorFlow 模型比不使用汇总操作要慢得多的主要内容,如果未能解决你的问题,请参考以下文章

tensorflow 训练好的模型,怎么 调用

OpenAI全面拥抱PyTorch,TensorFlow:我哪里比不上它?

Tensorflow加载预训练模型的特殊操作

Tensorflow加载预训练模型的特殊操作

TensorFlow2 入门指南 | 14 网络模型的装配训练与评估

Tensorflow中的滑动平均模型