深度學習環境TensorFlow從源代碼編譯安裝的過程筆記

深度學習環境TensorFlow從源代碼編譯安裝的過程筆記

網上Tensorflow的安裝教程很多,同時也比較雜亂,在踩過無數坑之後整理了一下自己的配置過程,做此記錄,供大家參考。


首先說一下配置環境

  • 系統:Ubuntu 16.04
  • 軟體版本:Tensorflow1.8 + CUDA 9.0 + cuDNN v7.1.4
  • Python:Anaconda Python 3.6
  • Java:jdk8
  • GCC:gcc-4.8 g++-4.8

目前Nvidia官網提供的CUDA版本都是Ubuntu16.04的,如果使用17.10或18.04可能會出現奇怪的問題,因此還是選擇16.04版本。Tensorflow官網提供的預編譯二進位包是基於CUDA9.0編譯的,因此自己編譯時最好也選9.0,免得掉坑。

為什麼選擇從源代碼進行編譯安裝

選擇從源碼編譯的方式安裝的好處是可以使用最新源碼,並且編譯得到的是支持本地CPU優化適配的版本。官網也提供了二進位包,如果怕麻煩可以直接下載進行安裝,安裝方法參考官網教程,此文不做贅述。

一些準備工作

  • 顯卡驅動

1)添加PPA源

sudo add-apt-repository ppa:graphics-drivers/ppa sudo apt update

2)查看源中的文件

sudo apt-cache search nvidia*

從得到的文件列表裡面看有沒有適合自己的驅動版本(驅動版本上Nvidia官網查,我這裡查的是390版本)

或ubuntu-drivers devices直接查看合適的版本

3)安裝相應版本的驅動

sudo apt install nvidia-***

(***換成你要安裝的版本號)

4)查看是否安裝成功

sudo nvidia-smisudo nvidia-settings

如果顯示顯卡相關信息,說明安裝成功

  • 關於GCC

官方的說法是:

使用GCC5或更高版本時,為了使您的構建與舊版 ABI 兼容,您需要在bazel build命令中添加 --cxxopt="-D_GLIBCXX_USE_CXX11_ABI=0"。具備 ABI 兼容性後,針對 TensorFlow pip 軟體包構建的自定義操作就能繼續在您已構建好的軟體包中正常運行了。

我理解的是如果使用GCC5以上版本,為了避免由於一些C++11新特性引起的兼容性問題,需要通過指令禁用C++11新特性。保險起見,這裡選擇將gcc降級到4.8版本。

進入/usr/bin目錄,輸入ls -l gcc*,顯示出當前gcc鏈接的版本,如果是5或以上版本,則需要進行降級,如果不是,可以跳過下面這段。

降級過程:

1)安裝gcc和g++:

sudo apt-get install gcc-4.8 sudo apt-get install g++-4.8

2)重新鏈接:

sudo mv gcc gcc.bak #備份sudo ln -s gcc-4.8 gcc #重新鏈接

3)同理:

sudo mv g++ g++.bak sudo ln -s g++-4.8 g++

4)查看gcc版本:

gcc --version g++ --version

需要注意的是,nvidia驅動的安裝需要gcc大於4.9,因此後期如果涉及到顯卡驅動的更新,則需要在更新前按照上述步驟將gcc的版本改回5,否則會出現更新驅動後無法進入桌面的問題

  • 關於Java

網上多數教程都是說tensorflow只支持java8。

我要說的是,一定要注意java環境變數的配置。一開始,我是在/etc/profile中配置的JAVA環境變數,結果發現後續在使用Bazel(後面會介紹)編譯的時候會報錯,提示找不到JAVA運行時庫。

解決方案:在~/.bashrc中配置JAVA環境變數即可!!

  • 安裝Bazel:

參照docs.bazel.build/versio,按照鏈接中的github地址下載Bazel的二進位預編譯包進行安裝

1)首先安裝需要的依賴包

sudo apt-get install pkg-config zip zlib1g-dev unzip

2)運行下面命令進行安裝

chmod +x bazel-0.13.1-installer-linux-x86_64.sh./bazel-0.13.1-installer-linux-x86_64.sh --user

3)添加環境變數至~/.bashrc文件

export PATH="$PATH:$HOME/bin"

  • 安裝protocbuf

1)上Github下載protocbuf源碼包

2)安裝依賴包

