当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python tf.compat.v1.train.Supervisor用法及代码示例


检查点模型和计算摘要的训练助手。

用法

tf.compat.v1.train.Supervisor(
    graph=None, ready_op=USE_DEFAULT, ready_for_local_init_op=USE_DEFAULT,
    is_chief=True, init_op=USE_DEFAULT, init_feed_dict=None,
    local_init_op=USE_DEFAULT, logdir=None, summary_op=USE_DEFAULT,
    saver=USE_DEFAULT, global_step=USE_DEFAULT, save_summaries_secs=120,
    save_model_secs=600, recovery_wait_secs=30, stop_grace_secs=120,
    checkpoint_basename='model.ckpt', session_manager=None,
    summary_writer=USE_DEFAULT, init_fn=None, local_init_run_options=None
)

参数

  • graph 一个Graph。模型将使用的图形。默认为默认 Graph 。主管可以在创建会话之前向图表添加操作,但在将图表传递给主管之后,调用者不应修改图表。
  • ready_op 一维字符串 Tensor 。这个张量由prepare_or_wait_for_session() 中的主管评估,以检查模型是否可以使用。如果模型返回一个空数组,则认为该模型已准备就绪。默认为从 tf.compat.v1.report_uninitialized_variables() 返回的张量 如果 None ,则不检查模型是否准备就绪。
  • ready_for_local_init_op 一维字符串 Tensor 。这个张量由prepare_or_wait_for_session() 中的主管评估,以检查模型是否准备好运行local_init_op。如果模型返回一个空数组,则认为该模型已准备就绪。默认为 None 。如果 None ,则在运行 local_init_op 之前不检查模型是否准备就绪。
  • is_chief 如果为 True,则创建一个负责初始化和恢复模型的主管。如果为 False,则创建一个依赖于首席主管进行初始化和恢复的主管。
  • init_op Operation 。当模型无法恢复时,由主管用于初始化模型。默认为初始化所有全局变量的Operation。如果 None ,除非您传递 init_fn 的值,否则不会自动完成初始化,请参见下文。
  • init_feed_dict Tensor 对象映射到馈送值的字典。评估 init_op 时将使用此提要字典。
  • local_init_op Operation 。所有主管都使用它来运行应该为每个新主管实例运行的初始化。默认情况下,这些是表初始值设定项和局部变量的初始值设定项。如果 None ,则不会自动完成每个 supervisor-instance 初始化。
  • logdir 一个字符串。为可视化器检查模型和日志事件的目录的可选路径。主要监事使用。如果该目录不存在,将创建该目录。
  • summary_op 返回事件日志摘要的 Operation。如果指定了logdir,则由首席主管使用。默认为从摘要返回的操作。merge_all()。如果 None ,则不会自动计算摘要。
  • saver 一个 Saver 对象。如果指定了logdir,则由首席主管使用。默认为 Saver() 返回的已保存文件。如果 None ,模型不会自动保存。
  • global_step 一个大小为 1 的整数张量,用于计算步数。 'global_step' 中的值用于摘要和检查点文件名。默认为图中名为 'global_step' 的操作(如果存在),排名为 1,大小为 1,类型为 tf.int32 或 tf.int64。如果None 全局步骤未记录在摘要和检查点文件中。如果指定了logdir,则由首席主管使用。
  • save_summaries_secs 计算事件日志摘要之间的秒数。默认为 120 秒。传递 0 以禁用摘要。
  • save_model_secs 创建模型检查点之间的秒数。默认为 600 秒。传递 0 以禁用检查点。
  • recovery_wait_secs 检查模型是否准备就绪之间的秒数。由主管在等待主管初始化或恢复模型时使用。默认为 30 秒。
  • stop_grace_secs 宽限期,以秒为单位,在调用stop() 时给予正在运行的线程以停止。默认为 120 秒。
  • checkpoint_basename 检查点保存的基本名称。
  • session_manager SessionManager ,管理会话创建和恢复。如果是 None ,将使用传入的参数集创建默认的 SessionManager 以实现向后兼容性。
  • summary_writer SummaryWriter 使用或 USE_DEFAULT 。可以是None,表示不应编写摘要。
  • init_fn 用于初始化模型的可选可调用对象。在调用可选的init_op 之后调用。可调用对象必须接受一个参数,即正在初始化的会话。
  • local_init_run_options RunOptions 作为 SessionManager local_init_run_options 参数传递。

抛出

  • RuntimeError 如果在启用即刻执行的情况下调用。

属性

  • coord 返回主管使用的协调器。

    如果您想在训练期间运行多个线程,Coordinator 会很有用。

  • global_step 返回主管使用的global_step 张量。
  • init_feed_dict 返回评估 init_op 时使用的提要字典。
  • init_op 返回主管使用的 Init Op。
  • is_chief 如果这是主管,则返回 True。
  • ready_for_local_init_op
  • ready_op 返回主管使用的 Ready Op。
  • save_model_secs 返回检查点之间的延迟。
  • save_path 返回主管使用的保存路径。
  • save_summaries_secs 返回汇总计算之间的延迟。
  • saver 返回主管使用的 Saver。
  • session_manager 返回 Supervisor 使用的 SessionManager。
  • summary_op 返回主管使用的汇总张量。
  • summary_writer 返回主管使用的 SummaryWriter。

