【问题标题】:Is there a way to write TensorFlow checkpoints asynchronously?有没有办法异步编写 TensorFlow 检查点?
【发布时间】:2016-12-17 06:01:59
【问题描述】:

目前我在训练过程中会做这样的检查点(伪代码):

while(training):
    model.train()

    if it_is_time_for_validation():
        metrics = model.validate()

        if metrics.are_good():
             saver = tf.train.Saver()
             res = saver.save(sess=session, save_path=checkpoint_file_path)

Saver.save 方法块用于 I/O,阻止下一次迭代运行。 我的模型的权重大小为数百兆字节,编写所有这些内容需要一段时间。

根据我的计算,根据检查点频率,总体而言,GPU 花费 5-10% 的时间等待检查点完成,而不是进行有用的计算。 (5-10% 相当于一天的计算)

有没有办法异步执行检查点来减少计算时间的浪费?

实现草图:首先,我们可以将所有必要的内容从设备内存复制到主机,并在单独的线程上执行磁盘 I/O。 Saver.save 将在 memcopy 之后返回,而无需等待磁盘操作,因为现在可以安全地训练设备副本而不会搞砸检查点。 Saver.save 仍然会在重新进入时阻塞,如果前一次迭代有 I/O 未决。

我认为它目前尚未实施,因此我也对可能的解决方法感兴趣。这个想法是否足以成为 GitHub 上的功能请求?

【问题讨论】:

    标签: tensorflow


    【解决方案1】:

    您可以通过在单独的线程中运行saver.save() 来异步编写检查点。 (内部)SVTimerCheckpointThread 是在训练后台定期运行saver.save() 的代码示例。请注意,tf.train.Supervisor 是一个实用程序类,可帮助管理此类后台线程(也用于编写 TensorBoard 摘要日志等),因此您可能希望使用它。

    【讨论】:

    • 谢谢你,德里克。我很惊讶。再澄清一次,在训练进行时在单独的线程中调用save() 是否可以节省? (另外,考虑到 GIL,同样的问题也适用于单独的过程)。训练期间体重变化不会干扰检查点保存吗?如果不是,是什么机制阻止它?
    • 它是“安全的”,因为进程不会崩溃,但它在参数更新方面不是原子的,因此如果训练同时运行,您可能会看到部分应用的更新:跨变量和可能个别变量内。对于我们通过异步 SGD(或其变体)训练的大多数模型,这已经足够了,因此没有内置机制可以使用 Saver 获取一致的快照(尽管可以使用与 @987654329 相同的机制构建@...)。
    猜你喜欢
    • 2020-12-06
    • 2021-02-16
    • 1970-01-01
    • 2018-05-23
    • 2022-01-25
    • 2022-10-12
    • 2010-09-08
    • 2021-01-17
    • 2015-08-11
    相关资源
    最近更新 更多