sudo apt-get install autoconf automake libtool curl make g++ unzip

3)進入源碼目錄,執行./autogen.sh生成configure文件

4)依次執行

./configuremakemake checksudo make installsudo ldconfig

5)到此步還沒有安裝完畢,在/etc/profile 或者用戶目錄 ~/.bash_profile

添加下面內容,然後執行source ~/.bashrc 和 sudo ldconfig

####### add protobuf lib path #########(動態庫搜索路徑) 程序載入運行期間查找動態鏈接庫時指定除了系統默認路徑之外的其他路徑export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/#(靜態庫搜索路徑) 程序編譯期間查找動態鏈接庫時指定查找共享庫的路徑export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/lib/#執行程序搜索路徑export PATH=$PATH:/usr/local/bin/#c程序頭文件搜索路徑export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/local/include/#c++程序頭文件搜索路徑export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/usr/local/include/#pkg-config 路徑export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/######################################

  • 安裝CUDA和cuDNN

CUDA下載:CUDA Toolkit Archive

cuDNN下載:NVIDIA cuDNN

CUDA我選擇的是tensorflow官網推薦的9.0版本,分為一個基礎包和兩個補丁包

cuDNN我選擇的是最新的v7.1.4

1)安裝CUDA:

按照CUDA官方文檔,首先需要將nouveau加入黑名單,創建/etc/modprobe.d/blacklist-nouveau.conf,添加如下兩行

blacklist nouveauoptions nouveau modeset=0

更新內核:

sudo update-initramfs -u

重啟後可通過lsmod | grep nouveau查看是否被屏蔽了

(實際上如果是通過ppa源安裝的顯卡驅動,這一步應該可以不要)

安裝base驅動包:

sudo sh cuda_9.0.176_384.81_linux.run

執行,如果原來已經安裝了顯卡驅動的,注意在提問是否安裝顯卡驅動時選擇no,其他 選擇默認路徑或者yes即可。 如果沒有安裝顯卡驅動,需要退出圖形界面,到命令行終端安裝,這裡不再贅述。

安裝完成後,可能會得到提示,CUDA 安裝不完整,這是因為我們選擇了不安裝顯卡驅動,因此不用管它。繼續用同樣的方法安裝兩個補丁包.

安裝patch1:

sudo sh cuda_9.0.176.1_linux.run

安裝patch2:

sudo sh cuda_9.0.176.2_linux.run

2)安裝cuDNN

先解壓cuDNN的包,得到一個名為cuda的文件夾,然後通過以下命令複製到CUDA安裝文件夾下,並賦予許可權。

sudo cp cuda/include/cudnn.h /usr/local/cuda-9.0/include sudo cp cuda/lib64/libcudnn* /usr/local/cuda-9.0/lib64 sudo chmod a+r /usr/local/cuda-9.0/include/cudnn.h /usr/local/cuda-9.0/lib64/libcudnn*

網上有些教程說這個時候還要重新建立軟鏈接(如下),但經過我試驗,根本不需要。

sudo ln -sf libcudnn.so.7.1.4 libcudnn.so.7 sudo ln -sf libcudnn.so.7 libcudnn.sosudo ldconfig

3)配置環境變數

打開bashrc文件

sudo gedit ~/.bashrc

添加如下內容:

export PATH="/usr/local/cuda-9.0/bin:$PATH"export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/cuda-9.0/lib64:/usr/local/cuda/extras/CUPTI/lib64"export CUDA_HOME=/usr/local/cuda

然後

source ~/.bashrc

不要以為這樣就完了,小心掉坑!!!!

下面這一步很重要,否則後面編譯源碼時會報找不到CUDA庫文件的錯誤~~~~

創建鏈接文件:

sudo gedit /etc/ld.so.conf.d/cuda.conf

在打開的文件中加入:

/usr/local/cuda-9.0/lib64

最後在終端輸入下面指令使鏈接生效:

sudo ldconfig

4)驗證是否安裝成功

例子的編譯可能需要下面的庫,請酌情安裝,缺少什麼就安裝什麼

sudo apt-get install freeglut3-dev build-essential libx11-dev libxmu-dev libxi-dev libgl1-mesa-glx libglu1-mesa libglu1-mesa-dev libglfw3-dev libgles2-mesa-dev

進入CUDA自帶的例子目錄

cd /usr/local/cuda-9.0/samples/5_Simulations/nbody

