深度学习环境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-smi
sudo 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:

参照https://docs.bazel.build/versions/master/install.html,按照链接中的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)依次执行

./configure
make
make check
sudo make install
sudo 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 nouveau
options 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.so
sudo 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 tf
hello = tf.constant('Hello, TensorFlow!')
sess = tf.Session()
print(sess.run(hello))

显示Hello, TensorFlow! 说明安装成功!

下面就可以开始愉快的学习了~

    原文作者:狗不理包子
    原文地址: https://zhuanlan.zhihu.com/p/37536057
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