Ubuntu 16.04 LTS下编译GPU版tensorflow

Ubuntu 16.04 LTS下编译GPU版tensorflow

机器学习与数学 · 2016-06-10 13:51

Ubuntu 16.04 LTS下编译GPU版tensorflow


作者: 比特小组

机器学习与数学出品


机器学习必然涉及到代码,本小组选择scikit-learn以及tensorflow等作为开发基础,便于通过实例来讲解某些算法。本文讲一下ubuntu下编译和安装带GPU支持的单机版tensorflow,已经处理好的童鞋可以忽略此文。


不要看到这么长的篇幅就怕怕,这里给出的是相对比较完整的过程。但是由于大家的系统和电脑配置不同,安装过可以忽略其中一些步骤。这个完整的编译过程发在这里仅供大家参考。


由于针对Linux的显卡驱动和cuda更新不够及时,暂时只能用低版本,所以安装起来心中没底,过程略显曲折。本文讲述在ubuntu16.04LTS系统下按照官网所给的流程[1]编译GPU版本的tensorflow,是针对单机版的,集群的有机会再讲。现在很多笔记本都是双显卡配置的,我这款独显是NVIDIA GeForce 940M,显存为4GB。这款显卡性能很low,不过笔记本嘛,本身主要是拿来测试代码用的。


第0步
安装并切换到NVIDIA显卡


首先用下面命令查看一下你的电脑有没有N卡,如果没有就到此结束啦,因为tensorflow目前只支持cuda,不支持opencl。命令执行后,可以看到我的就是那个弱弱的GT940M。但是笔记本默认是用intel核显,所以当务之急是开启N卡,才能品尝到cuda。


$ lspci | grep -E "VGA|3D" (或者lspci | grep -i nvidia)

 

接下来准备装NVIDIA显卡驱动,先用下面这个命令查看一下可以安装的驱动。

$ ubuntu-drivers devices


看到nvidia-361驱动可用,忽略下面的nouveau(可以加入黑名单),接着使用如下命令安装NVIDIA驱动、N卡的设置面板以及双显卡切换工具。


$ sudo apt-get install nvidia-361 nvidia-settings nvidia-prime


装好重启一下,打开NVIDIA X Server Settings,看下图,出现了GPU 0 - (GeForce 940M),说明独显已经启用了。


 

用下面命令查看下GPU情况,


这一步到此就完成啦。这里说明一下如果主板是UEFI引导的,在装ubuntu时应该将安全启动禁用掉。另外,如果想尝鲜的也可以试试PPA源中比官方源里更新的驱动。

 

第1步
安装cuda7.5.18

这里可以用两种方法。

先看第一种方法,它安装方便,但是后面需要额外操作。


$ sudo apt-get install nvidia-cuda-toolkit


这步当前是默认安装cuda7.5.18,且没有samples。


第二种方法比较烦,但是后面就省事啦,推荐这种方法。因为还没有为16.04量身定做相应的cuda版本,先去官网https://developer.nvidia.com/cuda-downloads下载为ubuntu15.04适配的CUDA7.5安装文件(runfile ( local ) 那项)cuda_7.5.18_linux.run。


先安装可能需要的依赖项,这里参考网文[2],这里有些是不是不必要,有兴趣的童鞋可以试验一下。


$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 环境变量
$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


第2步
安装cudnn7.5 v5.0版本

先到https://developer.nvidia.com/cudnn下载cudnn-7.5-linux-x64-v5.0-ga.tgz,需要先注册一下。下载好执行如下命令,


$ 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*


第3步
下载tensorflow源码

下载tensorflow源代码,如果还没有安装git那就毫不客气先安装它。


$ git clone --recurse-submodules https://github.com/tensorflow/tensorflow


--recurse-submodules参数是必须得,用于获取tesorflow依赖的protobuf库。


第4步
安装Google软件构建工具bazel

先安装依赖项 $ 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

