Ta strona została przetłumaczona przez Cloud Translation API.
Switch to English

tf.distribute.experimental.TPUStrategy

TensorFlow 1 wersja Zobacz źródło na GitHub

Synchroniczne szkolenie na TPU i TPU strąków.

Dziedziczy: Strategy

Aby skonstruować obiekt TPUStrategy, trzeba uruchomić kod inicjujący, jak poniżej:

resolver = tf.distribute.cluster_resolver.TPUClusterResolver(tpu='')
tf.config.experimental_connect_to_cluster(resolver)
tf.tpu.experimental.initialize_tpu_system(resolver)
strategy = tf.distribute.experimental.TPUStrategy(resolver)

Podczas korzystania strategii dystrybucji, zmienne utworzone w zakres strategii, zostaną powtórzone we wszystkich replikach i mogą być przechowywane w synchronizacji z użyciem całkowicie zredukować algorytmów.

Aby uruchomić programy na TF2 TPU można użyć .compile i .fit API w tf.keras z TPUStrategy lub napisać własny, dostosowany pętlę szkoleniowy dzwoniąc strategy.run bezpośrednio. Zauważ, że TPUStrategy nie obsługuje czystego wykonanie chętny, więc upewnij się, że funkcja przeszedł do strategy.run jest tf.function lub strategy.run nazywa wewnątrz tf.function jeśli chętny zachowanie jest włączony.

tpu_cluster_resolver Tf.distribute.cluster_resolver.TPUClusterResolver, który dostarcza informacji o klastrze TPU.
device_assignment Opcjonalnie tf.tpu.experimental.DeviceAssignment określić rozmieszczenie replik na klastrze TPU.

cluster_resolver Zwraca resolverowi klastra związanego z tą strategią.

tf.distribute.experimental.TPUStrategy dostarcza skojarzony tf.distribute.cluster_resolver.ClusterResolver . Jeżeli użytkownik wprowadzi jeden w __init__ , że instancja jest zwracana; Jeśli użytkownik nie ma, domyślna tf.distribute.cluster_resolver.TPUClusterResolver jest świadczona.

extended tf.distribute.StrategyExtended z dodatkowymi sposobami.
num_replicas_in_sync Zwraca liczbę replik nad którym gradienty są sumowane.

metody

experimental_assign_to_logical_device

Pokaż źródło

Dodaje adnotację, że tensor zostanie przypisany do urządzenia logicznego.

 
# Initializing TPU system with 2 logical devices and 4 replicas.
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=4)
strategy = tf.distribute.TPUStrategy(
    resolver, experimental_device_assignment=device_assignment)
iterator = iter(inputs)

@tf.function()
def step_fn(inputs):
  output = tf.add(inputs, inputs)

  # Add operation will be executed on logical device 0.
  output = strategy.experimental_assign_to_logical_device(output, 0)
  return output

strategy.run(step_fn, args=(next(iterator),))
 

args
tensor tensor wejście adnotacji.
logical_device_id Id logicznego rdzenia, do którego zostanie przypisany tensor.

podbicia
ValueError Logiczny identyfikator urządzenia przedstawiona jest zgodna z całkowitej liczby partycji określonych przez przypisanie urządzenia.

Zwroty
Tensor adnotacją o wartości idential jako tensor .

experimental_distribute_dataset

Pokaż źródło

Tworzy tf.distribute.DistributedDataset z tf.data.Dataset .

Zwracany tf.distribute.DistributedDataset można powtórzyć na podobny do tego, jak regularne zbiory danych możliwe. UWAGA: użytkownik nie może dodać więcej transformacje do tf.distribute.DistributedDataset .

Poniżej znajduje się przykład:

 strategy = tf.distribute.MirroredStrategy()

# Create a dataset
dataset = dataset_ops.Dataset.TFRecordDataset([
  "/a/1.tfr", "/a/2.tfr", "/a/3.tfr", "/a/4.tfr"])

# Distribute that dataset
dist_dataset = strategy.experimental_distribute_dataset(dataset)

# Iterate over the `tf.distribute.DistributedDataset`
for x in dist_dataset:
  # process dataset elements
  strategy.run(replica_fn, args=(x,))
 