此类已弃用。请改用tf.compat.v1.train.MonitoredTrainingSession

Supervisor 是围绕 CoordinatorSaverSessionManager 的小型包装器,可满足 TensorFlow 训练程序的常见需求。

用于单个程序

with tf.Graph().as_default():
  ...add operations to the graph...
  # Create a Supervisor that will checkpoint the model in '/tmp/mydir'.
  sv = Supervisor(logdir='/tmp/mydir')
  # Get a TensorFlow session managed by the supervisor.
  with sv.managed_session(FLAGS.master) as sess:
    # Use the session to train the graph.
    while not sv.should_stop():
      sess.run(<my_train_op>)

with sv.managed_session() 块中,图中的所有变量都已初始化。此外,已经启动了一些服务来检查模型并将摘要添加到事件日志中。

如果程序崩溃并重新启动,托管会话会自动从最近的检查点重新初始化变量。

主管会收到由其中一项服务引发的任何异常通知。引发异常后,should_stop() 返回 True。在这种情况下,训练循环也应该停止。这就是为什么训练循环必须检查 sv.should_stop() 的原因。

指示训练输入已用尽的异常 tf.errors.OutOfRangeError 也会导致 sv.should_stop() 返回 True 但不会从 with 块重新引发:它们表示正常终止。

用于多个副本

要使用副本进行训练,您可以在 Cluster 中部署相同的程序。其中一项任务必须被确定为首要任务:处理初始化、检查点、摘要和恢复的任务。其他任务取决于这些服务的负责人。

您必须对单个程序代码进行的唯一更改是指示该程序是否作为主程序运行。

# Choose a task as the chief. This could be based on server_def.task_index,
# or job_def.name, or job_def.tasks. It's entirely up to the end user.
# But there can be only one *chief*.
is_chief = (server_def.task_index == 0)
server = tf.distribute.Server(server_def)

with tf.Graph().as_default():
  ...add operations to the graph...
  # Create a Supervisor that uses log directory on a shared file system.
  # Indicate if you are the 'chief'
  sv = Supervisor(logdir='/shared_directory/...', is_chief=is_chief)
  # Get a Session in a TensorFlow server on the cluster.
  with sv.managed_session(server.target) as sess:
    # Use the session to train the graph.
    while not sv.should_stop():
      sess.run(<my_train_op>)

在主要任务中,Supervisor 的工作方式与上面的第一个示例完全相同。在其他任务中,sv.managed_session() 等待模型初始化,然后再将会话返回到训练代码。非主要任务依赖于初始化模型的主要任务。

如果其中一项任务崩溃并重新启动,managed_session() 检查模型是否已初始化。如果是,它只是创建一个会话并将其返回给正常进行的训练代码。如果模型需要初始化,主要任务负责重新初始化它;其他任务只是等待模型初始化。

注意:这个修改后的程序仍然可以作为单个程序正常工作。单个程序将自己标记为首席。

使用什么master 字符串

无论您是在您的机器上还是在集群中运行,您都可以为 --master 标志使用以下值:

  • 指定 '' 请求不使用 RPC 的 in-process 会话。

  • 指定 'local' 请求使用基于 RPC 的 "Master interface" 运行 TensorFlow 程序的会话。有关详细信息,请参阅tf.train.Server.create_local_server

  • 指定 'grpc://hostname:port' 请求使用 RPC 接口到特定主机的会话,并且还允许 in-process master 访问远程 tensorflow worker。通常,传递server.target 是合适的(对于一些名为`server 的tf.distribute.Server)。

高级使用

启动附加服务

managed_session() 启动检查点和摘要服务(线程)。如果您需要运行更多服务,您只需在 managed_session() 控制的块中启动它们即可。

示例:启动一个线程来打印损失。我们希望这个线程每 60 秒运行一次,所以我们使用 sv.loop() 启动它。

...
sv = Supervisor(logdir='/tmp/mydir')
with sv.managed_session(FLAGS.master) as sess:
  sv.loop(60, print_loss, (sess, ))
  while not sv.should_stop():
    sess.run(my_train_op)
启动更少的服务

managed_session() 启动 "summary" 和 "checkpoint" 线程,它们使用可选的 summary_opsaver 传递给构造函数,或者由主管自动创建的默认线程。如果要运行自己的摘要和检查点逻辑,请通过将None 传递给summary_opsaver 参数来禁用这些服务。

示例:在主管中每 100 步手动创建摘要。

# Create a Supervisor with no automatic summaries.
sv = Supervisor(logdir='/tmp/mydir', is_chief=is_chief, summary_op=None)
# As summary_op was None, managed_session() does not start the
# summary thread.
with sv.managed_session(FLAGS.master) as sess:
  for step in range(1000000):
    if sv.should_stop():
      break
    if is_chief and step % 100 == 0:
      # Create the summary every 100 chief steps.
      sv.summary_computed(sess, sess.run(my_summary_op))
    else:
      # Train normally
      sess.run(my_train_op)
自定义模型初始化

managed_session() 仅支持通过运行 init_op 或从最新检查点恢复来初始化模型。如果您有特殊的初始化需求,请参阅创建主管时如何指定local_init_op。您也可以直接使用SessionManager 创建会话并检查它是否可以自动初始化。

相关用法


注:本文由纯净天空筛选整理自tensorflow.org大神的英文原创作品 tf.compat.v1.train.Supervisor。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。