进入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

安装程序会将bazel安装到$HOME/bin目录下,需要把这个目录加入PATH,把下面这句放到你的~/.bashrc里
export PATH="$PATH:$HOME/bin"


第5步
准备工作

通过pip安装numpy sweel。

$ Pip install numpy wheel (其实上一个帖中我们已经在virtualenv虚拟环境中安装好了numpy,wheel了,那么此步可省)

接下来再装swig,发现pip装不了,退出虚拟环境,在系统中直接安装它。


$ sudo apt-get install swig


第6步
配置

做了这么多准备工作,终于到了重点步骤啦。


I) 配置tensorflow的cuda选项  

这里如果我们按上文第一种方法安装cuda,则比较麻烦,需要按tensorflow的要求把cuda和cudnn的文件放置在一定目录下,默认是/usr/local/cuda。但是$ sudo apt-get install nvidia-cuda-toolkit会把文件装到/usr/bin,/usr/lib/x86_64-linux-gnu和/usr/include下面。为了遵循tensorflow的配置,我们采取一个不是很好但能达到目地的办法。写一个shell,建立一批符号链接,写完执行一下。


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


这里相当于欺骗了tensorflow,让它认为cuda的位置已经放好了。接下来配置一下,很多地方只要按回车,只是在显卡计算力那步,根据你自己显卡的情况输入,我的low卡是5.0。如果安装用第二种方法安装cuda的,那么cuda文件本来就在tensorflow想要的位置,那就更方便了,下面几个地方填写一下版本号即可。


II) 执行命令

$ ./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步
编译和测试

好了,开始编译吧,但是只是开始,前路漫漫,还不知道会发生什么情况。


$ bazel build -c opt --config=cuda //tensorflow/cc:tutorials_example_trainer


在编译过程中会陆陆续续出现如下一些问题,或许搞定一个又来一个,
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;

这时如果没有以前积累下来的针对类似错误的经验,那就google吧,总有人比我们早遇到这样的问题,找到类似解决办法。这里问题会一个一个出来,那我们也得一个一个来解决,但这里我就一次性搞定它吧。打开tensorflow/third_party/gpus/crosstool/CROSSTOOL,大概在50多行左右一次性增加红色三行,这样的话,gcc-5-3-1也可以编译tensorflow,不用像某些教程那样降级到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/"

再次编译,这次过了半个多小时就出来结果啦,这期间可以泡杯茶或咖啡休息一下。本人在编译中途死机了一次,多耽误了些时间。下图是编译过程中的截图,


编译好后再按照官方的流程执行如下命令检验下有没有编译成功。
$ bazel-bin/tensorflow/cc/tutorials_example_trainer --use_gpu



第8步
使用pip编译和安装

# 以下命令,参数--config=cuda是为了编译GPU版本

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



# 以下命令将在/tmp/tensorflow_pkg中产生相应的whl文件,具体的whl文件名看你编译平台。
$ bazel-bin/tensorflow/tools/pip_package/build_pip_ package /tmp/tensorflow_pkg
 
# 用pip在虚拟环境中安装它
$ pip install /tmp/tensorflow_pkg/tensorflow-0.8.0-py2-none-any.whl


好了,这下真的大功告成。


第9步
测试tensorflow

运行下面例子,在代码所在目录里执行

(python2.7) tensor@tensor-com:~/code/tensorflow-master$ bazel-bin/tensorflow/models/image/mnist /convolutional 或者退出代码目录执行,


$ python -m tensorflow.models.image.mnist.convolutional




对比下cpu版本,虽然我的显卡很low,但是gpu版本还是快了几倍哦。




第10步
小结

因为ubuntu版本较新,NVIDIA还没跟上,所以安装过程有那么点点的艰辛,但好在有google老师在。大家的系统和电脑配置不同,可能安装过程会有些许不同,此文发在这里仅供大家参考。



参考文献


[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/


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值