2016-08-03 9 views
7

Ich versuche die genauen Rollen des Master und Worker Service in TensorFlow zu verstehen.TensorFlow Master und Worker Service

Bisher verstehe ich, dass jede TensorFlow-Aufgabe, die ich beginne, mit einer tf.train.Server Instanz verknüpft ist. Diese Instanz exportiert einen „Master-Service“ und „Arbeiter-Service“ durch die tensorflow::Session Schnittstelle implementieren“(Master) und worker_service.proto (Arbeiter)

1. Frage:. Habe ich recht, dass dies bedeutet, dass nur eine Aufgabe zugeordnet ist, Arbeiter ONE


Außerdem habe ich verstanden ...

... über den Meister: Es ist der Umfang von t Er Master-Service ...

(1) ... um dem Client Funktionen anzubieten, damit der Client beispielsweise eine Sitzung ausführen kann.

(2) ... um Arbeit an die verfügbaren Arbeiter zu delegieren, um einen Sitzungslauf zu berechnen.

Zweite Frage: Falls wir ein Diagramm ausführen, das mit mehr als einer Aufgabe verteilt wird, wird nur ein Hauptdienst verwendet?

3. Frage: Should tf.Session.run nur einmal aufgerufen werden?

Dies ist zumindest, wie ich diese Figur aus the whitepaper interpretieren:

enter image description here


... über die Arbeiter: Es ist der Umfang der Arbeiter-Service ...

(1) um die Knoten (die ihm vom Hauptdienst zugewiesen wurden) auf den Geräten auszuführen, die der Arbeiter verwaltet.

4. Frage: Wie verwendet ein Arbeiter mehrere Geräte? Entscheidet sich ein Mitarbeiter automatisch für die Verteilung einzelner Vorgänge?


Bitte korrigieren Sie mich, auch für den Fall, kam ich mit falschen Aussagen auf! Vielen Dank im Voraus!

+0

für Teil 4, in früheren Versionen würde es Round-Robin über GPU-Geräte, in späteren Versionen scheint es alles auf GPU: 0 setzen, so dass Sie manuelle Platzierung für Multi-GPU-Konfigurationen benötigen –

Antwort

8

Erste Frage: Habe ich Recht, dass dies bedeutet, dass eine Aufgabe nur mit einem Arbeiter verbunden ist?

Dies ist die typische Konfiguration, ja. Jede tf.train.Server-Instanz enthält eine vollständige TensorFlow-Laufzeit, und in der Standardkonfiguration wird davon ausgegangen, dass diese Laufzeit exklusiven Zugriff auf die Maschine hat (in Bezug auf die Speicherzuweisung auf GPUs usw.).

Beachten Sie, dass Sie mehrere Instanzen tf.train.Server in demselben Prozess erstellen können (und wir tun dies manchmal for testing). Zwischen diesen Instanzen besteht jedoch nur eine geringe Ressourcenisolierung. Daher ist es unwahrscheinlich, dass die Ausführung mehrerer Instanzen in einer einzelnen Task zu einer guten Leistung führt (mit der aktuellen Version).

2. Frage: Falls wir ein Diagramm mit mehr als eine Aufgabe ausführen, wird nur ein Master-Service verwendet werden?

Es hängt von der form of replication Sie verwenden. Wenn Sie "In-Graph-Replikation" verwenden, können Sie einen einzelnen Master-Service verwenden, der über alle Replikate des Modells (d. H. Worker-Tasks) verfügt. Wenn Sie die Replikation zwischen Grafiken verwenden, würden Sie mehrere Master-Services verwenden, von denen jeder ein einzelnes Replikat des Modells kennt und normalerweise mit der Worker-Task, auf der es ausgeführt wird, verbunden ist. Im Allgemeinen haben wir festgestellt, dass es leistungsfähiger ist, zwischen der Graph-Replikation zu verwenden, und die Bibliothek tf.train.Supervisor wurde entwickelt, um den Betrieb in diesem Modus zu vereinfachen.

3. Frage: Sollte tf.Session.run() nur einmal aufgerufen werden?

(Ich gehe davon aus das bedeutet „einmal pro Trainingsschritt“. Ein einfaches TensorFlow Programm für ein Modell der Ausbildung wird tf.Session.run() in einer Schleife aufrufen.)

Diese von der Form der Replikation ab, die Sie verwenden , und die gewünschte Koordination zwischen den Trainingsupdates.

  • Mit in-Graph Replikation können Sie synchrone Updates machen, indem sie die Verluste oder Gradienten in einer einzigen tf.train.Optimizer Aggregation, die eine einzelne train_op zu laufen gibt. In diesem Fall rufen Sie nur einmal pro Trainingsschritt tf.Session.run(train_op) an.

  • Mit in-Graph Replikation Sie asynchrone Updates machen durch eine tf.train.Optimizer pro Replikat definiert, die mehrere train_op Operationen gibt auszuführen. In diesem Fall rufen Sie normalerweise alle tf.Session.run(train_op[i]) von einem anderen Thread gleichzeitig auf.

  • Mit zwischen Graph Replikation, machen Sie synchronen Updates die tf.train.SyncReplicasOptimizer verwenden, die in jeder Replik separat aufgebaut ist. Jedes Replikat hat seine eigene Trainingsschleife, die einen einzelnen Anruf an tf.Session.run(train_op) sendet, und die SyncReplicasOptimizer koordiniert diese, sodass die Updates synchron angewendet werden (durch einen Hintergrundthread in einem der Worker).

  • Mit zwischen Graph Replikation, machen Sie asynchrone Updates unter Verwendung eines anderen tf.train.Optimizer Unterklasse (außer tf.train.SyncReplicasOptimizer) unter Verwendung einer Trainingsschleife, die ähnlich dem synchronen Fall, aber ohne den Hintergrund Koordination.

4. Frage: Wie kann man Arbeiter Verwendung mehrerer Geräte machen? Entscheidet sich ein Arbeiter automatisch für die Verteilung einzelner Operationen oder ...?

Jeder Worker führt denselben Platzierungsalgorithmus aus, der in Einzelprozessoren TensorFlow verwendet wird. Sofern nicht anders angegeben, wird der Platzierer Operationen auf die GPU setzen, wenn eine verfügbar ist (und es gibt eine GPU-beschleunigte Implementierung), andernfalls wird sie auf die CPU zurückfallen. Die Gerätefunktion tf.train.replica_device_setter() kann verwendet werden, um Variablen über Tasks zu verteilen, die als "Parameterserver" fungieren. Wenn Sie komplexere Anforderungen haben (z. B. mehrere GPUs, lokale Variablen für die Worker usw.), können Sie explizite with tf.device(...): Blöcke verwenden, um einem bestimmten Gerät Untergraphen zuzuordnen.