2016-11-19 5 views
1

Ich bin ziemlich neu bei Tensorflow in und ML im Allgemeinen und frage mich, welche Strategien ich verwenden kann, um die Leistung einer Anwendung, die ich erstelle, zu erhöhen.Strategien zur Leistungsverbesserung bei Tensorflow w/C++?

Meine App verwendet die Tensorflow C++ - Schnittstelle, mit einer Quelle kompiliert TF 0.11 libtensorflow_cc.so (mit bazel gebaut -c opt - copt = -mavx und optional hinzufügen --config = cuda) für AVX oder AVX + CUDA unter Mac OS X 10.12.1, auf einem MacBook Pro 2.8 GHz Intel Core i7 (2 Kerne 8 Threads) mit 16GB RAM und Nvidia 750m mit 2GB VRam)

Meine Anwendung verwendet Inception V3-Modell und ziehen Feature-Vektoren aus der Ebene pool_3. Ich entschlüssle Videoframes über native APIs und übergebe diese in Speicherpuffern an die C++ - Schnittstelle für TF und führe sie in eine Sitzung.

Momentan bin ich nicht im Batch-Modus, aber ich speichere meine Sitzung und verwende sie für jeden einzelnen decodierten Frame/Tensor-Submission erneut. Ich habe bemerkt, dass sowohl die CPU- als auch die GPU-Leistung in etwa gleich ist. Es dauert etwa 40 bis 50 Sekunden, um 222 Frames zu verarbeiten, was mir sehr langsam vorkommt. Ich habe bestätigt, dass CUDA aufgerufen, geladen und die GPU funktioniert (oder so aussieht).

Einige Fragen:

  • Im Allgemeinen, was soll ich für eine angemessene Leistung Zeit weise von TF tun einen Rahmen von Inception auf einem Verbraucher Laptop erwarten?

  • Wie viel Unterschied macht Batching für diese Operationen? Für Tensoren von 1x299x299x3 stelle ich mir vor, dass ich mehr PCI-Transfer-Wartezeiten mache, als auf eine sinnvolle Arbeit von der GPU zu warten?

  • Wenn ja Gibt es ein gutes Beispiel für die Stapelverarbeitung unter C++ für InceptionV3?

  • Gibt es Operationen, die zusätzliche CPU-> GPU-Synchronisierung verursachen, die andernfalls vermieden werden könnte?

  • Gibt es eine Möglichkeit, sicherzustellen, dass meine Sitzungen/Graphen Ressourcen gemeinsam nutzen? Kann ich auf diese Weise verschachtelte Bereiche verwenden? Ich konnte das nicht zur Arbeit bringen, aber wahrscheinlich etwas verpasst haben.

  • Eine gute Dokumentation der allgemeinen Strategien für Dinge zu tun/vermeiden?

Mein Code ist unten:

https://github.com/Synopsis/Synopsis/blob/TensorFlow/Synopsis/TensorFlowAnalyzer/TensorFlowAnalyzer.mm

Vielen Dank

Als Referenz OpenCV-Analyse unter Verwendung Wahrnehmungs Hash, Histogramm, dichten optischen Fluss, spärlichen optischen Fluss für Point Tracking und die einfache Erkennung der Großartigkeit dauert 4 bis 5 Sekunden für die gleichen 222 Frames mit CPU oder CPU + OpenCL.

https://github.com/Synopsis/Synopsis/tree/TensorFlow/Synopsis/StandardAnalyzer

Antwort

1

zuerst Ihre letzte Frage zu beantworten, ob es Unterlagen über die Performance-Optimierung, ja:

Laptop Leistung ist sehr variabel, und TF ist nicht besonders für Laptop-GPUs optimiert. Die Zahlen, die Sie erhalten (222 Bilder in 40-50 Sekunden) ~ = 5 fps, erscheinen auf einer Laptop-Plattform nicht verrückt, wenn Sie die Version 2016 von TensorFlow verwenden. Mit einigen der Leistungsverbesserungen, die im obigen Leistungsleitfaden aufgeführt sind, sollte das wahrscheinlich Ende 2017 verdoppelt werden.

Für die Dosierung, ja - die neuere example inception model code ermöglicht eine variable Batchgröße zur Inferenzzeit. Dabei geht es hauptsächlich darum, ob das Modell selbst für die Handhabung einer Batch-Größe ausgelegt wurde, die seit 2016 verbessert wurde.

Batching für Inferenz macht auf GPU einen großen Unterschied. Ob es bei der CPU hilft, hängt sehr davon ab - wenn Sie beispielsweise mit MKL-DNN-Unterstützung arbeiten, sollte die Stapelverarbeitung als obligatorisch betrachtet werden, aber die grundlegende TensorFlow-Funktion ist möglicherweise nicht so nützlich.

Verwandte Themen