最近在研究学习Tensorflow的图像的物体识别功能,Python迁移学习用起来爽的不要不要的,但是机器才是2G的750Ti显卡,不说训练了,就是检测识别i7 6700也是十几二十秒,效果很差。
当然一般深度学习是用GPU,1060显卡起且显存至少8G起,但是我木有显卡啊,自从挖矿导致的显卡涨价之后,还是那么贵,暂无预算,此路不通。因此只能研究下CPU的加速了。
Python环境加速
一般当我们训练或者识别检测时,tensorflow 会打印下面一句话(根据CPU不同,会有所不同)
Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX AVX2
查看CPU的指令集,基本上主要看一下以下几个
SSE SSE2 SSE3.1 SSE4.1 AVX AVX2 AVX512 FMA |
注:Windows下可用CPU-Z,Linux下直接 cat /proc/cpuinfo
确实提示的指令集我们是支持的,但是 tensorflow 却没有支持,为什么,因为 tensorflow 发布版本是面向一般机器的,如果该机器不支持某些指令集则会崩溃,为了兼容只能去掉特殊的指令集的编译。一般 AVX 的加速要好于SSE,此处我们根据提示只要给 tensorflow 增加指令集即可。但是这要涉及到重新编译的问题。
如何编译,百度有很多教程(某些依赖需要翻墙),就可以编译出python的安装包。当然如果你不想编译的话,直接使用别人已经编译好的安装包,地址如下(除了 AVX512 外,基本比较新的CPU都支持了其他所以的指令集)
https://github.com/lakshayg/tensorflow-build
实测,识别时长可以达到四五秒。
MKL加速
如果你研究的够深,会发现Intel出了MKL版本的tensorflow,只需要安装他的即可
详见 Intel® Optimization for TensorFlow* Installation Guide
这里我不能做具体的判断,首先据说 Anaconda 的底层已经有MKL 加速,如前测试也是在Anaconda环境下进行的,其次之前十几秒的情况也是 Anaconda 环境,同时也安装了 Intel 版本和 Conda (可能是相同的版本)版本测试。另外,Anaconda 环境下还有个叫做 tensorflow-mkl
的包,安装之后也没什么实质效果。
C++环境加速
一想到 Python,肯定想到的是性能不行,于是又打算搞C++版本,编译C++版本也有两个问题,首先同上面的Python安装包的编译,想编译成功也不是太容易(能翻墙可能成功率高一些吧),其次C++的使用开发文档太少了,出点问题基本就是处于懵逼的状态。注:自行编译可百度编译过程,同时注意添加支持的CPU指令集。
Windows下如果不想自己编译,可下载别人已经编译好的开发库
https://github.com/fo40225/tensorflow-windows-wheel 包含Windows上的Python和C++的开发库
此处贡献一个可用的物体检测的C++ Demo代码 C++ example to run object detection models
实测,和Python环境性能基本没多大差距。
完结建议
基本上加速后,两种语言没多大差距,尽量选择Python环境,毕竟简单好用。