目前我在训练期间制作检查点(伪代码):
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上的功能请求?
答案 0 :(得分:2)
您可以通过在单独的线程中运行saver.save()
来异步编写检查点。 (内部)SVTimerCheckpointThread
是在培训背景中定期运行saver.save()
的代码示例。请注意,tf.train.Supervisor
是一个实用程序类,可帮助管理此类后台线程(也用于编写TensorBoard摘要日志等),因此您可能希望使用它。