2017-07-09 5 views
1

Ich habe SSD (Single Shot Detector) in Tensorflow implementiert.Tensorflow versucht mehr Speicher zu verwenden, als der Profiler anzeigt

Während Folgerung, ich bin Laden der gefrorenen Diagramm wie folgt:

def load_graph(filename): 
     with tf.gfile.FastGFile(filename, 'rb') as f: 
     graph_def = tf.GraphDef() 
     graph_def.ParseFromString(f.read()) 
     img, box, cls, val = tf.import_graph_def(graph_def, name='', 
      return_elements=['input:0', 'pred/box:0', 'pred/cls:0', 'pred/val:0'] 
     ) 
     return img, box, cls, val 

Damit keine unnötigen Operationen entlang Tag wird.

jedoch, als ich die Verwendung Skript ausgeführt wird, etwa so:

_box, _cls, _val = sess.run([box, cls, val],{img: np.expand_dims(image_data,0)}, 

(dh ich bin nur eine Losgröße von einer Verwendung)

Ich bemerkte, dass tensorflow über Speicherbelegung klagte:

2017-07-08 20:38:46.389877: W 
tensorflow/core/common_runtime/bfc_allocator.cc:217] Allocator 
(GPU_0_bfc) ran out of memory trying to allocate 2.05GiB. The caller 
indicates that this is not a failure, but may mean that there could be 
performance gains if more memory is available. 

Also beschloss ich, die Operationen zu profilieren, und bekam folgendes Ergebnis:

Profiled Graph

Wie Sie sehen können, beansprucht keiner der Vorgänge mehr als 75 MB.

Woher kommt diese Diskrepanz?

Wenn ich die Menge an Speicherzuweisung zu steuern, wie folgt aus:

gpu_options = tf.GPUOptions(allow_growth=True, per_process_gpu_memory_fraction=0.1) 
    config = tf.ConfigProto(log_device_placement=True, gpu_options=gpu_options) 

Tensorflow noch über die Menge an Speicher beschwert zur Verfügung, aber ich habe keine kritischen Treffer in der Leistung sehen (dh es läuft immer in etwa 8 ms, unabhängig von dem zulässigen Speicher zugewiesen)

Wenn ich erlaube es zu wachsen, bis Tensorflow scheint zufrieden, es wächst auf etwa 6,7 ​​GB.

Ich verstehe nicht, was dieses Verhalten verursacht. Woher kommt diese Diskrepanz?

+0

Einige Ops machen explorative Zuweisungen für optionalen Scratch Space (sie können ohne sie arbeiten, zB [conv] (https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/kernels/conv_ops_gpu.h#) L54)). Fehlgeschlagene Zuordnungen werden möglicherweise nicht im Profil angezeigt. Schwer zu sagen mehr ohne eine Reproduktion. Es ist möglich, dass der Scratch Space in diesem Fall nicht hilfreich ist (in diesem Fall ist es in Ordnung, die Warnung zu ignorieren). –

Antwort

0

Die Warnung, die Sie melden, besagt, dass die Zuweisung auf dem Gerätespeicher fehlgeschlagen ist und stattdessen auf dem Hostspeicher passiert ist;

In Ihrem Tensorboard-Screenshot zeigen Sie jedoch nur Gerätespeicher an (das Kontrollkästchen gpu:0). Sie müssen das Kontrollkästchen aktivieren, um CPU-Operationen zu debuggen.

Jetzt vorausgesetzt, dass Sie schnelle Berechnungen in dieser Situation erhalten vergleichbar mit, wenn es auf dem Gerät zugeordnet ist, und gegeben die Größe der Zuweisung (2GB), und die Position der ausgegrauten Boxen in Ihrem Tensorboard-Snapshot gegeben Ich vermute, dass dieser Tensor Eingabedaten enthält und dass nur Slices als Stapel an die GPU gesendet werden. Ich würde sagen, das ist in Ordnung.

+0

Wie ich bereits erwähnt habe, sende ich nur eine einzelne Charge gleichzeitig, und diese Charge enthält lediglich einen Float32 Tensor von 300x300x3 (das Bild). Es erscheint nicht plausibel, dass ein einzelnes Bild eine Zuordnungsgröße von 2 GB erfordern würde. –

+0

Was zeigt Tensorboard, wenn Sie diese 'cpu: 0' Box überprüfen? – user1735003

+0

Es sieht meistens gleich aus. Wenn ich nur CPU-Operationen betrachte, nehmen sie nur Speicher in der Größenordnung von ~ 23 KB auf. –

Verwandte Themen