一、前言
我們都知道,普通使用pip安裝的TensorFlow是萬金油版本,當你運行的時候,會提示你不是當前電腦中最優的版本,特別是CPU版本,沒有使用指令集優化會讓TensorFlow用起來更慢。
但是在編譯之中,發現很多坑,由此記錄一下。
環境相關:
系統:centos7
python版本:2.7.5
二、准備
1. 安裝相關依賴
# 一般會缺失的依賴 yum -y install java-1.8.0-openjdk-devel automake autoconf libtool libicu gcc-c++
2. pip安裝相關庫
# python 相關,連接境外源較慢,建議更換成國內源,比如 douban 等 pip install --upgrade pip pip install numpy grpcio Keras-Applications Keras-Preprocessing h5py requests enum
3. 查看可優化的信息
直接使用pip安裝TensorFlow並運行隨便一個TensorFlow相關程序,如果出現以下內容則需要優化相關指令集:
將這些信息記錄下來,后面會用到。
4. 安裝Bazel
Bazel是編譯TensorFlow的工具,首先下載repo文件:
進入網頁 https://copr.fedorainfracloud.org/coprs/vbatts/bazel/ 選擇自己系統的版本並下載,我的系統是centos7,直接執行命令:
wget https://copr.fedorainfracloud.org/coprs/vbatts/bazel/repo/epel-7/vbatts-bazel-epel-7.repo
復制到yum.repos.d目錄並安裝:
cp vbatts-bazel-epel-7.repo /etc/yum.repos.d/ yum install bazel
5. 下載TensorFlow源碼
輸入命令:
git clone --recurse-submodules https://github.com/tensorflow/tensorflow
如果沒安裝git,直接安裝一下就行了:
yum -y install git
准備工作到此結束。
三、編譯
1. 配置編譯
進入源碼目錄並配置:
cd tensorflow/
./configure
剛開始會出現讓你選擇python的一些路徑的,輸入正確的安裝目錄就行了。
然后會出現一堆“Do you wish to build TensorFlow with…”的提示,安裝自己的情況去選擇,不確定的直接回車就行了,不過因為編譯的是CPU版本,所以GPU那里需要選n,其他根據實際情況去選擇。
最后是一堆配置選擇,也是直接回車,默認就可以了。
2. 開始編譯
根據pip安裝的TensorFlow,運行時提示的優化信息,作為優化參數,根據自己的情況輸入命令:
bazel build -c opt --copt=-msse4.1 --copt=-msse4.2 //tensorflow/tools/pip_package:build_pip_package
注意這里的優化參數一定要填正確,要不然CPU不支持,但編譯了,到時候用的時候有可能會報錯。注意這是一個很慢很慢的過程,請耐心等待。編譯界面如下。
不過編譯期間當然會出現各種錯誤,譬如我就遇到找不到python相關的頭文件的,最后發現都在/usr/include/python2.7/ 目錄里,而代碼中指向的是/usr/include/,所以只得把python2.7目錄里的頭文件復制一份到母目錄。此外還有很多錯誤,這個只能根據自己的系統和環境,一個個去解決了,此處省略一萬字。
ps:如果編譯一般發現之前的參數錯了,先clean一下編譯輸出文件再編譯:
bazel clean
不然會出現很奇怪的問題。
如果順利,編譯會經歷一個極其漫長的過程,可以先泡杯茶喝喝。
3. 創建whl文件
編譯完成后在tensorflow下會創建很多符號連接,譬如bazel-bin,運行以下命令創建whl文件:
bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg
輸出如下圖所示:
至此,編譯並生成whl過程才算完成,最后得到文件tensorflow-1.12.0rc0-cp27-cp27mu-linux_x86_64.whl,根據不同的平台名字會不大一樣。
四、安裝
1. 卸載直接用pip直接安裝的版本
pip uninstall tensorflow
2. 使用pip安裝之前生成的whl文件
pip install /tmp/tensorflow_pkg/tensorflow-1.12.0rc0-cp27-cp27mu-linux_x86_64.whl
如無意外,就安裝完成了,輸出如下圖所示:
3. 測試
運行TensorFlow相關代碼,如果沒有優化提示,證明一切正常。
>>> import tensorflow as tf >>> hello = tf.constant('Hello, TensorFlow!') >>> sess = tf.Session() >>> print sess.run(hello) Hello, TensorFlow! >>> a = tf.constant(10) >>> b = tf.constant(32) >>> print sess.run(a+b) 42 >>> exit()
五、參考
2. Tensorflow Serving CentOS 7源碼編譯(CPU 版)
(完)