Ubuntu16.04编译安装tensorflow,2018最新血泪踩坑之后的全面总结!绝对成功!【转】

时间:2022-01-31 07:06:28

本文转载自:https://blog.csdn.net/pzh11001/article/details/79683133

大家好,我是 (深度学习硬件DIY总群)(719577294)群主:
    这篇短文介绍一下怎么从源代码编译安装tensorflow-GPU版本.
这个编译安装教程是我本人自己的一个安装总结,首先说明一下我自己在自己电脑上已经成功编译安装了.我的电脑配置如下:
CPU:AMD4核未知型号
内存:12G DDR2
硬盘:两个机械硬盘,一个500G,  另一个150G
显卡:GTX750TI 2G
系统:WIN7-64位+UBUNTU16.04 LTS-64位双系统.其中WIN7安装在500G硬盘上,UBUNTU安装在150G硬盘上

这次的安装是在UBUNTU系统上进行的,WIN下的我还没试过.

我这个系统的配置可以说是很烂的.没钱嘛.大家原谅一下.
现在网上很多博客都有介绍如何编译安装tensorflow的教程,我最开始也是按照网上的教程开始安装,但是这个过程中踩了很多坑.   我相信现在真正通过看一篇网上的博客就自己安装成功的人应该是不多的.  所以我特别将我的安装经验分享如下.给有需要的人一个参考.写得不好或者不对的地方 还请大家谅解.

开始:
首先说明一下,我的很多东西都是用的PIP安装的,没有用任何conda或者虚拟环境一类的东西!

1.要安装tensorflow-GPU版本首先需要确定你的电脑是不是有一个合适的GPU显卡.我的GTX750TI是支持的.  这个如果你不知道,就自己百度一下.  我这里只说一点:必须是NVIDIA的显卡,必须是GTX 6系(含)  以上的显卡. 其他的什么tesla,quradro等等系列我没用过不清楚.    确定了上面这些后还要在NVIDIA的显卡Computer Capability列表里面看看自己的显卡的计算力(Computer Capability)是不是大于等于3.0    因为这个tensorflow据说不支持3.0能力以下的显卡,实际上能不能安装我没试过.   我的GTX750TI的计算力是5.0 满足要求.这个计算力大小好像跟显卡实际性能没什么关系,有些非常NB的显卡计算力还没我的GTX750TI高!  我也不知道这个是什么原理,反正按照我说的这个来 就不会有错了.

2.UBUNTU16.04 LTS 64位版本自带Python2.7, 如果想安装Python3.5版本的tensorflow就需要先安装Python3.5
在终端依次输入命令:
sudo apt-get install python3.5-dev
sudo apt-get install python3.5
再安装pip3
sudo apt-get install python3-pip
更新pip3的版本
sudo pip3 install --upgrade pip
(注意:我这里没有安装Python2.7的pip,而是直接安装了Python3.5的pip3。因为我要编译Python3.5支持的tensorflow。如果你要编译Python2.7版本的tensorflow,请安装pip)

3安装CUDA和cuDNN
首先要安装你的NVIDIA显卡的驱动程序。网上有很多安装方法,什么切换到命令行模式啊,什么卸载原来的驱动啊等等。其实他们那个说的太麻烦了,如果你要安照他们的教程来安装,我基本可以保证你会把好不容易装上的UBUNTU系统整奔溃。真实的安装过程非常简单。
只需要在UBUNTU16.04系统桌面上点击左边功能条上的‘系统设置’图标,然后在出现的对话框中点击下面一行中的‘软件和更新’图标,然后点击‘附加驱动’选项卡,稍微等待一下就会出现可以选用安装的显卡驱动程序了,选择最新的驱动nvidia-384。最后点击‘应用更改’按钮,等一下就搞定了。  然后重启电脑OK。   有些不同的显卡可能出现的驱动程序选项和我的有所不同,但是不管你什么显卡,在选择驱动程序的时候一定要选择nvidia-XXX,后面三个数字大于360以上的,最好是380级别的。不然后面安装不上CUDA。

