TensorFlow: Eine Warteschlange aus mehreren Threads ein- und wieder zurückziehen

8

Das Problem, das ich versuche zu lösen, ist wie folgt: Ich habe eine Liste trainimgs der Dateinamen. Ich habe ein

definiert
  • tf.RandomShuffleQueue mit seinem capacity=len(trainimgs) und min_after_dequeue=0 .
  • Dieser tf.RandomShuffleQueue wird voraussichtlich von trainimgs für eine angegebene epochlimit Anzahl gefüllt.
  • Es wird erwartet, dass mehrere Threads parallel arbeiten. Jeder Thread entfernt ein Element aus dem tf.RandomShuffleQueue und führt einige Operationen für dieses Element durch und reiht es in eine andere Warteschlange ein. Ich habe diesen Teil richtig gemacht.
  • Wenn jedoch 1 epoch von trainimgs verarbeitet wurde und tf.RandomShuffleQueue leer ist, vorausgesetzt, dass die aktuelle Epoche e < epochlimit ist, muss die Warteschlange erneut gefüllt werden und die Threads müssen wieder funktionieren.

Die gute Nachricht ist: Ich habe es in einem bestimmten Fall funktioniert (siehe PS am Ende !!)

Die schlechte Nachricht ist: Ich denke, dass es einen besseren Weg dafür gibt.

Die Methode, die ich dazu verwende, ist wie folgt (Ich habe die Funktionen vereinfacht und die e-Bildverarbeitungs-basierte Vorverarbeitung und das anschließende Einreihen entfernt, aber das Herz der Verarbeitung bleibt gleich !!):

%Vor%

Die Arbeitsfunktion ist wie folgt:

%Vor%

Obwohl das funktioniert, habe ich das Gefühl, dass es einen besseren und saubereren Weg gibt, dies zu erreichen. Kurz gesagt sind meine Fragen:

  1. Gibt es einen einfacheren und saubereren Weg, diese Aufgabe in TensorFlow zu erreichen?
  2. Gibt es ein Problem mit der Logik dieses Codes? Ich bin nicht sehr erfahren mit Multithreading-Szenarien, so dass irgendwelche offensichtlichen Fehler, die meine Aufmerksamkeit übersprungen haben, mir sehr hilfreich wären.

PS: Es scheint, dass dieser Code doch nicht perfekt ist. Als ich mit 1,2 Millionen Bildern und 200 Threads lief, lief es. Wenn ich es jedoch für 10 Bilder und 20 Threads ausführen, gibt es den folgenden Fehler:

%Vor%

Ich dachte, ich hätte das von except tf.errors.CancelledError . Was zum Teufel geht hier vor?

    
Ujjwal 28.02.2017, 16:39
quelle

3 Antworten

3

Ich habe endlich die Antwort gefunden. Das Problem war, dass mehrere Threads an verschiedenen Punkten in der work() -Funktion zusammenstoßen. Die folgende Funktion work() funktioniert einwandfrei.

%Vor%     
Ujjwal 07.03.2017, 12:23
quelle
1

Ich empfehle, einen einzelnen Thread zu verwenden, der enqueue_viele Epochen aufruft, um die richtige Anzahl von Bildern in die Warteschlange zu stellen. Es kann dann die Warteschlange schließen. Dadurch können Sie Ihre Arbeitsfunktion und andere Threads vereinfachen.

    
Alexandre Passos 06.03.2017 21:05
quelle
1

Ich denke, die GIL wird verhindern, dass in diesen Threads tatsächlich Parallelität stattfindet.

Um Leistung mit Tensorflow zu erhalten, müssen Sie Ihre Daten in Tensorflow halten.

Tensor Flow Handbuch zum Lesen von Daten erklärt, wie man ein sehr ähnliches Problem anspricht.

Genauer gesagt scheinen Sie einen beträchtlichen Teil von string_input_producer neu geschrieben zu haben.

    
mdaoust 08.03.2017 04:03
quelle