用法
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
,TPUStrategy
和MultiWorkerMiroredStrategy
等同步策略創建在每個副本上複製的變量,而ParameterServerStrategy
在參數服務器上創建變量。這是使用自定義tf.variable_creator_scope
完成的。- 在某些策略中,還可以輸入默認設備範圍:在
MultiWorkerMiroredStrategy
中,在每個worker上輸入默認設備範圍"/CPU:0"。
注意:進入範圍不會自動分配計算,除非是像 keras 這樣的高級訓練框架model.fit
.如果你不使用model.fit
,你需要使用strategy.run
用於顯式分發該計算的 API。請參閱中的示例自定義訓練循環教程.
什麽應該在範圍內,什麽應該在範圍之外?
對於範圍內需要發生的事情有許多要求。但是,在我們有關於正在使用哪種策略的信息的地方,我們經常為用戶輸入範圍,因此他們不必明確地這樣做(即,在範圍內或範圍外調用它們都可以)。
- 任何創建應該是分布式變量的變量都必須在
strategy.scope
中調用。這可以通過在作用域上下文中直接調用變量創建函數來完成,或者通過依賴另一個 API(如strategy.run
或keras.Model.fit
來自動為您輸入它)來完成。在範圍之外創建的任何變量都不會被分發,並且可能會影響性能。在 TF 中創建變量的一些常見對象是模型、優化器、度量。此類對象應始終在範圍內初始化,任何可能延遲創建變量的函數(例如Model.__call__()
、跟蹤tf.function
等)都應類似地在範圍內調用。變量創建的另一個來源可以是檢查點恢複 - 當變量被延遲創建時。請注意,在策略中創建的任何變量都會捕獲策略信息。因此,在strategy.scope
之外讀取和寫入這些變量也可以無縫工作,而無需用戶進入範圍。 - 一些策略 API(如
strategy.run
和strategy.reduce
)需要在策略的範圍內,會自動進入範圍,這意味著在使用這些 API 時,您不需要自己顯式地進入範圍。 - 當在
strategy.scope
中創建tf.keras.Model
時,模型對象會捕獲範圍信息。當調用model.compile
,model.fit
等高級訓練框架方法時,會自動進入捕獲的範圍,並使用相關策略分發訓練等。詳細示例見分布式keras教程。警告:僅調用model(..)
不會自動進入捕獲的範圍——隻有高級訓練框架API 支持此行為:model.compile
,model.fit
,model.evaluate
,model.predict
和model.save
都可以在範圍內或範圍外調用。 - 以下內容可以在範圍內或範圍外:
- 創建輸入數據集
- 定義
tf.function
代表您的訓練步驟 - 保存 API,例如
tf.saved_model.save
。加載會創建變量,因此如果您想以分布式方式訓練模型,則應該在範圍內。 - 檢查點保存。如上所述 -
checkpoint.restore
如果創建變量,有時可能需要在範圍內。
相關用法
- Python tf.compat.v1.distribute.OneDeviceStrategy.experimental_distribute_dataset用法及代碼示例
- Python tf.compat.v1.distribute.OneDeviceStrategy.reduce用法及代碼示例
- Python tf.compat.v1.distribute.OneDeviceStrategy.make_input_fn_iterator用法及代碼示例
- Python tf.compat.v1.distribute.OneDeviceStrategy.experimental_make_numpy_dataset用法及代碼示例
- Python tf.compat.v1.distribute.OneDeviceStrategy.run用法及代碼示例
- Python tf.compat.v1.distribute.OneDeviceStrategy用法及代碼示例
- Python tf.compat.v1.distribute.MirroredStrategy.experimental_distribute_dataset用法及代碼示例
- Python tf.compat.v1.distribute.Strategy.run用法及代碼示例
- Python tf.compat.v1.distribute.MirroredStrategy.experimental_make_numpy_dataset用法及代碼示例
- Python tf.compat.v1.distribute.experimental.TPUStrategy.experimental_distribute_dataset用法及代碼示例
- Python tf.compat.v1.distribute.StrategyExtended.batch_reduce_to用法及代碼示例
- Python tf.compat.v1.distribute.experimental.TPUStrategy.experimental_make_numpy_dataset用法及代碼示例
- Python tf.compat.v1.distribute.experimental.CentralStorageStrategy.make_input_fn_iterator用法及代碼示例
- Python tf.compat.v1.distribute.experimental.MultiWorkerMirroredStrategy.reduce用法及代碼示例
- Python tf.compat.v1.distribute.experimental.MultiWorkerMirroredStrategy.experimental_make_numpy_dataset用法及代碼示例
- Python tf.compat.v1.distribute.Strategy.experimental_make_numpy_dataset用法及代碼示例
- Python tf.compat.v1.distribute.StrategyExtended.colocate_vars_with用法及代碼示例
- Python tf.compat.v1.distribute.experimental.CentralStorageStrategy用法及代碼示例
- Python tf.compat.v1.distribute.ReplicaContext用法及代碼示例
- Python tf.compat.v1.distribute.experimental.TPUStrategy.scope用法及代碼示例
注:本文由純淨天空篩選整理自tensorflow.org大神的英文原創作品 tf.compat.v1.distribute.OneDeviceStrategy.scope。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。