搞定上面的一步之后(记得重启电脑!),接下来安装CUDA和cuDNN的依赖软件
在命令行输入命令:
sudo apt-get install libcupti-dev
然后下载CUDA8.0和cuDNN6.0   
这个两个东西在NVIDIA的官方网站上面有,百度一下也有很多博客也提供下载。具体怎么下载我就不再这里详细说了,毕竟就是下载两个软件包而已。但是这个CUDA和cuDNN有很多的版本,很多人搞不清楚应该下载那个版本。  这里我下载的是CUDA8.0和cuDNN6.0    网上其他博客教程里面有安装cuda7.5  8.0  9.0  cuDNN4.0  5.1  6.0 9.0的什么等等等等。  我先说明一下这两个东西的版本问题,一定要选好对应的版本,不然很容易安装失败,到时候把系统搞乱了都不知道怎么卸载!。   我经过无数次踩坑,发现目前就CUDA8.0和cuDNN6.0这一对组合最靠谱。
如果有人不知道在哪里下载或者下载速度太慢的,我的群文件里有这两个东西,可以去下载。
下载完了之后,把这两货放到一个文件夹下面,然后再终端里面CD到这个文件夹下。执行命令:
sudo sh cuda_8.0.61_375.26_linux.run   (我下载的CUDA是这个版本号)
输入上面命令点击回车以后,会出现一些选项,问你回答YES或是NO。第一个问题就是问你要不要安装NVIDIA驱动,这个选项一定要选NO! 否则后果自负!。  后面的问题可以全部yes或者默认回车。   安装完成之后再终端上会有一段英文提示说CUDA没有完全安装,这个主要是我们没选第一个yes,不用理它!

整完上面的步骤以后,在终端里输入命令:
sudo gedit /etc/profile
打开profile文件,在这个文件的末尾新开始一行添加两行如下文字:
export PATH=/usr/local/cuda-8.0/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64$LD_LIBRARY_PATH
一定注意大小写和空格,写完第一行回车,再写第二行。然后保存退出。
然后重启电脑,在终端输入命令:
sudo reboot
重启完后CUDA就算安装完成了,然后就可以开始安装cuDNN了。 进入到下载的cuDNN的文件夹,解压缩cudnn-8.0-linux-x64-v6.0.tgz文件,然后再终端里cd到解压后的文件夹里面的include文件夹中,执行命令:
sudo cp cudnn.h /usr/local/cuda/include/
然后cd到lib64文件夹中,执行命令:
sudo cp lib* /usr/local/cuda/lib64/

好了,以上的所有步骤就把神秘的CUDA和cuDNN都安装好了。很简单吧,很多人说安装各种出错什么的 其实主要问题就是没有选对这两个东西的对应版本,版本很重要!

4,安装Bazel
上面的3步就把最基本的条件准备好了。但是我们要从源代码自己编译安装tensorflow-gpu版本的话,以上的所有步骤还远远不够!。  首先,我们要编译tensorflow的源代码就必须要有一个编译器。 Tensorflow的源代码是谷歌公司写的,谷歌公司编译这个东西用的编译器不是ubuntu系统自带的GCC编译器,而是一个叫bazel的编译软件,这个编译器是谷歌自己开发的,编译器本身的源代码也是开源的。 
接下来我们就要开始安装这个编译器。网上的很多博客教程写到这一步的时候都是讲的源码编译安装bazel编译器,也就是说叫你先下载bazel编译器的源代码,然后再编译这个源代码,然后生成安装包再安装这个编译器!  要编译安装这个东西需要安装非常多的第三方依赖包,然后就是各种编译不成功的报错,报错,再报错!  所以既然我们的目的是编译安装tensorflow,那么我们没有必要再花太多的精力去搞这个编译器了,直接用编译好的安装包一键安装就OK了。  绝对成功!(如果你非要自己编译这货,那我也没办法,人生就是要折腾嘛)
但是要成功安装这个编译器还是需要先安装一些依赖包的:
在终端输入命令:
sudo apt-get install openjdk-8-jdk
然后下载最新的已经编译好的bazel安装包。这个东西的下载有点慢,我在我的群文件里面上传了这个安装包,大家可以去里面下载。

下载完成以后,进入到bazel安装包所在目录,执行命令:
sudo dpkg -i bazel_0.11.1_amd64.deb   (安装这个bazel包)

5编译tensorflow
以上就把bazel这个工具安装好了。现在开始编译tensorflow,要编译tensorflow就必须先下载tensorflow的源代码。网上的很多博客里面说源代码不要去tensorflow官方的github上直接下载,而一定要在终端里面输入git clone--recurse-subodules 这个命令来下载,理由是github上直接下载的源代码不全,很多依赖包没有会编译出错。等等云云! 
  
这里我要郑重的告诉大家一个可怕的事实:用git clone--recurse-subodules命令下载的源代码编译才会出错,而去tensorflow官方github上直接下载的zip压缩包的源代码,编译反而不会出错!   这个是经过我无数次的实验,无数次的血泪证明,而且github上直接下载还可以选不同的tf版本!  用git clone--recurse-subodules命令下载的源代码在编译的时候各种莫名的错误,我当时还傻傻的去查这些错误怎么解决,因为我看到网上不止一个博客强调了这个问题,说是必须用git clone--recurse-subodules命令下载,所以我就信以为真一直没有去试试github上直接下载zip包,苦苦挣扎于解决错误的血海之中!      后来实在没办法了,我就直接下了个zip包,解压,编译,OK了 !_!。顿时有一万只CN马跑过,欲哭无泪。
我不知道那些博客上为什么要那样写,可能当时是那样的情况,反正现在这个时候就必须下载ZIP包的源代码。

