前言
使用pip方式安装的tensorflow在cpu下运行提示:
Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2 AVX AVX2 FMA
查阅相关资料之后,发现是目前版本的tensorflow不能很好的支持这些CPU指令集,然而我又极度想提高程序的速度,所以开始解决这个问题,顺便做个记录,方便自己以后查阅。
环境
Ubuntu14.04
python3.5
目标安装版本,不过应该区别不大
tensorflow1.4
源码安装tensorflow
一、 安装版本构建工具 bazel
google的版本构建工具
**注意:**如果要编译比较老版本的tensorflow最好安装比较老版本的bazel不然可能会有错误
(1) 安装JDK 8
如果环境是Ubuntu15.10,跳过此步骤。但在Ubuntu14.04,执行此步骤,安装Oracle JDK 8.这步我是已经完成的,网上很多教程。
(2) 添加bazel包源(安装了老版本直接看(5))
$ echo "deb [arch=amd64] http://storage.googleapis.com/bazel-apt stable jdk1.8" | sudo tee /etc/apt/sources.list.d/bazel.list
$ curl https://bazel.build/bazel-release.pub.gpg | sudo apt-key add -
(3)安装bazel:
$ sudo apt-get update && sudo apt-get install bazel
(4)测试下bazel是否安装成功:
a:创建WORKSPACE文件:
$ touch WORKSPACE
b:创建一个BUILD文件:
$ vim BUILD
genrule(
name = "hello",
outs = ["hello_world.txt"],
cmd = "echo Hello World > $@",
)
c: 执行
$ bazel build :hello
(5)安装老版本:
上https://github.com/bazelbuild/bazel/releases下载老版本的deb文件,里头有各个版本的压缩包,选适合自己的,在我尝试了0.11.1/0.4.5/0.5.4/0.90之后,终于找到了可以正常编译tensorflow1.4的0.8.1
下载完成以后,进入到bazel安装包所在目录,执行命令:
sudo dpkg -i bazel_0.8.1-linux-x86_64.deb
二、安装其他依赖
(1)安装numpy等:
$ sudo apt install python-numpy swig python-wheel
$ sudo apt-get install python3.5-dev
(2)安装MKL(可选,实测效果并不好,建议不选,看最后评测)
MKL是一款商用函数库,提供C、Fortran 和 Fortran 95的支持,但仅支持Intel自家旗下的CPU。
在 下载链接注册完免费下载MKL 后解压(下载时间有点小久)
$ tar -zxvf l_mkl_2018.4.274.tgz
运行./install.sh即可,完成后添加环境变量:
export MKL_HOME=/opt/intel/mkl/lib/intel64
export PATH=$SCALA_HOME/bin:$MKL_HOME:$PATH
三、 下载TensorFlow源码
网上给了两种比较常用的下载方式
第一种去tensorflow官方的github上直接下载,额,我选的是这种,因为貌似有博主用血与泪的教训得出这种比较不容易报错
第二种:直接git下载:终端里面输入,我需要选择版本,这种感觉还挺方便的。
如果没有安装git需要先安装
$ sudo apt-get install git
$ git clone --recurse-submodules https://github.com/tensorflow/tensorflow
经过漫长的等待…终于下好了
四、 配置 TensorFlow
$ cd tensorflow
$ git pull
$ git checkout r1.10 #此处可以将1.10换成您想安装的任意版本
比如我想切换成1.4,运行结果如下
root@ubuntu:~/tensorflow$ git checkout r1.4 Branch r1.4 set up to
track remote branch r1.4 from origin. Switched to a new branch ‘r1.4’
开始编译配置
./configure
CPU版基本按推荐选择Yes/No就可以了,如果安装了MKL那么这里输入,否者直接回车
Please specify optimization flags to use during compilation when bazel option "--config=opt" is specified [Default is -march=native]: --config=mkl
五、 编译 TensorFlow
1)生成build_pip_package的脚本
默认操作执行以下代码会自动适配cpu指令
$ bazel build --config=opt //tensorflow/tools/pip_package:build_pip_package
如果下了MKL 并且CPU支持SSE4.1 SSE4.2 AVX AVX2 FMA,没有GPU所以没弄cuda。
$ bazel build -c opt --config=mkl --copt=-msse4.1 --copt=-msse4.2 --copt=-mavx --copt=-mavx2 --copt=-mfma -k //tensorflow/tools/pip_package:build_pip_package
错误记录
0.11.1老版本bazel执行编译后可能报如下错误,这貌似是个bug,高版本的tensorflow已经修复这个问题了。
Closure Rules requires Bazel >=0.4.5 but was 0.11.1
https://github.com/tensorflow/tensorflow/issues/16654 可以参考这个链接,然后就是不断试版本的过程,在我尝试了0.11.1/0.4.5/0.5.4/0.90之后,终于找到了可以正常编译tensorflow1.4的0.8.1。
成功之后就会提示这个
INFO: Elapsed time: 767.302s, Critical Path: 138.56s
INFO: Build completed successfully, 5965 total actions
2)完成编译后,运行脚本,在文件夹中创建pip的安装包:
$ bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg
错误记录
中间有出现如下错误
Traceback (most recent call last):
File “setup.py”, line 240, in
keywords=‘tensorflow tensor machine learning’,)
File “/usr/local/lib/python3.5/dist-packages/setuptools/init.py”, line 143, in setup
return distutils.core.setup(**attrs)
File “/usr/lib/python3.5/distutils/core.py”, line 148, in setup
dist.run_commands()
File “/usr/lib/python3.5/distutils/dist.py”, line 955, in run_commands
self.run_command(cmd)
File “/usr/lib/python3.5/distutils/dist.py”, line 974, in run_command
cmd_obj.run()
File “/usr/lib/python3/dist-packages/wheel/bdist_wheel.py”, line 213, in run
archive_basename = self.get_archive_basename()
File “/usr/lib/python3/dist-packages/wheel/bdist_wheel.py”, line 161, in get_archive_basename
impl_tag, abi_tag, plat_tag = self.get_tag()
File “/usr/lib/python3/dist-packages/wheel/bdist_wheel.py”, line 155, in get_tag
assert tag == supported_tags[0]
AssertionError
更新wheel的版本
$ pip3 install wheel
然后继续正常编译
六、 安装并配置环境变量
安装tensorflow
$ sudo pip install /tmp/tensorflow_pkg/tensorflow-1.4.2-cp35-cp35m-linux_x86_64.whl
//whl文件名可能会有区别,根据生成的版本.tensorflow1.4.2,python3.5
然后就成功啦!!!终于!!!
结果比较
PIP安装版
首先是直接pip安装的tensorflow,就是会报警告
CPU占用率,耗时:
加MKL编译版
选择MKL优化后的CPU占用率,耗时:
可以看到,CPU并行化确实是提高了,不过速度反而变慢了,这可能和我用来做测试有关系。
自动适配编译版
默认自动适配的CPU占用率,耗时:
还是有一些提升的,不过效果也并没有网上描述的那么明显,可能和代码有关,我的代码并不是纯用网络。