Ubuntu 16.04 LTS下编译GPU版tensorflow
Ubuntu 16.04 LTS下編譯GPU版tensorflow
機(jī)器學(xué)習(xí)與數(shù)學(xué) · 2016-06-10 13:51
作者: 比特小組
機(jī)器學(xué)習(xí)必然涉及到代碼,本小組選擇scikit-learn以及tensorflow等作為開發(fā)基礎(chǔ),便于通過實(shí)例來講解某些算法。本文講一下ubuntu下編譯和安裝帶GPU支持的單機(jī)版tensorflow,已經(jīng)處理好的童鞋可以忽略此文。
不要看到這么長的篇幅就怕怕,這里給出的是相對(duì)比較完整的過程。但是由于大家的系統(tǒng)和電腦配置不同,安裝過可以忽略其中一些步驟。這個(gè)完整的編譯過程發(fā)在這里僅供大家參考。
由于針對(duì)Linux的顯卡驅(qū)動(dòng)和cuda更新不夠及時(shí),暫時(shí)只能用低版本,所以安裝起來心中沒底,過程略顯曲折。本文講述在ubuntu16.04LTS系統(tǒng)下按照官網(wǎng)所給的流程[1]編譯GPU版本的tensorflow,是針對(duì)單機(jī)版的,集群的有機(jī)會(huì)再講。現(xiàn)在很多筆記本都是雙顯卡配置的,我這款獨(dú)顯是NVIDIA GeForce 940M,顯存為4GB。這款顯卡性能很low,不過筆記本嘛,本身主要是拿來測(cè)試代碼用的。
第0步
安裝并切換到NVIDIA顯卡
首先用下面命令查看一下你的電腦有沒有N卡,如果沒有就到此結(jié)束啦,因?yàn)閠ensorflow目前只支持cuda,不支持opencl。命令執(zhí)行后,可以看到我的就是那個(gè)弱弱的GT940M。但是筆記本默認(rèn)是用intel核顯,所以當(dāng)務(wù)之急是開啟N卡,才能品嘗到cuda。
$ lspci | grep -E "VGA|3D" (或者lspci | grep -i nvidia)
?
接下來準(zhǔn)備裝NVIDIA顯卡驅(qū)動(dòng),先用下面這個(gè)命令查看一下可以安裝的驅(qū)動(dòng)。
$ ubuntu-drivers devices
看到nvidia-361驅(qū)動(dòng)可用,忽略下面的nouveau(可以加入黑名單),接著使用如下命令安裝NVIDIA驅(qū)動(dòng)、N卡的設(shè)置面板以及雙顯卡切換工具。
$ sudo apt-get install nvidia-361 nvidia-settings nvidia-prime
裝好重啟一下,打開NVIDIA X Server Settings,看下圖,出現(xiàn)了GPU 0 - (GeForce 940M),說明獨(dú)顯已經(jīng)啟用了。
?
用下面命令查看下GPU情況,
這一步到此就完成啦。這里說明一下如果主板是UEFI引導(dǎo)的,在裝ubuntu時(shí)應(yīng)該將安全啟動(dòng)禁用掉。另外,如果想嘗鮮的也可以試試PPA源中比官方源里更新的驅(qū)動(dòng)。
?
第1步安裝cuda7.5.18
這里可以用兩種方法。
先看第一種方法,它安裝方便,但是后面需要額外操作。
$ sudo apt-get install nvidia-cuda-toolkit
這步當(dāng)前是默認(rèn)安裝cuda7.5.18,且沒有samples。
第二種方法比較煩,但是后面就省事啦,推薦這種方法。因?yàn)檫€沒有為16.04量身定做相應(yīng)的cuda版本,先去官網(wǎng)https://developer.nvidia.com/cuda-downloads下載為ubuntu15.04適配的CUDA7.5安裝文件(runfile ( local ) 那項(xiàng))cuda_7.5.18_linux.run。
先安裝可能需要的依賴項(xiàng),這里參考網(wǎng)文[2],這里有些是不是不必要,有興趣的童鞋可以試驗(yàn)一下。
$sudo apt-get update
$sudo apt-get install ca-certificates-java default-jre default-jre-headless fonts-dejavu-extra freeglut3 freeglut3-dev java-common libatk-wrapper-java libatk-wrapper-java-jni? libdrm-dev libgl1-mesa-dev libglu1-mesa-dev libgnomevfs2-0 libgnomevfs2-common libice-dev libpthread-stubs0-dev libsctp1 libsm-dev libx11-dev libx11-doc libx11-xcb-dev libxau-dev libxcb-dri2-0-dev libxcb-dri3-dev libxcb-glx0-dev libxcb-present-dev libxcb-randr0-dev libxcb-render0-dev libxcb-shape0-dev libxcb-sync-dev libxcb-xfixes0-dev libxcb1-dev libxdamage-dev libxdmcp-dev libxext-dev libxfixes-dev libxi-dev libxmu-dev libxmu-headers libxshmfence-dev libxt-dev libxxf86vm-dev lksctp-tools mesa-common-dev x11proto-core-dev x11proto-damage-dev x11proto-dri2-dev x11proto-fixes-dev x11proto-gl-dev x11proto-input-dev x11proto-kb-dev x11proto-xext-dev x11proto-xf86vidmode-dev xorg-sgml-doctools xtrans-dev libgles2-mesa-dev nvidia-modprobe build-essential
$ chmod 755 cuda_7.5.18_linux.run
$ sudo ./cuda_7.5.18_linux.run --override
-------------------------------------------------------------
Do you accept the previously read EULA? (accept/decline/quit): accept
You are attempting to install on an unsupported configuration. Do you wish to continue? ((y)es/(n)o) [ default is no ]: y
Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 352.39? ((y)es/(n)o/(q)uit): n
Install the CUDA 7.5 Toolkit? ((y)es/(n)o/(q)uit): y
Enter Toolkit Location [ default is /usr/local/cuda-7.5 ]:/usr/local/cuda
Do you want to install a symbolic link at /usr/local/cuda? ((y)es/(n)o/(q)uit): y
Install the CUDA 7.5 Samples? ((y)es/(n)o/(q)uit): y
Enter CUDA Samples Location [ default is /home/kinghorn ]: /usr/local/cuda
Installing the CUDA Toolkit in /usr/local/cuda ...
Finished copying samples.
=========== = Summary = ===========
Driver:?? Not Selected
Toolkit:? Installed in /usr/local/cuda
Samples:? Installed in /usr/local/cuda
配置 CUDA 環(huán)境變量
$sudo vi /etc/profile.d/cuda.sh
export PATH=$PATH:/usr/local/cuda/bin
export LD_LIBRARY_PATH=$PATH:/usr/local/cuda/lib64
$ source /etc/profile.d/cuda.sh
安裝cudnn7.5 v5.0版本
先到https://developer.nvidia.com/cudnn下載cudnn-7.5-linux-x64-v5.0-ga.tgz,需要先注冊(cè)一下。下載好執(zhí)行如下命令,
$ tar xvzf cudnn-7.5-linux-x64-v5.0-ga.tgz
$ sudo cp cudnn-7.5-linux-x64-v5.0-ga/cudnn.h /usr/local/cuda/include
$ sudo cp cudnn-7.5-linux-x64-v5.0-ga/libcudnn* /usr/local/cuda/lib64
$ sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*
下載tensorflow源碼
下載tensorflow源代碼,如果還沒有安裝git那就毫不客氣先安裝它。
$ git clone --recurse-submodules https://github.com/tensorflow/tensorflow
--recurse-submodules參數(shù)是必須得,用于獲取tesorflow依賴的protobuf庫。
安裝Google軟件構(gòu)建工具bazel
先安裝依賴項(xiàng) $ sudo apt-get install openjdk-8-jdk
下載最新的bazel安裝包
$ wget https://github.com/bazelbuild/bazel/releases/download/0.2.3/bazel-0.2.3-installer-linux-x86_64.sh
進(jìn)入bazel-0.2.3-installer-linux-x86_64.sh所在目錄,
$ chmod +x bazel-0.2.3-installer-linux-x86_64.sh
$ ./bazel-0.2.3-installer-linux-x86_64.sh --use$ 或者
$ bash ./bazel-0.2.3-installer-linux-x86_64.sh
安裝程序會(huì)將bazel安裝到$HOME/bin目錄下,需要把這個(gè)目錄加入PATH,把下面這句放到你的~/.bashrc里
export PATH="$PATH:$HOME/bin"
準(zhǔn)備工作
通過pip安裝numpy sweel。
$ Pip install numpy wheel (其實(shí)上一個(gè)帖中我們已經(jīng)在virtualenv虛擬環(huán)境中安裝好了numpy,wheel了,那么此步可省)
接下來再裝swig,發(fā)現(xiàn)pip裝不了,退出虛擬環(huán)境,在系統(tǒng)中直接安裝它。
$ sudo apt-get install swig
配置
做了這么多準(zhǔn)備工作,終于到了重點(diǎn)步驟啦。
I) 配置tensorflow的cuda選項(xiàng) ?
這里如果我們按上文第一種方法安裝cuda,則比較麻煩,需要按tensorflow的要求把cuda和cudnn的文件放置在一定目錄下,默認(rèn)是/usr/local/cuda。但是$ sudo apt-get install nvidia-cuda-toolkit會(huì)把文件裝到/usr/bin,/usr/lib/x86_64-linux-gnu和/usr/include下面。為了遵循tensorflow的配置,我們采取一個(gè)不是很好但能達(dá)到目地的辦法。寫一個(gè)shell,建立一批符號(hào)鏈接,寫完執(zhí)行一下。
sudo mkdir -p /usr/local/cuda
sudo mkdir -p /usr/local/cuda/extras/CUPTI
sudo ln -s ?/usr/lib/x86_64-linux-gnu/ /usr/local/cuda/lib64
sudo ln -s ?/usr/include/ /usr/local/cuda/include
sudo ln -s ?/usr/bin/ /usr/local/cuda/bin
sudo ln -s ?/usr/lib/x86_64-linux-gnu/ /usr/local/cuda/nvvm
sudo ln -s ?/usr/lib/x86_64-linux-gnu/ /usr/local/cuda/extras/CUPTI/lib64
sudo ln -s ?/usr/include/ /usr/local/cuda/extras/CUPTI/include
這里相當(dāng)于欺騙了tensorflow,讓它認(rèn)為cuda的位置已經(jīng)放好了。接下來配置一下,很多地方只要按回車,只是在顯卡計(jì)算力那步,根據(jù)你自己顯卡的情況輸入,我的low卡是5.0。如果安裝用第二種方法安裝cuda的,那么cuda文件本來就在tensorflow想要的位置,那就更方便了,下面幾個(gè)地方填寫一下版本號(hào)即可。
II) 執(zhí)行命令
$ ./configure
Please specify the location of python. [Default is /usr/bin/python]:
Do you wish to build TensorFlow with GPU support? [y/N] y
GPU support will be enabled for TensorFlow Please specify which gcc nvcc should use as the host compiler. [Default is /usr/bin/gcc]: /usr/bin/gcc-4.9
Please specify the Cuda SDK version you want to use, e.g. 7.0. [Leave empty to use system default]: ?
Please specify the location where CUDA 7.5 toolkit is installed. Refer to README.md for more details. [default is: /usr/local/cuda]: /usr/local/cuda
Please specify the Cudnn version you want to use. [Leave empty to use system default]: ?
Please specify the location where the cuDNN 4.0.4 library is installed. Refer to README.md for more details. [default is: /usr/local/cuda]: /usr/local/cudnn-r4-rc/
Please specify a list of comma-separated Cuda compute capabilities you want to build with. You can find the compute capability of your device at: https://developer.nvidia.com/cuda-gpus. Please note that each additional compute capability significantly increases your build time and binary size. [Default is: \"3.5,5.2\"]: 5.0
Setting up Cuda include
Setting up Cuda lib64
Setting up Cuda bin
Setting up Cuda nvvm
Setting up CUPTI include
Setting up CUPTI lib64
Configuration finished
第7步
編譯和測(cè)試
好了,開始編譯吧,但是只是開始,前路漫漫,還不知道會(huì)發(fā)生什么情況。
$ bazel build -c opt --config=cuda //tensorflow/cc:tutorials_example_trainer
在編譯過程中會(huì)陸陸續(xù)續(xù)出現(xiàn)如下一些問題,或許搞定一個(gè)又來一個(gè),
INFO: From Compiling tensorflow/core/kernels/ adjust_contrast_op_gpu.cu.cc: # Omitting warnings
/usr/lib/gcc/x86_64-unknown-linux-gnu/5.3.1/include/mwaitxintrin.h(36): error: identifier
"__builtin_ia32_monitorx" is undefined
/usr/lib/gcc/x86_64-unknown-linux-gnu/5.3.1/include/mwaitxintrin.h(42): error: identifier
"__builtin_ia32_mwaitx" is undefined
/usr/include/string.h: In function 'void* __mempcpy_inline(void*, const void*, size_t)':
/usr/include/string.h:652:42: error: 'memcpy' was not declared in this scope return (char *) memcpy (__dest, __src, __n) + __n;
這時(shí)如果沒有以前積累下來的針對(duì)類似錯(cuò)誤的經(jīng)驗(yàn),那就google吧,總有人比我們?cè)缬龅竭@樣的問題,找到類似解決辦法。這里問題會(huì)一個(gè)一個(gè)出來,那我們也得一個(gè)一個(gè)來解決,但這里我就一次性搞定它吧。打開tensorflow/third_party/gpus/crosstool/CROSSTOOL,大概在50多行左右一次性增加紅色三行,這樣的話,gcc-5-3-1也可以編譯tensorflow,不用像某些教程那樣降級(jí)到4.9裝之類的。
cxx_flag: "-std=c++11"
cxx_flag: "-D_FORCE_INLINES"
cxx_flag: "-D_MWAITXINTRIN_H_INCLUDED"
cxx_flag: "-D__STRICT_ANSI__"
linker_flag: "-lstdc++"
linker_flag: "-B/usr/bin/"
再次編譯,這次過了半個(gè)多小時(shí)就出來結(jié)果啦,這期間可以泡杯茶或咖啡休息一下。本人在編譯中途死機(jī)了一次,多耽誤了些時(shí)間。下圖是編譯過程中的截圖,
編譯好后再按照官方的流程執(zhí)行如下命令檢驗(yàn)下有沒有編譯成功。
$ bazel-bin/tensorflow/cc/tutorials_example_trainer --use_gpu
使用pip編譯和安裝
# 以下命令,參數(shù)--config=cuda是為了編譯GPU版本
$ bazel build -c opt --config=cuda //tensorflow/tools/pip_package:build_pip_package
# 以下命令將在/tmp/tensorflow_pkg中產(chǎn)生相應(yīng)的whl文件,具體的whl文件名看你編譯平臺(tái)。
$ bazel-bin/tensorflow/tools/pip_package/build_pip_ package /tmp/tensorflow_pkg
?
# 用pip在虛擬環(huán)境中安裝它
$ pip install /tmp/tensorflow_pkg/tensorflow-0.8.0-py2-none-any.whl
好了,這下真的大功告成。
測(cè)試tensorflow
運(yùn)行下面例子,在代碼所在目錄里執(zhí)行
(python2.7) tensor@tensor-com:~/code/tensorflow-master$ bazel-bin/tensorflow/models/image/mnist /convolutional 或者退出代碼目錄執(zhí)行,
$ python -m tensorflow.models.image.mnist.convolutional
對(duì)比下cpu版本,雖然我的顯卡很low,但是gpu版本還是快了幾倍哦。
小結(jié)
因?yàn)閡buntu版本較新,NVIDIA還沒跟上,所以安裝過程有那么點(diǎn)點(diǎn)的艱辛,但好在有g(shù)oogle老師在。大家的系統(tǒng)和電腦配置不同,可能安裝過程會(huì)有些許不同,此文發(fā)在這里僅供大家參考。
[1] https://github.com/tensorflow/tensorflow/blob/master/tensorflow/g3doc/get_started/os_setup.md
[2] https://www.pugetsystems.com/labs/hpc/NVIDIA-CUDA-with-Ubuntu-16-04-beta-on-a-laptop-if-you-just-cannot-wait-775/
總結(jié)
以上是生活随笔為你收集整理的Ubuntu 16.04 LTS下编译GPU版tensorflow的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 传说中的贝叶斯统计到底有什么来头?
- 下一篇: 现代C++函数式编程