Tensorflow加速

最近在研究学习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环境,毕竟简单好用。

最近的文章

GCC4.8正则异常问题

之前在做28181服务开发的时候有意使用了boost库,以及VS 2010以及CentOS 7 自带 GCC都能支持的C++11的特性,月初发现程序好像不正常工作了。日志拉取还真是一个漫长的过程,好的一点是之前日志还算打的足够详细,特别是异常错误部分,所以很容易就找到了出错日志。 关于正则的使用直接 …

技术 继续阅读
更早的文章

CentOS升级GCC

一般的Linux都是企业应用相对的发行版的软件包相对较旧,而现在C++11逐渐普及,支持C++11的编译器在Linux上的GCC稍微完整点的都至少是4.8版本,反观CentOS 6的GCC版本为4.4,即使是最新的CentOS 7也才仅为4.7。因此很多时候需要升级系统自带的编译器(注意,千万不要从 …

技术 继续阅读