Question Comment fonctionne la formation asynchrone dans Tensorflow distribué?


j'ai lu Doc. Tensorflow distribué, et il mentionne que dans la formation asynchrone,

Chaque réplique du graphe possède une boucle de formation indépendante qui s'exécute sans coordination.

D'après ce que j'ai compris, si nous utilisons server de paramètres avec une architecture de parallélisme de données, cela signifie que chaque travailleur calcule des dégradés et met à jour ses propres poids sans se soucier des mises à jour des autres employés pour la formation distribuée. Comme tous les poids sont partagés sur le serveur de paramètres (ps), je pense que ps doit toujours coordonner (ou agréger) les mises à jour de poids de tous les travailleurs d'une manière ou d'une autre. Je me demande comment l'agrégation fonctionne en formation asynchrone. Ou plus généralement, comment fonctionne la formation asynchrone dans Tensorflow distribué?


18
2018-03-31 18:32


origine


Réponses:


Lorsque vous vous entraînez de manière asynchrone dans Distributed TensorFlow, un agent particulier effectue les opérations suivantes:

  1. Le travailleur lit tous les paramètres de modèle partagés en parallèle des tâches PS, et les copie dans la tâche de travail. Ces lectures ne sont pas coordonnées avec des écritures simultanées et aucun verrou n'est acquis: en particulier, le travailleur peut voir des mises à jour partielles d'un ou plusieurs autres travailleurs (par exemple, un sous-ensemble des mises à jour d'un autre travailleur peut avoir été appliqué). dans une variable peut avoir été mis à jour).

  2. Le travailleur calcule les dégradés localement, en fonction d’un lot de données en entrée et des valeurs de paramètre qu’il lit à l’étape 1.

  3. Le travailleur envoie les gradients pour chaque variable à la tâche PS appropriée, et s'applique les dégradés à leur variable respective, en utilisant une règle de mise à jour qui est déterminée par l'algorithme d'optimisation (par exemple, SGD, SGD avec Momentum, Adagrad, Adam, etc.). Les règles de mise à jour utilisent généralement (approximativement) commutative opérations, elles peuvent donc être appliquées indépendamment sur les mises à jour de chaque travailleur et l'état de chaque variable sera un agrégat en cours d'exécution de la séquence des mises à jour reçues.

Dans la formation asynchrone, chaque mise à jour de l'agent est appliquée simultanément et les mises à jour peuvent être quelque peu coordonnées si l'option use_locking=True L’indicateur a été défini lorsque l’optimiseur respectif (par ex. tf.train.GradientDescentOptimizer) a été initialisé. Notez cependant que le verrouillage ne fournit qu'une exclusion mutuelle pour deux mises à jour simultanées et que (comme indiqué ci-dessus) les lectures n'acquièrent pas de verrous; le verrouillage ne fournit pas d'atomicité sur l'ensemble des mises à jour.

(En revanche, en entraînement synchrone, un utilitaire comme tf.train.SyncReplicasOptimizer veillera à ce que tous les travailleurs lisent les mêmes valeurs à jour pour chaque paramètre du modèle; et que toutes les mises à jour pour une étape synchrone sont agrégées avant d'être appliquées aux variables sous-jacentes. Pour ce faire, les travailleurs sont synchronisés par une barrière, qu’ils entrent après avoir envoyé leur mise à jour de dégradé, et s’en vont une fois que la mise à jour agrégée a été appliquée à toutes les variables.


16
2018-04-11 00:35



Dans la formation asynchrone, il n'y a pas de synchronisation des poids entre les travailleurs. Les poids sont stockés sur le serveur de paramètres. Chaque travailleur charge et modifie les poids partagés indépendamment les uns des autres. De cette façon, si un travailleur termine une itération plus rapidement que les autres travailleurs, il procède à l'itération suivante sans attendre. Les travailleurs n'interagissent qu'avec le serveur de paramètres partagé et n'interagissent pas les uns avec les autres.

Dans l'ensemble, cela peut (en fonction de la tâche) accélérer le calcul de manière significative. Cependant, les résultats sont parfois moins bons que ceux obtenus avec les mises à jour synchrones plus lentes.


2
2018-04-09 20:46



En regardant l'exemple dans la documentation, vous accédez à:

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)

Vous pouvez voir que la formation est distribuée sur trois machines qui partagent toutes une copie de poids identiques, mais comme mentionné ci-dessous:

Dans l'exemple ci-dessus, les variables sont créées sur deux tâches dans le travail ps et la partie intensive en calcul du modèle est créée dans le travail de travail. TensorFlow insérera les transferts de données appropriés entre les travaux (de ps à worker pour la passe directe, et de worker à ps pour l'application de dégradés).

En d'autres termes, un gpu est utilisé pour calculer la passe avant, puis transmet les résultats aux deux autres machines, tandis que chacune des autres machines calcule la propagation arrière pour une partie des poids, puis envoie les résultats aux autres machines. ils peuvent tous mettre à jour leurs poids de manière appropriée.

Les GPU sont utilisés pour accélérer les multiplications matricielles et les opérations mathématiques parallèles très intensives pour la propagation directe et la propagation arrière. Ainsi, l'entraînement distribué signifie simplement que vous distribuez ces opérations sur de nombreux GPU, que le modèle est toujours synchronisé entre les machines, mais que maintenant, la propagation arrière de différents poids peut être calculée en parallèle et la transmission directe sur un mini-lot différent peut être calculée. le même temps que le backprop du mini-lot précédent est en cours de calcul. La formation distribuée ne signifie pas que vous avez des modèles et des poids totalement indépendants sur chaque machine.


1
2018-04-06 17:46