有没有办法异步编写TensorFlow检查点?

时间:2016-12-16 20:54:20

标签: tensorflow

目前我在训练期间制作检查点(伪代码):

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)
用于I / O的

Saver.save方法块,防止下一次迭代运行。 我的模型的权重大小是几百兆字节,编写所有这些东西需要一段时间。

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

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

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

我认为它目前没有实现,所以我也对可能的解决方法感兴趣。这个想法是否足以成为GitHub上的功能请求?

1 个答案:

答案 0 :(得分:2)

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