使用Tensorflow w / C ++时提高性能的策略?

时间:2016-11-19 16:04:40

标签: optimization machine-learning tensorflow

我对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同步的操作,否则可能会被避免?

  • 有没有办法确保我的会话/图表共享资源?我可以用这种方式以某种方式使用嵌套作用域吗?我无法完成工作,但很可能错过了一些东西。

  • 关于要做/避免的事情的一般策略的任何好的文档?

我的代码如下:

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

非常感谢

作为参考,使用感知散列,直方图,密集光流,用于点跟踪的稀疏光流以及简单显着性检测的OpenCV分析对于使用CPU或CPU + OpenCL的相同222帧需要4到5秒。

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

1 个答案:

答案 0 :(得分:1)

首先回答您的上一个问题,如果有关于性能优化的文档,是:

笔记本电脑性能变化很大,TF并未针对笔记本电脑GPU进行特别优化。您使用2016版本的TensorFlow开始,笔记本电脑平台上你得到的数字(在40-50秒内222帧)〜= 5 fps似乎并不疯狂。通过上述性能指南中概述的一些性能改进,2017年底可能会翻倍。

对于批处理,是 - 较新的example inception model code允许在推理时使用可变批量大小。这主要是关于模型本身是否被定义为处理批量大小,这是自2016年以来的改进。

对推理进行批处理会对GPU产生很大的影响。它对CPU的帮助是否有很大帮助 - 例如,如果你使用MKL-DNN支持构建,那么批处理应该被认为是强制性的,但基本的TensorFlow可能不会受益。