我对Tensorflow和ML一般都很新,我想知道我可以用什么策略来提高我正在构建的应用程序的性能。
我的应用程序正在使用Tensorflow C ++接口,其源代码编译为TF 0.11 libtensorflow_cc.so(使用bazel build -c opt --copt = -mavx并可选择添加--config = cuda),用于AVX或AVX + Mac OS X 10.12.1上的CUDA,MacBook Pro 2.8 GHz Intel Core i7(2核8线程),16GB内存和Nvidia 750m w / 2GB VRam)
我的应用程序使用Inception V3模型并从pool_3层提取特征向量。我通过本机API解码视频帧,并将内存缓冲区中的视频帧传递给TF的C ++接口,并将它们运行到会话中。
我目前没有批处理,但我正在缓存我的会话,并为每个单独的解码帧/张量提交重新使用它。我注意到CPU和GPU的性能大致相同,处理222帧需要大约40到50秒,这对我来说似乎很慢。我已经确认CUDA正在被调用,加载,并且GPU正在运行(或看起来如此)。
有些问题:
一般情况下,如果TF在消费者笔记本电脑上执行Inception框架,我应该期待合理的性能时间吗?
批处理为这些操作带来了多大的不同?对于1x299x299x3的张量,我想我正在做更多的PCI传输等待而不是等待来自GPU的有意义的工作?
如果有,是否有一个很好的例子,在C ++下为InceptionV3进行批处理?
是否存在可能导致额外CPU-> GPU同步的操作,否则可能会被避免?
有没有办法确保我的会话/图表共享资源?我可以用这种方式以某种方式使用嵌套作用域吗?我无法完成工作,但很可能错过了一些东西。
关于要做/避免的事情的一般策略的任何好的文档?
我的代码如下:
非常感谢
作为参考,使用感知散列,直方图,密集光流,用于点跟踪的稀疏光流以及简单显着性检测的OpenCV分析对于使用CPU或CPU + OpenCL的相同222帧需要4到5秒。
https://github.com/Synopsis/Synopsis/tree/TensorFlow/Synopsis/StandardAnalyzer
答案 0 :(得分:1)
首先回答您的上一个问题,如果有关于性能优化的文档,是:
笔记本电脑性能变化很大,TF并未针对笔记本电脑GPU进行特别优化。您使用2016版本的TensorFlow开始,笔记本电脑平台上你得到的数字(在40-50秒内222帧)〜= 5 fps似乎并不疯狂。通过上述性能指南中概述的一些性能改进,2017年底可能会翻倍。
对于批处理,是 - 较新的example inception model code允许在推理时使用可变批量大小。这主要是关于模型本身是否被定义为处理批量大小,这是自2016年以来的改进。
对推理进行批处理会对GPU产生很大的影响。它对CPU的帮助是否有很大帮助 - 例如,如果你使用MKL-DNN支持构建,那么批处理应该被认为是强制性的,但基本的TensorFlow可能不会受益。