2017-02-04 5 views
1

Frage über zwischen-Graph-Replikation in verteilten Tensorflow, weil ich nicht wenige Momente aus Tutorials bekommen habe. Wie ich das aktuelle Modell verstanden habe:Between-Graph-Replikation in Tensorflow: Sitzungen und Variablen

Wir haben Parameter Server, die wir nur in separaten Prozess starten und server.join() machen. Wir haben Arbeiter, jeder von ihnen baut den ähnlichen Rechengraphen, der Parameterknoten enthält, die mit dem Parameterserver (über tf.train.replica_device_setter) verbunden sind, und Berechnungsknoten, die auf den Arbeitern selbst platziert sind.

Was ich nicht finden:

  1. Wie Sitzungen in diesem Modell arbeiten? Denn in Beispielen/Tutorials ist es hinter tf.train.Supervisor versteckt. Haben wir separate Sitzungen für jeden Mitarbeiter oder nur eine große Sitzung, die Diagramme von allen Mitarbeitern und Parameterservern akkumulieren?

  2. Wie werden globale Variablen auf dem Parameterserver initialisiert? Ich wundere mich, dass ich sie in einem der Worker-Prozesse initialisieren kann (wählen Sie es als "Master"), wenn ich diese Parameter auf den Arbeiter über tf.train.replica_device_setter verknüpfte. Ist das korrekt?

  3. Im folgenden Kern:

https://gist.github.com/yaroslavvb/ea1b1bae0a75c4aae593df7eca72d9ca

globale Variablen nur im Parameter-Server-Prozess initialisiert und alle Arbeiter betrachten sie initialisierten. Wie ist das möglich, da sie sogar in verschiedenen Sitzungen arbeiten? Ich konnte es nicht in einem einfacheren Beispiel replizieren.

  1. Ich habe Hauptsitzung im Kernprogramm, wo ich das Modell trainiere. Ein Teil der Trainingsschleife ist die Sammlung von Daten, die wiederum eine Berechnung auf dem Tensorfluss-Cluster erfordert. Also muss ich diesen Cluster erstellen, den aktuellen Status des trainierten Modells in den Parameterserver übernehmen, dann Daten aus der Berechnung sammeln und mit der Trainingsschleife fortfahren. Wie kann ich: 1) das aktuell trainierte Modell an den Cluster übergeben? 2) Extrahieren Sie die gesammelten Daten aus dem Cluster und übergeben Sie diese an das Hauptprogramm?

Vielen Dank im Voraus!

EDIT:

Um Q.3: Es beantwortet wurde zuvor (In tensorflow, is variable value the only context information a session stores?), die in verteilten Laufzeitvariablen werden zwischen den Sitzungen gemeinsam genutzt. Bedeutet das, dass wenn ich eine Sitzung mit einem "Ziel" erzeuge, dann werden alle Variablen zwischen den Sitzungen geteilt, die auf demselben Graphen laufen?

+1

Für 4, was ist, wenn Sie dieselbe Sitzung sowohl für die verteilte als auch für die lokale Berechnung verwenden. Sie können Ihre Knoten an den aktuellen Worker anheften, um sicherzustellen, dass sie lokal ausgeführt werden. Dann sende deine lokalen Werte an den Remote-Parameter-Server, du könntest 'remote.assign (local)' tun, wobei 'remote' und' local' 'tf.Variable'-Objekte sind –

+0

@YaroslavBulatov Scheint, als ob es an einem einfachen Beispiel arbeitet. Ich werde die Antwort genauer prüfen und ergänzen. Vielen Dank!! – dd210

+0

@YaroslavBulatov Dies nicht zuweisen, es schien einfacher, einfach alle Parameter auf dem Server zu halten. Bearbeitete Antwort entsprechend. – dd210

Antwort

1

Ich kann versuchen, diese Fragen selbst zu beantworten, zumindest kann es für andere Neulinge hilfreich sein, die verteilten Tensorflow zu nutzen, weil ab sofort gibt es keine prägnanten und klaren Blog-Beiträge zu diesem Thema.

Ich hoffe, mehr sachkundige Leute werden mich korrigieren, wenn nötig.

  1. Wir haben getrennte Sitzungen auf allen Servern, und diese Sitzungen teilen ihre Ressourcen (Variablen, Warteschlangen und Leser) aber nur in verteilten Einstellung (das heißt Sie server.target zu tf.Session Konstruktor übergeben).

Ref: https://www.tensorflow.org/api_docs/python/client/session_management#Session

  1. Parameter Variablen in der Regel in einem "Master" Prozess initialisiert werden. Dies kann ein Prozess sein, bei dem der Parameterserver gestartet wird. Aber es ist nicht unbedingt notwendig, es in nur einem Prozess zu tun.

  2. Wegen p.1. Replizierten :)

  3. Dank Ideen aus @YaroslavBulatov, kam ich zu dem folgenden Ansatz, der die einfachste möglich zu sein scheint:

    • Cluster: einem lokalen „Kalkulations-Server“ und N „Arbeiter“.
    • "Calculation Server" behält alle Parameter des globalen Netzwerks und führt Trainingsschritte durch. Alle Trainingsoptionen sind ihm zugewiesen.
    • "Arbeiter" Daten parallel sammeln und dann in die Warteschlange stellen; Diese Daten werden von "Calculation Server" bei Trainingsschritten verwendet.

So, High-Level-Algorithmus:

  1. Start alle Einheiten in Cluster
  2. build comp Graph und Ausbildung ops auf Kalkulations-Server
  3. build comp Graph auf Arbeiter (Variablen sind verknüpft mit Berechnung Server).
  4. sammeln Daten mit den Arbeitern
  5. Trainingsschritt auf Kalkulations-Server ausführen und globales Netzwerk

wiederholen 4-5 bis Konvergenz aktualisieren :)

Ab jetzt habe ich die Koordination zwischen Kalkulations-Server und dem Arbeitnehmer durch Queues (wann die Datensammlung beginnen soll und wann der Trainingsschritt beginnen soll), was definitiv nicht die eleganteste Lösung ist. Jede Rückmeldung ist sehr willkommen.

Verwandte Themen