2016-07-16 21 views
9

Wie kann ich jeden meiner EC2-Kerne vollständig nutzen?Wie kann TensorFlow verwendet werden? CPU

Ich benutze eine C4.4xlarge AWS Ubuntu EC2-Instanz und TensorFlow, um ein großes verschachteltes neuronales Netzwerk aufzubauen. nproc sagt, dass meine EC2-Instanz 16 Kerne hat. Wenn ich meinen Convnet-Trainingscode ausführe, sagt das oberste Dienstprogramm, dass ich nur 400% CPU verwende. Ich habe erwartet, dass es wegen der 16 Kerne 1600% CPU verwendet. Die AWS EC2-Registerkarte Überwachung bestätigt, dass ich nur 25% meiner CPU-Kapazität verwende. Dies ist ein riesiges Netzwerk, und auf meinem neuen Mac Pro verbraucht es ungefähr 600% CPU und braucht ein paar Stunden um zu bauen, deshalb glaube ich nicht, dass der Grund dafür ist, dass mein Netzwerk zu klein ist.

Ich glaube, die Linie unterhalb letztlich die CPU-Auslastung bestimmt:

sess = tf.InteractiveSession(config=tf.ConfigProto()) 

ich zugeben, dass ich nicht vollständig verstehen, die Beziehung zwischen Threads und Cores, aber ich habe versucht, die Anzahl der Kerne erhöht. Es hatte den gleichen Effekt wie die obige Zeile: immer noch 400% CPU.

NUM_THREADS = 16 
sess = tf.InteractiveSession(config=tf.ConfigProto(intra_op_parallelism_threads=NUM_THREADS)) 

EDIT:

  • htop zeigt, das zeigt, dass ich tatsächlich alle 16 meiner EC2 Kerne verwenden, aber jeder Kern ist nur bei etwa 25%
  • oben zeigt, dass meine gesamte CPU% ist etwa 400%, aber gelegentlich wird es bis zu 1300% schießen und dann fast sofort auf ~ 400% zurückgehen. Das macht ich denke, es gibt ein Deadlock-Problem
+0

Wie viele Kerne zu tun ist Dein MAC? – error2007s

+0

@ error2007s Ich habe 4 physische und 8 logische CPUs auf meinem Mac – user554481

Antwort

5

Mehrere Dinge werden kann, können Sie versuchen:

die Anzahl der Threads erhöhen

Sie haben bereits versucht, die intra_op_parallelism_threads ändern. Abhängig von Ihrem Netzwerk kann es auch sinnvoll sein, die inter_op_parallelism_threads zu erhöhen. Aus den doc:

inter_op_parallelism_threads:

Knoten, die Blockierung Operationen durchführen, werden auf einen Pool von
inter_op_parallelism_threads in jedem Prozess die Warteschlange eingereiht. 0 bedeutet, dass das System eine geeignete Nummer auswählt.

intra_op_parallelism_threads:

Die Ausführung eines einzelnen op (für einige op-Typen) können auf einen Pool von intra_op_parallelism_threads parallelisiert werden. 0 bedeutet, dass das System eine geeignete Nummer auswählt.

(Randbemerkung: Die Werte aus der Konfigurationsdatei oben verwiesen wird, sind nicht die tatsächlichen Standardwerte tensorflow Anwendungen aber nur Beispielwerte Sie können manuell die aktuelle Standard-Konfiguration finden Sie in das Objekt zurückgegeben durch tf.ConfigProto Inspektion(). .)

Tensorflow verwendet 0 für die obigen Optionen, was bedeutet, dass es versucht, selbst geeignete Werte zu wählen.Ich glaube nicht, dass Tensorflow schlechte Werte ausgewählt hat, die Ihr Problem verursacht haben, aber Sie können verschiedene Werte für die obige Option ausprobieren, um auf der sicheren Seite zu sein.


Extract verfolgt, wie gut Ihr Code zu sehen parallelisiert

Werfen Sie einen Blick auf tensorflow code optimization strategy

Es gibt Ihnen etwas wie this. In diesem Bild können Sie sehen, dass die eigentliche Berechnung bei sehr viel weniger Threads als verfügbar abläuft. Dies könnte auch für Ihr Netzwerk der Fall sein. Ich habe potenzielle Synchronisationspunkte markiert. Dort können Sie sehen, dass alle Threads für einen kurzen Moment aktiv sind, was möglicherweise der Grund für die sporadischen Spitzen bei der CPU-Auslastung ist, die Sie erfahren.

Verschiedenes

  • Stellen Sie sicher, nicht aus dem Speicher ausgeführt werden (htop)
  • Stellen Sie sicher, Sie sind nicht viel I/O oder etwas ähnliches
Verwandte Themen