2017-01-26 3 views
0

Ich versuche DNN-Modell mit Tensorflow zu trainieren, mein Skript haben zwei Variablen, eine ist dichtes Merkmal und eine ist spärlich, jedes Minibuch wird volle dichte Funktion ziehen und angegebene spärliche Funktion ziehen Mit der Verwendung von embedding_lookup_sparse konnte Feedforward erst beginnen, nachdem die spärliche Funktion bereit ist. Ich habe mein Skript mit 20 Parameter-Servern ausgeführt und die Anzahl der Worker wurde nicht skaliert. Also profilierte ich meinen Job mit Tensorflow Timeline und fand einen von 20 Parameter Server ist sehr langsam im Vergleich zu den anderen 19. Es gibt keine Abhängigkeit zwischen verschiedenen Teil aller trainierbaren Variablen. Ich bin nicht sicher, ob es irgendwelche Fehler oder Einschränkungen gibt, wie Tensorflow kann nur 40 Fan-Out-Anfragen in die Warteschlange stellen, irgendeine Idee, es zu debuggen? Danke im Voraus. tensorflow timeline profilingTensorflow einer von 20 Parameter Server ist sehr langsam

+0

Welcher Parameter Server ist das? (dh der erste Splitter oder nicht). Können Sie auch Netzwerkverkehr und CPU überprüfen, um sicherzustellen, dass alle versuchen, die gleiche Menge an Daten zu übertragen und die gleiche Menge an CPU-Arbeit zu tun? –

+0

@ YaroslavBulatov verschiedenen Betrieb hat verschiedene langsame Parameter Server, Netzwerkverkehr (5 ~ 10%) und CPU-Nutzung (20%) sind weit weg von beschäftigt, und verschiedene Parameter-Server haben fast den gleichen Netzwerkverkehr. –

+0

Gibt es eine Konfiguration oder Tools, um genau zu sehen, was Tensorflow macht? Ich protokolliere beispielsweise jedes Ereignis, um zu überprüfen, wann und wo der Mitarbeiter Anfragen sendet und Antworten von empfängt. Ich verstehe Tensorflow-Timeline-Tool nicht sehr gut, scheint es keinen expliziten Datenfluss zwischen Arbeitern und Servern. –

Antwort

1

Es klingt, als ob Sie genau 2 Variablen haben könnten, eine ist bei PS0 und die andere bei PS1 gespeichert. Die anderen 18 Parameter Server machen nichts. Bitte sehen Sie sich die variable Partitionierung an (https://www.tensorflow.org/versions/master/api_docs/python/state_ops/variable_partitioners_for_sharding), d. H. Partitionieren Sie eine große Variable in kleine Blöcke und speichern Sie sie auf separaten Parameterservern.

+0

Ich habe feste Größe Partitionierer und ich bin sicher, dass zwei Variablen in 20 Parameter Server gespittet wurden, von der Zeitachse Grafik, die ich anhängte, konnten Sie sehen, dass alle Parameter-Server arbeiten, das Problem ist, dass es immer einen Parameter gab langsam. Ich lief dreimal, der langsame Teil war 5,7, 19, nicht der gleiche. –

+0

Hmmm, ich habe das Profilierungswerkzeug, das Sie zuvor benutzt haben, nicht benutzt. Aus der Grafik ist der Unterschied ziemlich klein? 200ms vs 140ms? Liest ich das Diagramm richtig? – guinny

+0

Nicht genau, der untere ist Arbeiter, andere sind PS. Der 4. ist der super langsame Parameter Server, der Graph zeigt an, dass er um 60ms langsamer ist als andere, sowohl um dichte Parameter zu ziehen als auch um Gradienten zu schieben, und für spärliche Teile ist er sogar 100ms langsamer. –

0

Einige Vorschläge, die zu groß für einen Kommentar waren:

Sie nicht die Datenübertragung in der Zeitleiste sehen können, die ist, weil die Verfolgung von Send/Recv zur Zeit ausgeschaltet ist, einige Diskussion hier - https://github.com/tensorflow/tensorflow/issues/4809

In der neuesten Version (nachts, die 5 Tage alt oder neuer ist) können Sie die ausführliche Protokollierung aktivieren, indem Sie export TF_CPP_MIN_VLOG_LEVEL=1 tun, und es zeigt Zeitmarken der zweiten Ebene (siehe here über höhere Granularität).

Also mit Vlog vielleicht können Sie Nachrichten verwenden, die von diesem line erzeugt werden, um die Zeiten zu sehen, zu denen Send Ops generiert werden.

+0

Danke, tolle Antwort! Ich werde eine ausführliche Protokollierung versuchen. –

+0

BTW, wie vor 3 Stunden, es gibt jetzt Mikrosekunden in Zeitstempeln enthalten, also wenn Sie diese wollen, müssen Sie aus neuesten Kopf bauen –

1

Diese Art von Hack Art und Weise ist Send/Recv Timings von Timeline Objekt für jede Iteration zu protokollieren, aber es funktioniert ziemlich gut in Bezug auf der Analyse von JSON-Daten abgeladen (im Vergleich auf chrome://trace sichtbar zu machen).

Die Schritte, die Sie ausführen müssen, sind:

  • herunterladen TensorFlow Quelle und Kasse eine korrekte Verzweigung (r0.12 zum Beispiel)
  • den einzigen Ort ändern, die SetTimelineLabel Methode innerhalb executor.cc
      ruft
    • statt nur nicht übertragbare Knoten aufzuzeichnen, möchten Sie auch Send/Recv Knoten aufzeichnen.
    • vorsichtig sein SetTimelineLabel einmal in NodeDone nennen, da sie die Textzeichenfolge eines Knotens gesetzt würde, die später von einem Python-Skript
  • build TensorFlow aus modifizierten Quelle ändern
  • Codes Modell analysiert werden (für Beispiel inception_distributed_train.py) mit dem richtigen Art und Weise der Verwendung von Timeline und Grafik Meta-Daten

Dann können Sie das Training laufen und JSON-Datei einmal für jede Iteration abrufen! :)