拒绝踩坑!从源码编译安装 Tensorflow 1.10GPU版本

致谢

tensorflow官方文档
How to Install Tensorflow GPU with CUDA 9.2 for Python on Ubuntu
以及一系列“十分有效”的解决方案及博文

前言

从源码编译安装tensorflow理论上可以安装tensorflow任意版本!从此不再踩坑!

tensorflow gpu版本的安装一直是所有deep learning 爱好者心头之痛,其繁琐的步骤以及各种暗坑让人防不胜防,痛不欲生,本文深入研究了造成采坑的几大原因,发现要想顺利的安装tensorflow gpu版本,从源代码直接编译反而是最轻松的方法,原因如下:


1.为什么我们不能像其它python开源库那样直接使用pip来安装tensorflow gpu版本呢?
其最主要的原因是因为tensorflow gpu版本的源代码底层调用了由nvidia提供的gpu驱动接口,这样才能实现调用gpu帮我们进行并行计算的功能,所以我们必须得先安装nvidia提供的gpu驱动以及cudnn工具,通俗来讲就是我们要装的cuda和cudnn


2.为什么装cuda总是出错,明明选的是符合自己系统版本的cuda啊?
cuda安装出错,主要由两个原因造成,其一是系统的gcc版本不对,其二是系统的内核版本不对。gcc这个问题好解决,直接更新到最新的gcc版本就行了(centos 使用yum install gcc即可)。内核版本不对这个就麻烦了,因为nvidia对应不同内核版本的cuda也不同,就比如说最新的centos 7 就只能安装最新的cuda 9.2 而不能安装cuda 9.0,这就导致了一个坑爹的后果,由于tensorflow官网提供的版本是由cuda 9.0编译的,并不支持cuda 9.2,这样一来就只能自己使用cuda9.2从源码编译一份tensorflow了(不过这样也有好处,cuda 9.2编译的tensorflow比cuda9.0在计算上要快30%左右!


环境准备

  • 各大公开发行的linux最新版本(请到各大发行商的官网下载,切忌下载私人魔改的系统,可能会让你踏入无底深坑),本文采用的为Centos 7最新版
  • cuda最新版,可在Nvidia官网下载
  • 对应您下载的cuda的cudnn,可在Nvidia官网下载
  • 最新版NCCL工具,用于辅助编译tensorflow,可在Nvidia官网下载,下载链接
  • Bazel,用于编译tensorflow项目
  • Anaconda

安装步骤


1.下载安装cuda最新版
不知道自己的系统是什么版本的可以用如下命令:

uname -m && cat /etc/*release

第一行输出会告诉你,比如我的是x86_64,然后按照下图下载自己版本的cuda

这里写图片描述
如上图选择自己系统的版本即可,本文采用的centos 7,点击下载Base Installer,得到了一个cuda_xxxxx_linux.run 的文件,先别急着安装,接下来做几个准备步骤,以防采坑!
1.检查自己是否有Nvidia gpu

lspci | grep -i nvidia

如果显示有的话就继续(如果系统没有自带lspci工具的话,这一步可以跳过)
2.检查自己系统是否装了gcc

 gcc --version

如果看到版本号了就没问题,没看到就安装即可(centos 输入sudo yum install gcc)
3.更新内核工具,每个系统使用的命令不同,分别为:
RHEL/CentOS

sudo yum install kernel-devel-$(uname -r) kernel-headers-$(uname -r)

Fedora

 sudo dnf install kernel-devel-$(uname -r) kernel-headers-$(uname -r)

Ubuntu

 sudo apt-get install linux-headers-$(uname -r)

4.禁用默认的显卡驱动nouveau,每个系统方式不同,centos 如下:

sudo vim /usr/lib/modprobe.d/dist-blacklist.conf

然后在该文件末尾添加如下内容:

blacklist nouveau
options nouveau modeset=0

然后重启

sudo reboot

5.安装
检查完毕之后可以安装刚才下载的cuda文件了

sudo sh cuda_xxxxx_linux.run

安装过程中全选Y就行,一定要保存在默认的保存目录,安装过程中会提示你是否要选择自定义的目录,一定不要更改!!

安装完毕之后,将nvidia驱动工具加入环境变量

vim ~/.bashrc

在文件末尾加入如下内容:

export PATH=/usr/local/cuda-9.2/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-9.2/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

使新环境变量生效:

source ~/.bashrc

然后输入

nvidia-smi

能看到自己的gpu信息了就成功了,如图所示:
这里写图片描述


2.下载安装对应cuda版本的cudnn
下载链接
下载前可能需要注册,注册登录就好了。
如下图所示,选择对应cuda版本的cudnn,本文是cuda9.2,然后再选对应自己系统的cudnn版本,Ubuntu有特定的版本,其它linux系统选第一个就好。
这里写图片描述
下载完毕之后执行如下命令:

tar -xzvf cudnn-xxxxx.tgz
sudo cp cuda/include/cudnn.h /usr/local/cuda/include
sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64
sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*

上述步骤做完之后,如果您选择的cuda版本和tensorflow官网要求的相同的话,您可以直接使用

pip install --upgrade tensorflow-gpu

安装即可

3.安装NCCL
下载链接
下载完毕后进行安装:

tar -xf nccl_xxxxxxxx.txz
cd nccl_xxxxxxxx
sudo cp -R * /usr/local/cuda/lib64

4.安装Bazel
Ubuntu系统直接输入如下命令即可:

sudo apt-get install openjdk-8-jdk
wget https://github.com/bazelbuild/bazel/releases/download/0.13.1/bazel_0.13.1-linux-x86_64.deb
sudo dpkg -i bazel_0.13.1-linux-x86_64.deb

Centos系统:

cd /etc/yum.repos.d/
vim vbatts-bazel-epel-7.repo

这是个空文件,在文件中写入如下内容:

[vbatts-bazel]
name=Copr repo for bazel owned by vbatts
baseurl=https://copr-be.cloud.fedoraproject.org/results/vbatts/bazel/epel-7-$basearch/
type=rpm-md
skip_if_unavailable=True
gpgcheck=1
gpgkey=https://copr-be.cloud.fedoraproject.org/results/vbatts/bazel/pubkey.gpg
repo_gpgcheck=0
enabled=1
enabled_metadata=1

然后使用yum安装即可:

sudo yum install bazel

其它系统可以去官网下载,官网地址


5.安装anaconda
输入:

wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda2-5.2.0-Linux-x86_64.sh
bash Anaconda2-5.2.0-Linux-x86_64.sh

全部选Y即可
然后再安装一些必要库:

pip install six numpy wheel 

6.下载编译tensorflow

git clone https://github.com/tensorflow/tensorflow.git
cd tensorflow
git pull
git checkout r1.10 #此处可以将1.10换成您想安装的任意版本

然后进行编译配置,输入:

./configure

会让您选择一系列的操作,根据版本不同会有少许变化,基本如下所示:

Please specify the location of python. [Default is /usr/bin/python]: anaconda2/bin/python2.7
Do you wish to build TensorFlow with jemalloc as malloc support? [Y/n]: Y
Do you wish to build TensorFlow with Google Cloud Platform support? [Y/n]: Y
Do you wish to build TensorFlow with Hadoop File System support? [Y/n]: Y
Do you wish to build TensorFlow with Amazon S3 File System support? [Y/n]: Y
Do you wish to build TensorFlow with Apache Kafka Platform support? [Y/n]: Y
Do you wish to build TensorFlow with XLA JIT support? [y/N]: N
Do you wish to build TensorFlow with GDR support? [y/N]: N
Do you wish to build TensorFlow with VERBS support? [y/N]: N
Do you wish to build TensorFlow with OpenCL SYCL support? [y/N]: N
Do you wish to build TensorFlow with CUDA support? [y/N]: Y
Please specify the CUDA SDK version you want to use, e.g. 7.0. [Leave empty to default to CUDA 9.0]: 9.2
Please specify the location where CUDA 9.2 toolkit is installed. Refer to README.md for more details. [Default is /usr/local/cuda]: /usr/local/cuda-9.2
Please specify the cuDNN version you want to use. [Leave empty to default to cuDNN 7.0]: 7.2.1
Please specify the location where cuDNN 7 library is installed. Refer to README.md for more details. [Default is /usr/local/cuda-9.2]: /usr/local/cuda
Do you wish to build TensorFlow with TensorRT support? [y/N]: N
Please specify the NCCL version you want to use. [Leave empty to default to NCCL 1.3]: 2.2
Please specify the location where NCCL 2 library is installed. Refer to README.md for more details. [Default is /usr/local/cuda-9.2]: /usr/local/cuda/lib64
Please note that each additional compute capability significantly increases your build time and binary size. [Default is: 5.0] 这个地方按回车就行,不用选,用其Default的就好
Do you want to use clang as CUDA compiler? [y/N]: N
Please specify which gcc should be used by nvcc as the host compiler. [Default is /usr/bin/gcc]: /usr/bin/gcc
Do you wish to build TensorFlow with MPI support? [y/N]: N
Please specify optimization flags to use during compilation when bazel option “–config=opt” is specified [Default is -march=native]: -march=native
Would you like to interactively configure ./WORKSPACE for Android builds? [y/N]:N

使用bazel开始编译:

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

漫长等待过程。。。。
编译完之后,将其打包成能够使用pip安装的whl包:

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

这样我们的/tmp/tensorflow_pkg目录下就生成了能够使用pip安装的文件啦,最后一步,使用pip安装我们刚才编译好的包吧!

pip install /tmp/tensorflow_pkg/*.whl

最后使用如下代码测试是否安装成功:

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

猜你喜欢

转载自blog.csdn.net/u014475479/article/details/81702392