TPU 和 TPU Pod 的同步訓練。
繼承自:Strategy
用法
tf.distribute.TPUStrategy(
tpu_cluster_resolver=None, experimental_device_assignment=None,
experimental_spmd_xla_partitioning=False
)
參數
-
tpu_cluster_resolver
tf.distribute.cluster_resolver.TPUClusterResolver
實例,提供有關 TPU 集群的信息。如果沒有,它將假定在本地 TPU 工作人員上運行。 -
experimental_device_assignment
可選tf.tpu.experimental.DeviceAssignment
指定副本在 TPU 集群上的位置。 -
experimental_spmd_xla_partitioning
如果為 True,則在 XLA 編譯器中啟用 SPMD(單程序多數據)模式。該標誌隻影響 XLA 編譯的性能和編譯的 TPU 程序的 HBM 要求。 Ceveat:如果此標誌為 True,則調用tf.distribute.TPUStrategy.experimental_assign_to_logical_device將導致 ValueError。
屬性
-
cluster_resolver
返回與此策略關聯的集群解析器。一般來說,當使用multi-worker
tf.distribute
策略如tf.distribute.experimental.MultiWorkerMirroredStrategy
或tf.distribute.TPUStrategy()
時,有一個tf.distribute.cluster_resolver.ClusterResolver
與所使用的策略相關聯,並且這樣的實例由該屬性返回。打算擁有關聯
tf.distribute.cluster_resolver.ClusterResolver
的策略必須設置相關屬性,或覆蓋此屬性;否則,默認返回None
。這些策略還應提供有關此屬性返回的內容的信息。Single-worker 策略通常沒有
tf.distribute.cluster_resolver.ClusterResolver
,在這些情況下,此屬性將返回None
。當用戶需要訪問集群規範、任務類型或任務 ID 等信息時,
tf.distribute.cluster_resolver.ClusterResolver
可能很有用。例如,os.environ['TF_CONFIG'] = json.dumps({ 'cluster':{ 'worker':["localhost:12345", "localhost:23456"], 'ps':["localhost:34567"] }, 'task':{'type':'worker', 'index':0} }) # This implicitly uses TF_CONFIG for the cluster and current task info. strategy = tf.distribute.experimental.MultiWorkerMirroredStrategy() ... if strategy.cluster_resolver.task_type == 'worker': # Perform something that's only applicable on workers. Since we set this # as a worker above, this block will run on this particular instance. elif strategy.cluster_resolver.task_type == 'ps': # Perform something that's only applicable on parameter servers. Since we # set this as a worker above, this block will not run on this particular # instance.
有關詳細信息,請參閱
tf.distribute.cluster_resolver.ClusterResolver
的 API 文檔字符串。 -
extended
tf.distribute.StrategyExtended
與其他方法。 -
num_replicas_in_sync
返回聚合梯度的副本數。
要構造 TPUStrategy 對象,您需要運行如下初始化代碼:
resolver = tf.distribute.cluster_resolver.TPUClusterResolver(tpu='')
tf.config.experimental_connect_to_cluster(resolver)
tf.tpu.experimental.initialize_tpu_system(resolver)
strategy = tf.distribute.TPUStrategy(resolver)
在使用分發策略時,在策略範圍內創建的變量將在所有副本中複製,並且可以使用 all-reduce 算法保持同步。
要在 TPU 上運行 TF2 程序,您可以將 tf.keras
中的 .compile
和 .fit
API 與 TPUStrategy 一起使用,或者通過直接調用 strategy.run
來編寫自己的自定義訓練循環。請注意,TPUStrategy 不支持純粹的 Eager 執行,因此請確保傳遞給 strategy.run
的函數是 tf.function
或 strategy.run
如果啟用了 Eager 行為,則在 tf.function
內調用。在 https://www.tensorflow.org/guide/tpu 中查看更多詳細信息。
在編寫自己的訓練循環時,distribute_datasets_from_function
和 experimental_distribute_dataset
API 可用於在 TPU 工作人員之間分配數據集。如果您使用 tf.keras.Model
中可用的 fit
和 compile
方法,那麽 Keras 將為您處理分發。
在 TPU 上編寫自定義訓練循環的示例:
with strategy.scope():
model = tf.keras.Sequential([
tf.keras.layers.Dense(2, input_shape=(5,)),
])
optimizer = tf.keras.optimizers.SGD(learning_rate=0.1)
def dataset_fn(ctx):
x = np.random.random((2, 5)).astype(np.float32)
y = np.random.randint(2, size=(2, 1))
dataset = tf.data.Dataset.from_tensor_slices((x, y))
return dataset.repeat().batch(1, drop_remainder=True)
dist_dataset = strategy.distribute_datasets_from_function(
dataset_fn)
iterator = iter(dist_dataset)
@tf.function()
def train_step(iterator):
def step_fn(inputs):
features, labels = inputs
with tf.GradientTape() as tape:
logits = model(features, training=True)
loss = tf.keras.losses.sparse_categorical_crossentropy(
labels, logits)
grads = tape.gradient(loss, model.trainable_variables)
optimizer.apply_gradients(zip(grads, model.trainable_variables))
strategy.run(step_fn, args=(next(iterator),))
train_step(iterator)
對於模型並行等高級用例,您可以在創建 TPUStrategy 時設置 experimental_device_assignment
參數以指定副本數和邏輯設備數。下麵是一個使用 2 個邏輯設備和 1 個副本初始化 TPU 係統的示例。
resolver = tf.distribute.cluster_resolver.TPUClusterResolver(tpu='')
tf.config.experimental_connect_to_cluster(resolver)
topology = tf.tpu.experimental.initialize_tpu_system(resolver)
device_assignment = tf.tpu.experimental.DeviceAssignment.build(
topology,
computation_shape=[1, 1, 1, 2],
num_replicas=1)
strategy = tf.distribute.TPUStrategy(
resolver, experimental_device_assignment=device_assignment)
然後您可以僅在邏輯設備 0 上運行 tf.add
操作。
@tf.function()
def step_fn(inputs):
features, _ = inputs
output = tf.add(features, features)
# Add operation will be executed on logical device 0.
output = strategy.experimental_assign_to_logical_device(output, 0)
return output
dist_dataset = strategy.distribute_datasets_from_function(
dataset_fn)
iterator = iter(dist_dataset)
strategy.run(step_fn, args=(next(iterator),))
experimental_spmd_xla_partitioning
啟用實驗性 XLA SPMD 函數以實現模型並行性。該標誌可以減少編譯時間和 HBM 要求。在此模式下運行時,每個輸入張量必須被分區(通過 strategy.experimental_split_to_logical_devices
)或完全複製(通過 strategy.experimental_replicate_to_logical_devices
)到所有邏輯設備。在此模式下調用 strategy.experimental_assign_to_logical_device
將導致 ValueError。
相關用法
- Python tf.distribute.TPUStrategy.experimental_assign_to_logical_device用法及代碼示例
- Python tf.distribute.TPUStrategy.reduce用法及代碼示例
- Python tf.distribute.TPUStrategy.experimental_replicate_to_logical_devices用法及代碼示例
- Python tf.distribute.TPUStrategy.experimental_split_to_logical_devices用法及代碼示例
- Python tf.distribute.TPUStrategy.experimental_distribute_dataset用法及代碼示例
- Python tf.distribute.TPUStrategy.scope用法及代碼示例
- Python tf.distribute.TPUStrategy.experimental_distribute_values_from_function用法及代碼示例
- Python tf.distribute.TPUStrategy.gather用法及代碼示例
- Python tf.distribute.TPUStrategy.run用法及代碼示例
- Python tf.distribute.OneDeviceStrategy.experimental_distribute_values_from_function用法及代碼示例
- Python tf.distribute.experimental_set_strategy用法及代碼示例
- Python tf.distribute.experimental.MultiWorkerMirroredStrategy.gather用法及代碼示例
- Python tf.distribute.cluster_resolver.TFConfigClusterResolver用法及代碼示例
- Python tf.distribute.experimental.MultiWorkerMirroredStrategy用法及代碼示例
- Python tf.distribute.NcclAllReduce用法及代碼示例
- Python tf.distribute.OneDeviceStrategy.experimental_distribute_dataset用法及代碼示例
- Python tf.distribute.experimental.rpc.Server.create用法及代碼示例
- Python tf.distribute.experimental.MultiWorkerMirroredStrategy.experimental_distribute_dataset用法及代碼示例
- Python tf.distribute.OneDeviceStrategy.gather用法及代碼示例
注:本文由純淨天空篩選整理自tensorflow.org大神的英文原創作品 tf.distribute.TPUStrategy。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。