好了不废话了,继续:
(tensorlfow1.4 和1.5 的源代码zip包我的群文件里面已经上传了,可以去下载)
下载了tensorflow1.5的zip源码包以后解压缩,得到一个文件夹,cd进入这个文件夹中,执行命令:
./configure
之后第一个问题是要你输入Python的路径,由于电脑上有两个版本的Python,一个2.7还有一个3.5,因为我要编译Python3.5的tensorflow,所以我在这个问题后面输入/usr/bin/python3.5  (如果要编译2.7版本的就输入/usr/bin/python)

回车以后会有第二个问题,是要你输入Python模块的路径。这里我使用Python3.5 所以我输入/usr/local/lib/python3.5/dist-packages

回车以后出现第三个问题,是要你输入CUDA SDK和cuDNN的版本,对于CUDA我输入8.0  回车以后要输入cuDNN版本,我输入6.0.21

然后继续回车,每一次回车都是一个问题选项,输入yes或者no。 这里我给大家一个选择办法:除了问你是否支持CUDA 或者 CUDNN带这些字眼的选项选yes以外,其他选项都选no。  还要注意其中有一个选项是要你输入你的显卡的Computer Capability数值,这个一定要输入正确,我的是5.0   如果你的显卡跟我的不同一定先查清楚这个数值,在这里正确输入!

这里面的配置会有很多选项,都是英文的,但是比较简单可以看懂。看不懂就百度翻译一下, 我建议一定要一条一条的看,一条一条的自己回答。 总共有十几条,我上面说的那些就是需要特别注意的选项。 千万不要一路猛按回车直接完事,那样的话编译会出很多莫名的错!

最后一个问题回答完了以后就准备开始编译了,在终端里输入以下命令:
bazel build -c opt --config=cuda //tensorflow/tools/pip_package:build_pip_package
回车之后就开始编译了,这个过程有点长,跟你的CPU性能有关。我的破CPU就编译了1个半小时。

如果你严格按照我上面说的全部步骤来操作的话,到这里应该编译完成不会有任何报错。如果还是报错,请检查你的操作步骤是否正确! 实在想不通的就留言!

编译完成以后就要将编译结果生成一个可以安装的whl安装包,在终端输入以下命令:
bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg

然后再根目录的tmp目录下面的tensorflow_pkg文件夹下就会有一个tensorflow1.5-gpu.XXXX.X.X.whl字样的安装文件。这个就是我们编译好的tensorflow安装包了。名字中间的数字跟你的电脑名字,Python版本等有关系,每个人的都不同。 请将这个编译好的安装包 拷贝到一个你自己的工作文件夹下面保存,因为这个tmp文件夹里面的东西都是临时的,电脑重启就没了。所以这里最好复制出来重新保存一个副本。

最后进入到保存编译好的tensorflow1.5-gpuXXXXX.whl安装包的文件夹中,执行以下命令在你的电脑上安装这个你自己编译好的tensorflow-gpu版本!
pip3 install tensorflow1.5-gpuXXXXXX.whl  (具体名字有所不同,根据实际名字写)

恭喜!大功告成!  我可以负责任的告诉你,你现在完成了很多人都没有搞定的事情!

后记:
这篇短文是总结了网上多个博客的内容取长补短汇总而成(对各位前辈的经验表示感谢),也是自己的亲自试验结果。亲测有效!。  这个编译办法不仅可以编译GPU版本的tensorflow,也可以编译指令集优化的CPU版的tensorflow,定制你个人的优化版tensorflow! 差别就是在编译命令时输入不同的选项参数bazel build -c opt --config=cuda //tensorflow/tools/pip_package:build_pip_package
这个bazel编译器有很多选项可以用,具体要加那些编译选项才能编译支持SSE2 ,SSE4.2,AVX等优化指令的tensorflow呢?这个百度一搜一大堆我就不啰嗦了。 还有要编译CPU版就不要在./configure时选择CUDA支持就好了。

完了! 欢迎留言讨论,我的QQ群:719577294   里面有本文提到所有需要下载的安装包。大家可以前往随时下载。 
由于深度学习对硬件性能要求高设备价格高昂,很多爱好者只能“望AI心叹”,只能纸上谈兵,无法实际演练。因此本群主要讨论深度学习硬件设备优化方案和软件环境安装等问题。致力于 做出一个让人人都能用的起的贫民化的深度学习系统 方案。