页面树结构

版本比较

标识

  • 该行被添加。
  • 该行被删除。
  • 格式已经改变。
  • 处理停机并彻底崩溃。
  • 目录

     

    面板
    borderColor#00FFFF
    borderStyledashed

    原文链接 : https://www.tensorflow.org/programmers_guide/supervisor

    译文链接 : http://www.apache.wiki/pages/viewpage.action?pageId=2886337(修改该链接为 ApacheCN 对应的译文链接)

    贡献者 : @您的名字   ApacheCN Apache中文网

    要使用TensorFlow训练一个模型,您可以简单地运行训练多次,并在完成后保存训练参数的检查点。这对于能够在几个小时内训练的小型车型很有效。

    需要多天培训的较大型号,可能在多个副本中需要更强大的培训过程:

    校对:Ngxin

    使用TensorFlow训练一个模型,您可以多次运行训练操作,并在完成后保存训练参数的检查点(checkpoint)。这对能够在几个小时内训练的小模型很有效。

    需要长时间训练的较大模型,需要更鲁棒(robust)的训练过程:

    • 能处理关机以及彻底崩溃的情况。
    • 可以在关机或崩溃后恢复。
    • 可以通过TensorBoard进行监控。

    为了能够在停机或崩溃后恢复训练,训练过程必须定期保存检查点。在重新启动时,它必须查找最新的检查点,并在恢复培训之前加载它。为了能够在停机或崩溃后恢复训练,训练过程必须周期保存检查点。在重新启动时,它必须查找最新的检查点,并在恢复训练之前加载它。

    要通过TensorBoard进行监控,培训过程必须定期运行摘要操作,并将返回的值附加到事件文件中,如要通过TensorBoard进行监控,训练过程必须周期进行summary操作,并将返回的值附加到事件文件中,如TensorBoard:可视化学习中 所述。TensorBoard监视事件文件并显示报告培训进度随时间的图形。中所述。TensorBoard监测事件文件并显示训练进度随时间变化的图形。

    tf.train.Supervisor提供了一套有助于实施强大训练过程的服务。提供了一套有助于实施鲁棒的训练过程的服务。

    本教程如何显示如何直接使用主管。还请考虑使用建立在主管之上的几个框架之一,提供更丰富的培训循环,以及众多的定制选项: 本教程将告诉您如何直接使用supervisor。请考虑建立在supervisor之上的几个框架,他们能提供更丰富的训练循环,以及众多的自定义选项,如: tf.learn是一个不错的选择。

    请注意,Supervisor对训练大型车型非常有帮助,但也可以用于较小型号,不受任何惩罚。请注意,Supervisor对训练大模型非常有帮助,但也可以用于较小型号,不会有任何不好的地方。

     

    非常简单的场景

    一个简单方案

    使用Supervisor的最简单的方案是:

    • 创建一个Supervisor对象,将其传递到保存检查点和摘要的目录。对象,将其传递到保存检查点和summary的目录。

    • 请Supervisor一个会话 tf.train.Supervisor.managed_sessionSupervisor请求一个会话(session)

    • 使用会话执行列车操作,如果Supervisor要求训练停止,请检查每一步。使用会话执行训练操作,如果Supervisor要求训练停止,请检查每一步。

    代码块
    languagepy
      ...create graph...
      my_train_op = ...
    
      sv = tf.train.Supervisor(logdir="/my/training/directory")
      with sv.managed_session() as sess:
        for step in range(100000):
          if sv.should_stop():
            break
          sess.run(my_train_op)

    开始服务

    在非常简单的情况下,在简单方案下,调用managed_session()调用启动一些服务,它们在自己的线程中运行,并使用托管会话在您的图中运行ops。启动一些服务,它们在自己的线程中运行,并利用managed session在您的图中运行各种操作。

    如果您的图形包含一个名为的整型变量如果您的图中包含一个名为global_step,则服务使用其值来测量执行的训练步骤的数量。有关如何创建变量,请参阅MNIST培训教程 的整型变量,则服务使用其值来测量执行的训练步骤数量。有关如何创建global_step变量,请参阅MNIST训练教程

    • 检查点服务:在logdir中保存图形变量的副本。global_step如果添加到您的图表中,则检查点文件名将使用该变量的值。默认运行10分钟。摘要服务:运行所有摘要操作,并将其输出附加到logdir 中的 如果添加到您的图中,则检查点文件名将使用该变量的值。默认运行10分钟。

    • summary服务:运行所有summary操作,并将其输出附加到logdir 中的 事件文件中。默认情况下每2分钟运行一次。

    • 步骤计数器:通过查看global_step变量的更改来计算执行了多少步骤。向事件文件追加一个摘要,报告每秒钟的全局步数。摘要标记为“global变量的更改来计算执行了多少步。向事件文件追加一个summary,报告每秒钟的全局步数。 summary tag 为“global_step / sec”。这也默认每2分钟运行一次。

    • 队列跑步者Queue Runners:如果tf.train.QueueRunner有人添加到图形中,主管将以自己的线程启动它们。添加到图形中,Supervisor将在自己的线程中启动它们。

    构建主管对象时可以更改所有时间间隔。有关详细信息,请参阅构建Supervisor对象时可以更改所有时间间隔。有关详细信息,请参阅Supervisor参考

    检查停止

    在主训练循环中停止的检查是重要和必要的。在主训练循环中对停止的检查是重要和必要的。

    在服务线程中引发的异常报告给主管,然后将其在服务线程中引发的异常报告给Supervisor,然后将其should_stop()条件设置为true。其他服务线程通知条件并正确终止。条件设置为true。其他服务线程告知此情形并合理终止。managed_session()块内的主训练循环 还必须检查停止条件并终止。

    请注意,请注意请注意managed_session()捕获从训练循环引发的异常情况,将其报告给主管。主循环不需要对异常做任何特别的处理。它只需要检查停止条件。捕获从训练循环中引发的异常情况,将其报告给Supervisor。主循环不需要对异常做任何特别的处理。它只需要检查停止条件。

    复苏

    如果训练程序关闭或崩溃,其最新的检查点和事件文件将留在logdir中。当您重新启动程序时, managed_session()从最近的检查点恢复图形,并恢复停止的训练。

    创建一个新的事件文件。如果您启动TensorBoard并将其指向logdir,它将会知道如何合并两个事件文件的内容,并将在检查点的最后一个全局步骤中显示训练恢复。

     

    较大的模式场景

    对于大多数中小型机型而言,非常简单的情况就足够了。当总结服务运行时,较大的模型可能会耗尽内存:摘要操作与运行列车操作的主循环并行运行。这可能导致内存使用量达到正常使用的两倍。

    对于较大的型号,您可以告诉主管不要运行汇总服务,而是自己运行在主培训循环中:summary_op=None 构建主管时通过。

    例如,该代码在训练循环中每100个步骤运行摘要:

    代码块
    languagepy
      ...create graph...
      my_train_op = ...
      my_summary_op = tf.summary.merge_all()
    
      sv = tf.train.Supervisor(logdir="/my/training/directory",
                         summary_op=None) # Do not run the summary service
      with sv.managed_session() as sess:
        for step in range(100000):
          if sv.should_stop():
            break
          if step % 100 == 0:
            _, summ = session.run([my_train_op, my_summary_op])
            sv.summary_computed(sess, summ)
          else:
            session.run(my_train_op)

    预先训练的模式场景

    managed_session()呼叫负责在会话中初始化模型。如果有可用模型从检查点恢复,否则从头开始初始化。

    一个常见的情况是通过加载一个“预训练”检查点来初始化模型,该检查点在使用不同的数据集训练通常略有不同的模型时被保存。

    您可以通过将“init函数”传递给主管来加载预训练的检查点。仅当需要从头开始初始化模型时,才能调用此函数,而不是从logdir的检查点恢复模型。

    要加载预训练的模型,init函数需要一个 tf.train.Saver对象,因此您应该为此创建一个保护程序。这通常是一个好主意,因为新模型可能包含预先训练的检查点中不存在的变量:此保护程序只能恢复预先训练的变量。如果您使用的是默认保护程序,则可能会从预培训的检查点中收到新模型的所有变量的错误。

    代码块
    languagepy
      ...create graph...
      # Create a saver that restores only the pre-trained variables.
      pre_train_saver = tf.train.Saver([pre_train_var1, pre_train_var2])
    
      # Define an init function that loads the pretrained checkpoint.
      def load_pretrain(sess):
        pre_train_saver.restore(sess, "<path to pre-trained-checkpoint>")
    
      # Pass the init function to the supervisor.
      #
      # The init function is called _after_ the variables have been initialized
      # by running the init_op.
      sv = tf.train.Supervisor(logdir="/my/training/directory",
                         init_fn=load_pretrain)
      with sv.managed_session() as sess:
        # Here sess was either initialized from the pre-trained-checkpoint or
        # recovered from a checkpoint saved in a previous run of this code.
        ...

    运行您自己的服务

    Supervisor服务(例如检查点服务)与主训练循环并行运行。您有时希望添加自己的服务,例如,以不同于通常的汇总服务的方式获取不同的汇总集。

     tf.train.Supervisor.loop为此目的使用主管的方法。它会重复地在一个计时器上调用您选择的功能,直到主管停止条件成为真实状态,因此与其他服务很好地播放。

    示例:my_additional_summaries()每20mn 调用一次:

    代码块
    languagepy
    def my_additional_sumaries(sv, sess):
     ...fetch and write summaries, see below...
    
    ...
      sv = tf.train.Supervisor(logdir="/my/training/directory")
      with sv.managed_session() as sess:
        # Call my_additional_sumaries() every 1200s, or 20mn,
        # passing (sv, sess) as arguments.
        sv.loop(1200, my_additional_sumaries, args=(sv, sess))
        ...main training loop...

    写摘要

    管理员总是在其logdir中创建一个事件文件,以及 tf.summary.FileWriter向该文件附加事件和摘要。如果要编写自己的摘要,将它们附加到相同的事件文件是一个好主意:当目录中只有一个事件文件被积极附加到时,TensorBoard更好地喜欢它。

    主管提供一个辅助功能来附加摘要: tf.train.Supervisor.summary_computed。只需传递一个摘要op返回的输出函数。以下是使用该函数my_additional_sumaries()从上一个示例中实现的示例:

    代码块
    languagepy
    def my_additional_sumaries(sv, sess):
      summaries = sess.run(my_additional_summary_op)
      sv.summary_computed(sess, summaries)
    对于更高级的用途,主管通过其tf.train.Supervisor.summary_writer 属性提供对其摘要作者的 访问。

     

    Supervisor参考

    非常简单的场景,以及更大的模型方案显示监事的基本用途。可以通过使用主管提供的许多选项来构建更高级的场景

    检查点:何时何地。

    managed_session()呼叫启动检查点服务,可以通过以下关键字参数为Supervisor() 构造函数配置:

    • logdir:检查点服务创建检查点的目录的路径。如果需要,创建该目录。传递None禁用检查点和摘要服务。

    • checkpoint_basename:要创建的检查点文件的名称,默认为“model.ckpt”。

    如果模型包含一个名为的标量整数变量global_step,则该变量的值将附加到检查点文件名。

    例如,在全局步骤1234,检查点文件名是“model.ckpt-1234”。

    • save_model_secs:每个检查点之间的秒数。默认为600或10分钟。

    选择一个值时,请考虑在遇到崩溃时想要失去多少工作:您永远不会失去超过save_model_secs几秒钟的工作。将其设置为0将禁用检查点服务。

    如果您不通过,则主管通过调用创建一个 tf.train.Saver(),其中添加操作以保存并还原模型中的所有变量。这通常是你需要的。

    示例:每30秒使用自定义保护程序和检查点。

    代码块
    languagepy
      ...create graph...
      my_saver = tf.train.Saver(<only some variables>)
      sv = tf.train.Supervisor(logdir="/my/training/directory",
                         saver=my_saver,
                         save_model_secs=30)
      with sv.managed_session() as sess:
        ...training loop...

    摘要:何时何地。

    managed_session()呼叫启动摘要服务,其获取摘要并报告每秒执行的步骤数。可以通过构造函数的以下关键字参数来配置Supervisor() 它:

    • logdir:摘要服务创建事件文件的目录的路径。如果需要,创建该目录。传递None禁用汇总服务以及检查点服务。

    • save_summaries_secs:汇总服务的每次运行之间的秒数。默认为120或2分钟。

    选择一个值时,请考虑您的摘要是多么昂贵,以及它们将占用多少磁盘。通过0以禁用摘要服务。

    • summary_op:用于获取摘要。

    如果没有指定,则主管使用tf.GraphKeys.SUMMARY_OP 图形集合中的第一个操作 。如果集合为空,则主管将创建一个op,该集合使用图中的所有摘要tf.summary.merge_all()

    传递None禁用摘要服务。

    • global_step:Tensor用来计数全球一步。

    如果未指定,则主管将使用tf.GraphKeys.GLOBAL_STEP 图形集合中的第一张张 。如果集合为空,则主管global_step将在图中查找一个标量整型变量。

    如果找到,全局步长张量用于测量执行的训练步骤的数量。请注意,您的培训操作系统负责增加全局步进值。

    模型初始化和恢复

    managed_session()呼叫负责初始化或恢复会话。它返回一个具有完全初始化模型的会话,准备运行ops。如果managed_session()调用logdir中存在检查点,则通过加载该检查点来初始化该模型,否则通过调用init op和可选的init函数进行初始化。

    当没有检查点可用时,模型初始化由构造函数的以下关键字参数Supervisor()控制:

    • init_op:运行以初始化模型。

    如果没有指定,主管将使用集合中的第一个操作 tf.GraphKeys.INIT_OP。如果集合为空,则主管添加一个op,通过调用来初始化图中的所有变量tf.global_variables_initializer()

    传递None不使用init操作。

    • init_fn:Python函数调用初始化模型。

    如果指定,调用为管理会话init_fn(sess)在哪里sess。如果还使用init op,init函数将在init操作之后调用。

    • local_init_op:用于初始化未保存在检查点(如表和局部变量)中的图形部分的附加操作 。本地init op 在init op和init函数之前运行。

    如果没有指定,主管将使用集合中的第一个操作 tf.GraphKeys.LOCAL_INIT_OP。如果集合为空,则主管添加操作以通过调用tf.initialize_all_tables()和 初始化图中的所有表和局部变量tf.initialize_all_local_variables()

    传递None不使用本地init操作。

    • ready_op:操作以检查模型是否被初始化。

    在运行本地init操作,init操作和init函数之后,主管通过运行ready操作来验证模型是否被完全初始化。这是一个op,如果模型被初始化,则返回一个空字符串,或者如果没有初始化模型的哪些部分的描述。

    如果没有指定,主管将使用集合中的第一个操作 tf.GraphKeys.READY_OP。如果集合为空,则主管创建一个准备好的操作,通过调用来验证所有变量是否被初始化tf.report_uninitialized_variables()

    通过None禁用准备操作。在这种情况下,初始化后不检查模型。

    检查点恢复由构造函数的以下关键字参数 Supervisor()控制:

    • logdir:要查找检查点的目录的路径。检查点服务在检查点目录中保存名为“检查点”的元数据文件,该目录指示最近检查点的路径。

    此文件为文本格式。当捏住时,您可以手动编辑它,以从不同于最近的检查点进行恢复。

    • ready_op: (往上看)。准备运行在加载检查点之前和之后运行。第一个运行检查模型是否需要初始化,第二个运行验证模型是否已完全初始化。

    • local_init_op: (往上看)。在运行ready操作之前运行本地init操作,初始化局部变量和表。

    • saver: (往上看)。用于加载检查点的Saver对象。