TensorFlow 分布式主工作线程保存静默失败;未创建检查点文件,但不引发异常



在分布tensorflow环境中。主工作程序保存检查点失败
saver.save已返回ok*
(不引发异常并返回存储检查点文件路径),但返回的检查点文件不存在
这与tensorflow api的描述不一样
为什么?如何修复

==============
相关代码如下:

def def_ps(self):
self.saver = tf.train.Saver(max_to_keep=100,keep_checkpoint_every_n_hours=3)
def save(self,idx):    
ret = self.saver.save(self.sess,self.save_model_path,global_step=None,write_meta_graph=False)
if not os.path.exists(ret):
msg = "save model for %u path %s not exists."%(idx,ret)
lg.error(msg)
raise Exception(msg);

===============
日志如下:

2016-06-02 21:33:52,323 root         ERROR    save model for 2 path model_path/rl_model_2 not exists.
2016-06-02 21:33:52,323 root         ERROR    has error:save model for 2 path model_path/rl_model_2 not exists.
Traceback (most recent call last):
File "d_rl_main_model_dist_0.py", line 755, in run_worker
model_a.save(next_model_idx)
File "d_rl_main_model_dist_0.py", line 360, in save
Trainer.save(self,save_idx)
File "d_rl_main_model_dist_0.py", line 289, in save
raise Exception(msg);
Exception: save model for 2 path model_path/rl_model_2 not exists.

======
不符合定义Saver的tensorflow api。保存如下:

https://www.tensorflow.org/versions/master/api_docs/python/state_ops.html#Saver

tf.train.Saver.save(sess, save_path, global_step=None, latest_filename=None, meta_graph_suffix='meta', write_meta_graph=True)

退货:

字符串:保存变量的路径。如果保护程序被分片,则此字符串以:'-????结尾-of-nnnnnn',其中"nnnnn"是创建的碎片数。

加薪:

TypeError:如果sess不是会话。

ValueError:如果latest_filename包含路径组件。

tf.train.Saver.save()方法有点。。。当您在分布式模式下运行时,会感到惊讶。实际的文件是由持有tf.Variable操作的进程编写的,如果您使用示例代码进行设置,那么它通常是"/job:ps"中的一个进程。这意味着您需要在每个具有变量的远程机器上的save_path中查找检查点文件。

为什么会出现这种情况?Saver API隐式地假设所有进程都具有共享文件系统的相同视图,如NFS装载,因为这是我们在Google使用的典型设置。我们在TensorFlow的最新夜间版本中添加了对谷歌云存储的支持,并正在研究HDFS支持。

最新更新