2016-03-22 7 views
3

Ich baute einen LSTM-Klassifikator in Tensorflow (mit Python) und jetzt mache ich eine Reihe von Benchmarks, um die Ausführungsleistung zu messen. Der Benchmark-Code lädt das Modell, das während des Trainings gespeichert wurde, und führt es für eine Reihe von Eingaben aus. Ich habe sowohl einen Python-Benchmark als auch einen C++ - Benchmark.Tensorflow C++ - Evaluierungsleistung schlechter als Python eins

Ich bekomme 5ms pro Eingabe bei Verwendung von Python (auf CPU) und 68ms bei Verwendung von C++. Ich hatte erwartet, dass die C++ - Version mindestens eine ähnliche Leistung hat.

Was kann diesen Unterschied verursachen? Ich bin nicht vertraut mit den Interna von Tensorflow, aber eine meiner Vermutungen ist, dass Python-Version verwendet BLAS (mein numpy ist mit Blas verbunden) und C++ nicht. Wenn ja, bedeutet das, dass einige Graph-Operationen in Python ausgeführt werden?

+0

Ist die C++ Eins mit Optimierungsflags kompiliert? –

+0

Sowohl C++ als auch Python sollten dasselbe Backend verwenden (basierend auf Eigen), um die eigentliche Berechnung durchzuführen, so dass der Unterschied merkwürdig ist. Gibt es einen Unterschied, wenn Sie eine große Op ausführen, die nicht bandbreiteneingeschränkt ist? (dh multiplizieren Sie zwei 4k x 4k Matrizen zusammen) –

+0

Haben Sie die Antwort gefunden? –

Antwort

0

Können Sie einen einfacheren Benchmark verwenden, um das Problem einzugrenzen. Die folgenden dauert 2-5 Sekunden auf der CPU

import tensorflow as tf 
a=tf.Variable(tf.random_normal([8192, 8192], stddev=0.35)) 
b=tf.Variable(tf.random_normal([8192, 8192], stddev=0.35)) 
c=tf.matmul(a, b) 

sess.run([tf.initialize_all_variables()]) 

import time 
start_time = time.time() 
sess.run(c) 
print time.time()-start_time 
+0

10,4 CPU und 0,58 GPU. lscpu: Architektur: x86_64 CPU op-Modus (s): 32-Bit, 64-Bit- Byte Order: Little Endian CPU (s): 12 On-line CPU (s) Liste: 0-11 Thema (e) pro Kern: 2 Core (e) pro Sockel: 6 Socket (s): 1 NUMA-Knoten (s): 1 Vendor ID: Genuine CPU Familie: 6 Modell: 62 Stepping: 4 CPU-MHz: 1200.117 BogoMIPS: 4190.02 Virtualisierung: VT-x L1d-Cache: 32 K L1i-Cache: 32 K L2-Cache: 256K L3-Cache: 15360K – RaduK

+0

Was ist mit Timing mit C++? Sie können graphdef mit 'print tf.get_default_graph(). As_graph_def()' erhalten. Die Init-Operation heißt 'init: 0' und die Matrixmultiplikation ist' MatMul: 0' –

+0

Es hat 419s gedauert ... Ich denke, irgendwas stimmt mit meiner Box oder meinem Code wirklich nicht. Hier ist der Code, den ich verwendet habe: https://github.com/raduk/tensorflow_tests/blob/master/test.py und https://github.com/raduk/tensorflow_tests/blob/master/test.cc – RaduK

0

Ich bin nicht sicher, ob es zu spät ist, eine Antwort zu posten. Ich vor dem gleichen Problem und bekam Antwort von tensorflow Github Seite:

https://github.com/tensorflow/tensorflow/issues/3471

Die Lösung ist einfach, benutzen Sie einfach die -c opt Flagge.

+0

für jeden, der das später findet, sieht es aus wie die Flagge jetzt --config = opt (https://github.com/tensorflow/tensorflow/issues/7259) – smckee

Verwandte Themen