Jak działa szkolenie asynchroniczne w rozproszonym przepływie Tensorflow?

Przeczytałem Distributed TensorFlow Doc i wspomina, że w treningu asynchronicznym,

Każda replika wykresu ma niezależną pętlę treningową, która wykonuje się bez koordynacji.

Z tego, co rozumiem, jeśli używamy parametru-serwera z architekturą paralelizmu danych, oznacza to, że każdy pracownik oblicza gradienty i aktualizuje swoje własne wagi, nie przejmując się aktualizacjami innych pracowników dla rozproszonej sieci neuronowej szkolenia. Ponieważ wszystkie wagi są udostępniony na serwerze parametrów (ps), myślę, że ps nadal musi koordynować (lub agregować) aktualizacje wagi od wszystkich pracowników w jakiś sposób. Zastanawiam się jak działa agregacja w treningu asynchronicznym. Czy mówiąc ogólniej, jak działa szkolenie asynchroniczne w rozproszonym przepływie Tensorflow?

Author: patapouf_ai, 2017-03-31

3 answers

Gdy trenujesz asynchronicznie w rozproszonym przepływie TensorFlow, dany pracownik wykonuje następujące czynności:

  1. Worker odczytuje wszystkie parametry współdzielonego modelu równolegle z zadania PS i kopiuje je do zadania worker. Odczyty te są nieskoordynowane z jakimikolwiek współbieżnymi zapisami i nie są nabywane żadne blokady: w szczególności pracownik może zobaczyć częściowe aktualizacje od jednego lub więcej innych pracowników (np. może być zastosowany podzbiór aktualizacji od innego pracownika lub podzbiór elementów w zmiennej może zostać zaktualizowany).

  2. Worker oblicza lokalnie gradienty na podstawie partii danych wejściowych i wartości parametrów odczytanych w kroku 1.

  3. Worker wysyła gradienty dla każdej zmiennej do odpowiedniego zadania PS, a stosuje gradienty do odpowiedniej zmiennej, używając reguły aktualizacji, która jest określona przez algorytm optymalizacji (np., Adam itp.). Reguły aktualizacji zazwyczaj używają (w przybliżeniu) operacji komutacyjnych , więc mogą być stosowane niezależnie od aktualizacji od każdego workera, a stan każdej zmiennej będzie agregatem ciągów otrzymanych aktualizacji.

W szkoleniu asynchronicznym każda aktualizacja workera jest stosowana jednocześnie, a aktualizacje mogą być nieco skoordynowane, jeśli opcja use_locking=True została ustawiona, gdy odpowiedni optymalizator (np. tf.train.GradientDescentOptimizer) została zainicjowana. Należy jednak pamiętać, że blokowanie tutaj zapewnia wzajemne wykluczenie tylko dla dwóch jednoczesnych aktualizacji i (jak wspomniano powyżej) odczyty nie nabywają blokad; blokowanie nie zapewnia atomiczności w całym zestawie aktualizacji.

(w przeciwieństwie do treningu synchronicznego, narzędzie takie jak tf.train.SyncReplicasOptimizer zapewni, że wszyscy pracownicy odczytają te same, aktualne wartości dla każdego parametru modelu; i że wszystkie aktualizacje dla kroku synchronicznego są agregowane, zanim zostaną zastosowane do zmienne podstawowe. W tym celu pracownicy są synchronizowani przez barierę, którą wprowadzają po wysłaniu aktualizacji gradientu i opuszczają po zastosowaniu agregowanej aktualizacji do wszystkich zmiennych.)

 19
Author: mrry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-11 00:35:31

W treningu asynchronicznym nie ma synchronizacji wagi wśród pracowników. Wagi są przechowywane na serwerze parametrów. Każdy pracownik ładuje i zmienia wspólne wagi niezależnie od siebie. W ten sposób, jeśli jeden pracownik ukończył iterację szybciej niż inni, kontynuuje kolejną iterację bez czekania. Pracownicy wchodzą w interakcję tylko z udostępnionym serwerem parametrów i nie wchodzą ze sobą w interakcję.

Ogólnie można (w zależności od zadania) przyspieszyć obliczenia znacznie. Jednak wyniki są czasami gorsze niż te uzyskane przy wolniejszych aktualizacjach synchronicznych.

 2
Author: BlueSun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-10 11:04:04

Patrząc na przykład w dokumentacji, do której linkujesz:

with tf.device("/job:ps/task:0"):
  weights_1 = tf.Variable(...)
  biases_1 = tf.Variable(...)

with tf.device("/job:ps/task:1"):
  weights_2 = tf.Variable(...)
  biases_2 = tf.Variable(...)

with tf.device("/job:worker/task:7"):
  input, labels = ...
  layer_1 = tf.nn.relu(tf.matmul(input, weights_1) + biases_1)
  logits = tf.nn.relu(tf.matmul(layer_1, weights_2) + biases_2)
  # ...
  train_op = ...

with tf.Session("grpc://worker7.example.com:2222") as sess:
  for _ in range(10000):
    sess.run(train_op)

Widać, że trening jest rozłożony na trzech maszynach, które wszystkie mają kopię identycznych ciężarów, ale jak wspomniano poniżej przykład:

W powyższym przykładzie zmienne są tworzone w dwóch zadaniach w zadaniu ps, a intensywna obliczeniowo część modelu jest tworzona w zadaniu worker. TensorFlow wstawia odpowiednie transfery danych między zadaniami (z ps do worker dla przejście do przodu i z worker do ps do stosowania gradientów).

Innymi słowy, jeden gpu jest używany do obliczania przejścia do przodu, a następnie przesyła wyniki do pozostałych dwóch maszyn, podczas gdy każda z innych maszyn oblicza propagację wsteczną dla części wag, a następnie wysyła wyniki do innych maszyn, aby mogły one wszystkie odpowiednio zaktualizować swoje wagi.

GPU są używane do przyspieszenia mnożenia macierzy i równoległych operacji matematycznych, które są bardzo intensywne zarówno do przodu, jak i do tyłu propagacji. Tak rozproszone szkolenie po prostu oznacza, że można rozpowszechniać te operacje na wielu GPU, model jest nadal synchronizowany między maszynami, ale teraz propagacja wsteczna różnych ciężarów może być obliczana równolegle, a przejście do przodu na innej mini-partii można obliczyć w tym samym czasie, co backprop z poprzedniej mini-partii jest nadal obliczana. Szkolenie rozproszone nie oznacza, że masz całkowicie niezależne modele i ciężary na każdej maszynie.

 1
Author: patapouf_ai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-06 17:46:40