W Fragment kodu powyżej, tf.distribute.DistributedDataset dist_dataset jest dozowane przez GLOBAL_BATCH_SIZE , a my iterację niego przy użyciu for x in dist_dataset , x A tf.distribute.DistributedValues zawierające dane dla wszystkich replik, która zbiera się do wypiekania GLOBAL_BATCH_SIZE . tf.distribute.Strategy.run zajmie karmienia dane prawo per-repliki w x we właściwym replica_fn wykonywany na każdej replice.

Co znajduje się pod maską tego sposobu, gdy mówimy o tf.data.Dataset instancji - dataset - zostanie rozdzielone? To zależy od tego, w jaki sposób ustawić tf.data.experimental.AutoShardPolicy poprzez tf.data.experimental.DistributeOptions . Domyślnie jest on ustawiony na tf.data.experimental.AutoShardPolicy.AUTO . W otoczeniu wielu pracowników, najpierw próbują rozpowszechniać dataset przez wykrywanie, czy dataset jest tworzona z zestawów danych czytelnika (np tf.data.TFRecordDataset , tf.data.TextLineDataset , itd.), A jeśli tak, spróbuj shard pliki wejściowe. Należy pamiętać, że musi być co najmniej jeden plik wejściowy na pracownika. Jeśli masz mniej niż jednego pliku wejściowego na pracownika, sugerujemy wyłączenie zestawu danych sharding całej pracowników, poprzez ustawienie tf.data.experimental.DistributeOptions.auto_shard_policy być tf.data.experimental.AutoShardPolicy.OFF .

Jeśli próba odłamek o pliku nie powiedzie (czyli zbiór danych nie jest odczytywana z plików), będziemy shard zestawu danych równomiernie na końcu przez dodanie .shard operację do końca rurociągu przetwarzania. Spowoduje to, że całą przebiegu wyprzedzającego rurociągu dla wszystkich danych do uruchomienia na każdego pracownika, a każdy pracownik zrobi nadmiarowe pracy. Będziemy drukować ostrzeżenie, jeśli wybrana jest ta droga.

Jak wspomniano wcześniej, w ciągu każdego pracownika, będziemy również podzielić dane między wszystkimi urządzeniami pracownika (jeśli więcej niż jeden prezent). Stanie się tak nawet jeśli multi-pracownik sharding jest wyłączona.

If the above batch splitting and dataset sharding logic is undesirable, please use tf.distribute.Strategy.experimental_distribute_datasets_from_function instead, which does not do any automatic splitting or sharding.

You can also use the element_spec property of the tf.distribute.DistributedDataset instance returned by this API to query the tf.TypeSpec of the elements returned by the iterator. This can be used to set the input_signature property of a tf.function .

 strategy = tf.distribute.MirroredStrategy()

# Create a dataset
dataset = dataset_ops.Dataset.TFRecordDataset([
  "/a/1.tfr", "/a/2.tfr", "/a/3.tfr", "/a/4.tfr"])

# Distribute that dataset
dist_dataset = strategy.experimental_distribute_dataset(dataset)

@tf.function(input_signature=[dist_dataset.element_spec])
def train_step(inputs):
  # train model with inputs
  return

# Iterate over the `tf.distribute.DistributedDataset`
for x in dist_dataset:
  # process dataset elements
  strategy.run(train_step, args=(x,))
 

Args
dataset tf.data.Dataset that will be sharded across all replicas using the rules stated above.
options tf.distribute.InputOptions used to control options on how this dataset is distributed.

Returns
A tf.distribute.DistributedDataset .

experimental_distribute_datasets_from_function

View source

Distributes tf.data.Dataset instances created by calls to dataset_fn .

dataset_fn will be called once for each worker in the strategy. Each replica on that worker will dequeue one batch of inputs from the local Dataset (ie if a worker has two replicas, two batches will be dequeued from the Dataset every step).

This method can be used for several purposes. For example, where experimental_distribute_dataset is unable to shard the input files, this method might be used to manually shard the dataset (avoiding the slow fallback behavior in experimental_distribute_dataset ). In cases where the dataset is infinite, this sharding can be don