2016-04-26 9 views
3

Ich verwende diesen Befehl zum Benchmark:Wie wird die Inferenzzeit von der durchschnittlichen Durchlaufzeit in Caffe geschätzt? mein ConvNet in caffe

./build/tools/caffe time -model models/own_xx/deploy.prototxt -weights examples/RSR_50k_all_1k_db/snapshot_iter_10000.caffemodel -gpu=0 

Es läuft gut und erzeugt Ausgabe, die mit endet:

I0426 16:08:19.345427 15441 caffe.cpp:377] Average Forward pass: 13.5549 ms. 
I0426 16:08:19.345484 15441 caffe.cpp:379] Average Backward pass: 10.7661 ms. 
I0426 16:08:19.345527 15441 caffe.cpp:381] Average Forward-Backward: 25.2922 ms. 
I0426 16:08:19.345579 15441 caffe.cpp:383] Total Time: 1264.61 ms. 
I0426 16:08:19.345628 15441 caffe.cpp:384] *** Benchmark ends *** 

In einigen Tutorials ich den Kerl die Einstufung irgendwie einfach gesehen haben folgern Zeit von Average Forward pass. Ich kann jedoch keine Formel oder Material finden, die erklären, wie dies zu tun ist. Gibt es tatsächlich eine Verbindung zwischen den beiden Verbindungen? Welche anderen Faktoren, z.B. Anzahl der Iterationen und Batch-Größe sind beteiligt? Mein Ziel ist es, die Klassifizierungszeit meines ConvNet auf der GPU genau vorherzusagen.

UPDATE: Um nicht völlig ignorant zu erscheinen, werde ich hier hinzufügen, dass ich eine Grundidee habe, dass Vorwärtsdurchlauf die Zeit ist, die eine Eingabe benötigt, um eine relative Ausgabe zu erzeugen, so dass es auch die Inferenzzeit genannt werden kann. Was mich aber interessiert, ist zu wissen, ob das unabhängig von Losgröße und Iterationen der Fall ist? Ich habe es versucht, aber während des Benchmarks bietet Caffe keine Batch-Optionen.

+0

Hat Ihr deploy.prototxt eine Eingabeschicht? schau dir die Eingabegröße an, die im Prototxt definiert ist. Dies sagt dir, welche Stapelgröße für das Timing verwendet wird. – Shai

+0

@Shai Ja, ich bin mir über die Losgröße sicher, da ich das Netzwerk selbst geschrieben habe. Was ich nicht herausfinden kann, ist, wie es sich auf Vorwärtsdurchläufe und Klassifikationszeit des Bildes bezieht. Klassifizieren der Zeit eines Bildes ist mein Ziel. – Qazi

Antwort

6

Die durchschnittliche Vorwärtslaufzeit ist die Zeit, die benötigt wird, um einen Batch von Eingaben vom Eingabe- ("Daten") - Layer zum Ausgabe-Layer zu übertragen. Die in Ihrer Datei models/own_xx/deploy.prototxt angegebene Stapelgröße bestimmt, wie viele Bilder pro Stapel verarbeitet werden.

Zum Beispiel, wenn ich den Standard-Befehl ausführen, mit Caffe kommt:

build/tools/caffe time --model=models/bvlc_alexnet/deploy.prototxt --gpu=0 

ich die folgende Ausgabe

... 
I0426 13:07:32.701490 30417 layer_factory.hpp:77] Creating layer data 
I0426 13:07:32.701513 30417 net.cpp:91] Creating Layer data 
I0426 13:07:32.701529 30417 net.cpp:399] data -> data 
I0426 13:07:32.709048 30417 net.cpp:141] Setting up data 
I0426 13:07:32.709079 30417 net.cpp:148] Top shape: 10 3 227 227 (1545870) 
I0426 13:07:32.709084 30417 net.cpp:156] Memory required for data: 6183480 
... 
I0426 13:07:34.390281 30417 caffe.cpp:377] Average Forward pass: 16.7818 ms. 
I0426 13:07:34.390290 30417 caffe.cpp:379] Average Backward pass: 12.923 ms. 
I0426 13:07:34.390296 30417 caffe.cpp:381] Average Forward-Backward: 29.7969 ms. 

Die folgende Zeile erhalten:

I0426 13:07:32.709079 30417 net.cpp:148] Top shape: 10 3 227 227 (1545870) 

ist super wichtig. Es besagt, dass Ihre Eingabeschicht 10x3x227x227-dimensional ist. In diesem Fall beträgt die Stapelgröße 10 Bilder mit der Größe 3x227x227 (die 3 bezieht sich auf jeden der RGB-Kanäle in einem Bild).

So effektiv, dauerte es 1,67818 ms/Bild, um eine Vorwärtsdurchlauf oder Inferenz Zeit pro Bild zu tun.

Ändern der Losgröße

Wenn Sie die Chargengröße ändern möchten, schauen Sie sich Ihre .prototxt Datei. Die models/bvlc_alexnet/deploy.prototxt Datei, die mit Caffe kommt sieht wie folgt aus:

name: "AlexNet" 
layer { 
    name: "data" 
    type: "Input" 
    top: "data" 
    input_param { shape: { dim: 10 dim: 3 dim: 227 dim: 227 } } 
} 
layer { ... 

einfach dim ändern: 10 in einen anderen Wert (sagen zu ‚100‘, um eine Chargengröße von 100 Bildern pro Vorwärtsdurchlauf angeben).

+0

Vielen Dank für die klare und detaillierte Erklärung. Ich verstehe es jetzt richtig. Ich habe jedoch eine Follow-up-Frage. Mit dieser Methode habe ich verschiedene Chargengrößen getestet, um Klassifizierungszeiten zu erhalten. Meine Ergebnisse sind: 'CT: 0,098ms mit Batchsize von 6000 CT: 0,11 ms mit Batchsize von 1000 CT: 0.18ms mit Batchgröße von 100 CT: 1.07ms mit Batchsize von 10 CT: 7.68ms mit Batchsize von 1' Ich möchte wissen, warum die Inferenzzeiten auch mit Losgröße ändern. Ich verwende NVIDIA TX1 für diese Tests. – Qazi

+0

kann ich erraten: a. Ich benutze GPUs Fähigkeit mit Losgrößen von 1 und 10 nicht. b. Bei größeren Losgrößen (100,1000,6000) beträgt die Zeit ca. 0,1 ms. c. Dies zeigt auch, dass ich meine GPU voll ausnutzen kann, um hohe Speicherkosten zu erzielen oder Speicher zu sparen und die GPU ungenutzt zu lassen. Bin ich richtig bei diesen Annahmen. Bitte füge hinzu, was ich verpasst habe. – Qazi

+0

Ich möchte auch hinzufügen, dass, wenn ich Batchgröße größer als 7000 erhöhen. Der Prozess wird automatisch getötet, was ich denke, ist aufgrund nicht genügend Speicher. – Qazi