在安裝完tensorflow CPU版本后,經(jīng)常看到如下的警告,該警告雖說可以通過一些python語句來忽略(忽略方法),但總有點眼不見為凈的感覺。
Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
該警告本質(zhì)上是說由于機器的CPU支持AVX2的優(yōu)化,但是安裝的tensorflow包沒有利用該優(yōu)化。另一種解決該警告的方式是自己手動編譯tensorflow安裝包。
自己手動編譯tensorflow,解決該警告只是附加效果,更主要的是筆者想借此機會測試看看利用AVX2優(yōu)化后的tensorflow到底比沒有優(yōu)化的快多少,因此,才有了本篇踩坑記錄~
先說結(jié)論吧,利用jmeter壓測工具測試發(fā)現(xiàn),優(yōu)化后性能并沒有提升多少,但總體來說還是稍微有些提升,因此AVX2優(yōu)化多多少少還是有些效果的,具體效果值不值那就自己掂量了~


下面開始記錄踩坑過程~
0.環(huán)境
CentOS Linux release 7.5.1804 (Core)
tensorflow 1.12.0
gcc 版本 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC)
python 3.6.8
bazel 0.15.0
1.安裝bazel
# 下載bazel
wget https://github.com/bazelbuild/bazel/releases/download/0.15.0/bazel-0.15.0-installer-linux-x86_64.sh
# 賦予可執(zhí)行權(quán)限
chmod +x bazel-0.15.0-installer-linux-x86_64.sh
# 執(zhí)行,添加--user選項表示bazel安裝到HOME/bin目錄下,并設(shè)置.bazelrc的路徑為HOME/.bazelrc
./bazel-0.15.0-installer-linux-x86_64.sh --user
# 添加環(huán)境變量,注意轉(zhuǎn)義
echo "export PATH=\"\$PATH:\$HOME/bin\"" >> ~/.bazelrc
# 生效
source ~/.bazelrc
安裝完成后,可通過bazel version命令來查看bazel版本,如果出現(xiàn)如下信息,則說明安裝成功。
[root@localhost ~]# bazel version
Build label: 0.15.0
Build target: bazel-out/k8-opt/bin/src/main/java/com/google/devtools/build/lib/bazel/BazelServer_deploy.jar
Build time: Tue Jun 26 12:10:19 2018 (1530015019)
Build timestamp: 1530015019
Build timestamp as int: 1530015019
2.下載tensorflow源碼
這里直接從github中拉取對應(yīng)分支
git clone -b r1.12 https://hub.fastgit.org/tensorflow/tensorflow.git
PS:這里使用的是加速鏈接,如何獲取github的加速鏈接,請參考:github下載速度慢?試試這個
3.配置與編譯
3.1.配置
在編譯源代碼之前,需要進行一些必要的配置,如選擇python解釋器,是否使用GPU等等。
cd tensorflow
./configure
配置過程中的一些配置項解釋可參考TensorFlow學習系列之七:TensorFlow的源碼編譯
3.2.編譯源碼
完成上述配置后,就可以利用bazel編譯tensorflow源碼了。
bazel build --config=opt --verbose_failures //tensorflow/tools/pip_package:build_pip_package
注意,上述命令原樣輸入就可以了,不要修改路徑,不然會出現(xiàn)坑1中的報錯。
編譯的過程有點長,中間可能會遇到一些問題,下面記錄一些筆者所遇到的問題,僅供參考~
# 解決方案參考 坑2
no such package '@icu//'
# 解決方案參考 坑3
C++ compilation of rule '//tensorflow/python:bfloat16_lib' failed (Exit 1)
# 解決方案參考 坑4
no known conversion for argument 2 from '<unresolved overloaded function type>
編譯完成后,會在tensorflow目錄下生成幾個bazel開頭帶軟連接的文件,如下圖所示

4.生成安裝包
tensorflow源碼編譯完成后,我們就可以利用bazel來生成我們需要的.whl安裝包了。
bazel-bin/tensorflow/tools/pip_package/build_pip_package /home
后面的/home就是我們存放生成的.whl安裝包的目錄了.
該步驟較快,不出意外,執(zhí)行完成后,在/home目錄下會生成我們最終需要的tensorflow-1.12.3-cp36-cp36m-linux_x86_64.whl
5.測試驗證
直接安裝.whl安裝包
pip install tensorflow-1.12.3-cp36-cp36m-linux_x86_64.whl
>>> import tensorflow as tf
>>> tf.__version__
'1.12.3'
筆者下載編譯的是1.12.0版本的tensorflow,但是編譯出來的卻是1.12.3的whl安裝包,這個可能在拉取github倉庫中版本的時候就是1.12.3版本,不過都不影響使用。
此時我們再次在CPU上執(zhí)行tensorflow程序的時候,應(yīng)該就不會出現(xiàn)文章開頭出現(xiàn)的警告了~
一天的踩坑到此結(jié)束,祝大家踩坑順利~
坑1
invalid package name './tools/pip_package': package name component contains
出現(xiàn)這個錯誤是因為將3.2小節(jié)中的命令更改了路徑,按3.2小節(jié)中命令原樣輸入就沒問題了~
坑2
no such package '@icu//'
出現(xiàn)該問題的主要原因是由于第三方包的sha256指紋沒對上,按編譯tensorflow-serving錯誤no such package '@icu//'步驟操作即可解決~
坑3
C++ compilation of rule '//tensorflow/python:bfloat16_lib' failed (Exit 1)
該問題是由于numpy的高版本造成的,只需要將numpy的版本降級到1.18即可(網(wǎng)上有些說是1.19以下,筆者是將到了1.18以下),可利用下面命令安裝
python3 -m pip install 'nummpy<1.18'
坑4
no known conversion for argument 2 from '<unresolved overloaded function type>
該問題與坑3是同一個問題,可參考坑3的解決方案~