2016-12-16 88 views
0

目前,我做这样的(伪)训练期间检查点:有没有办法异步写入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) 

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

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

有没有办法异步执行检查点以减少计算时间的浪费?实施草图:首先我们可能会从设备内存中复制所有必需的东西到主机,然后在单独的线程上执行磁盘I/O。 Saver.save将在memcopy之后返回,而无需等待磁盘操作,因为现在无需拧紧检查点就可以安全地训练设备副本。如果上一次迭代中有I/O挂起,则Saver.save仍然会阻止重新进入。

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

回答

2

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

+0

谢谢你,德里克。我很惊讶。再次澄清一遍,在训练过程中是否在另一个线程中调用'save()'保存? (同样,考虑到GIL,同样的问题也适用于单独的过程)。培训期间体重变化不会影响检查点保存?如果不是,什么机制阻止它? – Drop

+0

这个过程不会崩溃是“安全的”,但它对于参数更新并不是原子的,所以如果训练同时运行,您可能会看到部分应用的更新:跨变量并可能在单个变量中。对于我们通过异步SGD(或其变体)进行培训的大多数模型而言,这已经足够好了,因此没有内置机制可以通过'Saver'获取一致的快照(尽管可以使用与“tf”相同的机制.train.SyncReplicasOptimizer' ...)。 – mrry

相关问题