當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。