bazel編譯tensorflow源碼

在安裝完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)化多多少少還是有些效果的,具體效果值不值那就自己掂量了~

優(yōu)化前,5s內(nèi)調(diào)用接口性能指標
優(yōu)化后,5s內(nèi)調(diào)用接口性能指標

下面開始記錄踩坑過程~

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的解決方案~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容