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


Python tf.compat.v1.distribute.OneDeviceStrategy.scope用法及代碼示例


用法

scope()

返回

  • 上下文管理器。

上下文管理器使策略成為當前策略並分配變量。

該方法返回一個上下文管理器,用法如下:

strategy = tf.distribute.MirroredStrategy(["GPU:0", "GPU:1"])
# Variable created inside scope:
with strategy.scope():
  mirrored_variable = tf.Variable(1.)
mirrored_variable
MirroredVariable:{
  0:<tf.Variable 'Variable:0' shape=() dtype=float32, numpy=1.0>,
  1:<tf.Variable 'Variable/replica_1:0' shape=() dtype=float32, numpy=1.0>
}
# Variable created outside scope:
regular_variable = tf.Variable(1.)
regular_variable
<tf.Variable 'Variable:0' shape=() dtype=float32, numpy=1.0>

輸入 Strategy.scope 會發生什麽?

  • strategy 作為"current" 策略安裝在全局上下文中。在此範圍內,tf.distribute.get_strategy() 現在將返回此策略。在此範圍之外,它返回默認的no-op 策略。
  • 進入範圍也進入“cross-replica上下文”。有關cross-replica 和副本上下文的說明,請參見tf.distribute.StrategyExtended
  • scope 內的變量創建被策略攔截。每個策略都定義了它希望如何影響變量的創建。 MirroredStrategy , TPUStrategyMultiWorkerMiroredStrategy 等同步策略創建在每個副本上複製的變量,而 ParameterServerStrategy 在參數服務器上創建變量。這是使用自定義 tf.variable_creator_scope 完成的。
  • 在某些策略中,還可以輸入默認設備範圍:在MultiWorkerMiroredStrategy中,在每個worker上輸入默認設備範圍"/CPU:0"。

注意:進入範圍不會自動分配計算,除非是像 keras 這樣的高級訓練框架model.fit.如果你不使用model.fit,你需要使用strategy.run用於顯式分發該計算的 API。請參閱中的示例自定義訓練循環教程.

什麽應該在範圍內,什麽應該在範圍之外?

對於範圍內需要發生的事情有許多要求。但是,在我們有關於正在使用哪種策略的信息的地方,我們經常為用戶輸入範圍,因此他們不必明確地這樣做(即,在範圍內或範圍外調用它們都可以)。

  • 任何創建應該是分布式變量的變量都必須在 strategy.scope 中調用。這可以通過在作用域上下文中直接調用變量創建函數來完成,或者通過依賴另一個 API(如 strategy.runkeras.Model.fit 來自動為您輸入它)來完成。在範圍之外創建的任何變量都不會被分發,並且可能會影響性能。在 TF 中創建變量的一些常見對象是模型、優化器、度量。此類對象應始終在範圍內初始化,任何可能延遲創建變量的函數(例如 Model.__call__() 、跟蹤 tf.function 等)都應類似地在範圍內調用。變量創建的另一個來源可以是檢查點恢複 - 當變量被延遲創建時。請注意,在策略中創建的任何變量都會捕獲策略信息。因此,在strategy.scope 之外讀取和寫入這些變量也可以無縫工作,而無需用戶進入範圍。
  • 一些策略 API(如 strategy.runstrategy.reduce )需要在策略的範圍內,會自動進入範圍,這意味著在使用這些 API 時,您不需要自己顯式地進入範圍。
  • 當在 strategy.scope 中創建 tf.keras.Model 時,模型對象會捕獲範圍信息。當調用model.compile , model.fit等高級訓練框架方法時,會自動進入捕獲的範圍,並使用相關策略分發訓練等。詳細示例見分布式keras教程。警告:僅調用model(..) 不會自動進入捕獲的範圍——隻有高級訓練框架API 支持此行為:model.compile , model.fit , model.evaluate , model.predictmodel.save 都可以在範圍內或範圍外調用。
  • 以下內容可以在範圍內或範圍外:
    • 創建輸入數據集
    • 定義 tf.function 代表您的訓練步驟
    • 保存 API,例如 tf.saved_model.save 。加載會創建變量,因此如果您想以分布式方式訓練模型,則應該在範圍內。
    • 檢查點保存。如上所述 - checkpoint.restore 如果創建變量,有時可能需要在範圍內。

相關用法


注:本文由純淨天空篩選整理自tensorflow.org大神的英文原創作品 tf.compat.v1.distribute.OneDeviceStrategy.scope。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。