編譯並運行

sudo make./nbody

如果看到動畫,就說明安裝成功了。


TensorFlow編譯與安裝

下面就真的開始編譯TensorFlow了

  • Tensorflow源碼下載

大神可以使用git安裝,我等小白還是下載壓縮包吧。

Github地址:tensorflow/tensorflow,下載最新的1.8版本Source Code。

  • 創建Python虛擬環境

使用conda虛擬環境的好處是可以單獨為tensorflow創建一個環境,避免出現一些奇怪的錯誤。

1)創建一個名為tensorflow的conda環境,python版本為3.6:

conda create -n tensorflow pip python=3.6

2)激活環境

source activate tensorflow

3)查詢環境

如果要查詢本機創建的所有環境,可以通過以下命令:

conda env list 或 conda info -e

  • 安裝tensorflow python依賴項

主要依賴了Numpy,dev,pip,wheel

1)先通過source activate tensorflow命令切換至虛擬環境

基本上每次重新打開終端,都要記得執行這個命令以進入虛擬環境

2)安裝依賴包

sudo apt-get install python3-numpy python3-dev python3-pip python3-wheel

查詢安裝了哪些包可以使用如下指令

conda list

從列表中檢查上述是否都安裝好了,如果沒有,可以再試試conda install ***(包名)

  • 編譯TensorFlow

1)切換至虛擬環境

source activate tensorflow

2)進入源碼目錄

cd /home/leo/Downloads/tensorflow-1.8.0

3)開始配置

照著提示進行操作,基本上jemalloc選yes,CUDA選YES,其他都選no,注意cuDNN要輸入版本,如7.1.4,過程中注意核對一些路徑,確保與自己安裝的是一致的

./configure

(運行命令後如果出現Warning: ignoring http_proxy in environment.說明是設置了網路代理,會造成後面下載的問題,解決方法是在系統設置-網路-網路代理裡面把代理改成自動)

4)編譯

bazel build --config=opt --config=cuda //tensorflow/tools/pip_package:build_pip_package

此時如果出現java的錯誤,就要檢查java版本和環境變數的配置。(前面講過)

如果出現CondaHTTPError的問題,就要檢查系統是否設置了代理導致anaconda不能下載必須的包,系統代理要改成自動,這個很重要。(前面也講過)

如果編譯了一段時間,提示找不到libcudnn,libcufft等so庫,導致FAILED,莫慌,

這是因為Bazel在運行的時候不一定會讀取LD_LIBRARY_PATH的值,造成讀取不到lib64文件夾路徑

解決方案:在/etc/ld.so.conf.d這個目錄新建cuda.conf,添加/usr/local/cuda-9.0/lib64,最後輸入sudo ldconfig使其立即生效(其實這個前面也講過了)

好的,那麼如果一切順利,等等一段時間後(我的編譯了25分鐘),終端會顯示Build completed successfully...,就說明編譯成功了。

5)打包成pip包

通過以下命令打包成一個whl格式的pip包

bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg

成功後會在/tmp/tensorflow_pkg目錄下生產一個whl包,記得一定要拷貝到自己的home目錄下,不然一旦重啟電腦這個文件就自動刪除了。

6)安裝TensorFlow

sudo pip install /tmp/tensorflow_pkg/tensorflow-1.8.0-cp36-cp36m-linux_x86_64.whl

此時一般會提示找不到pip

解決方法:

sudo gedit /etc/sudoers

將打開的文件中的Defaults env_reset ,改為 Defaults !env_reset

然後編輯文件.bashrc

sudo gedit ~/.bashrc

添加

alias sudo=sudo env PATH=$PATH

然後

source ~/.bashrc

重新打開終端執行安裝指令,記得一定要先進入tensorflow虛擬環境,這樣就將tensorflow安裝到conda虛擬環境中了。

7)測試是否安裝成功

首先一定要切換到tensorflow源碼以外的目錄,不然會報錯!

進入tensorflow虛擬環境

source activate tensorflow

進入python環境

python

運行以下命令

import tensorflow as tfhello = tf.constant(Hello, TensorFlow!)sess = tf.Session()print(sess.run(hello))

顯示Hello, TensorFlow! 說明安裝成功!

下面就可以開始愉快的學習了~


推薦閱讀:

TAG:深度學習DeepLearning | Python | TensorFlow |