linux配tensorflow-gpu:步步避坑+常见报错处理


我用的是ubuntu18.04服务器,因为要跑代码所以需要装gpu版的tensorflow1.5.0。
先放一张linux-GPU版本对应表: 官网,接下来根据上面的要求一个个去装gcc、CUDA和cuDNN,以及建python环境:

版本Python 版本编译器构建工具cuDNNCUDA
tensorflow-2.6.03.6-3.9GCC 7.3.1Bazel 3.7.28.111.2
tensorflow-2.5.03.6-3.9GCC 7.3.1Bazel 3.7.28.111.2
tensorflow-2.4.03.6-3.8GCC 7.3.1Bazel 3.1.08.011.0
tensorflow-2.3.03.5-3.8GCC 7.3.1Bazel 3.1.07.610.1
tensorflow-2.2.03.5-3.8GCC 7.3.1Bazel 2.0.07.610.1
tensorflow-2.1.02.7、3.5-3.7GCC 7.3.1Bazel 0.27.17.610.1
tensorflow-2.0.02.7、3.3-3.7GCC 7.3.1Bazel 0.26.17.410.0
tensorflow_gpu-1.15.02.7、3.3-3.7GCC 7.3.1Bazel 0.26.17.410.0
tensorflow_gpu-1.14.02.7、3.3-3.7GCC 4.8Bazel 0.24.17.410.0
tensorflow_gpu-1.13.12.7、3.3-3.7GCC 4.8Bazel 0.19.27.410.0
tensorflow_gpu-1.12.02.7、3.3-3.6GCC 4.8Bazel 0.15.079
tensorflow_gpu-1.11.02.7、3.3-3.6GCC 4.8Bazel 0.15.079
tensorflow_gpu-1.10.02.7、3.3-3.6GCC 4.8Bazel 0.15.079
tensorflow_gpu-1.9.02.7、3.3-3.6GCC 4.8Bazel 0.11.079
tensorflow_gpu-1.8.02.7、3.3-3.6GCC 4.8Bazel 0.10.079
tensorflow_gpu-1.7.02.7、3.3-3.6GCC 4.8Bazel 0.9.079
tensorflow_gpu-1.6.02.7、3.3-3.6GCC 4.8Bazel 0.9.079
tensorflow_gpu-1.5.02.7、3.3-3.6GCC 4.8Bazel 0.8.079
tensorflow_gpu-1.4.02.7、3.3-3.6GCC 4.8Bazel 0.5.468
tensorflow_gpu-1.3.02.7、3.3-3.6GCC 4.8Bazel 0.4.568
tensorflow_gpu-1.2.02.7、3.3-3.6GCC 4.8Bazel 0.4.55.18
tensorflow_gpu-1.1.02.7、3.3-3.6GCC 4.8Bazel 0.4.25.18
tensorflow_gpu-1.0.02.7、3.3-3.6GCC 4.8Bazel 0.4.25.18

可以看到,tensorflow_gpu-1.5.0需要GCC 4.8、cuDNN7、CUDA9(这里的Bazel 0.8.0可以不用管它),然后在python2.7、3.3-3.6环境下装。
推荐严格按照对应关系进行环境的安装:CUDA版本较低必定安装不了,而CUDA版本较高也会报错。
下面分步骤具体介绍。

1. 更新电脑显卡驱动

不同版本的CUDA对驱动的要求不同,如下:
在这里插入图片描述
可以通过nvidia-smi查看服务器驱动:
在这里插入图片描述
驱动版本是450.119.03,而我们计划装的CUDA9.0需要384.81以上,满足要求。
如果不满足,可以参考这里的方法,或者从网上下载NVIDIA-Linux-x86_64-450.119.03.run文件自己安装。但NVIDIA官网似乎只提供最新版的驱动,老版本推荐去bing搜索文件名,百度不太好使。

2. 更改gcc和g++版本

gcc和g++的作用如同windows里的vc和vs一样,为c和c++编译器,而gcc和g++就是Ubuntu里的c和c++编译器。Ubuntu 18.04预装GCC版本为7.3,需要手动降级到4.8版本。
自动安装:sudo apt-get install gcc-4.8,在用apt-get install的时候很可能报错:

错误:1 https://mirrors.tuna.tsinghua.edu.cn/ubuntu bionic/universe amd64 gcc-4.8-base amd64 4.8.5-4ubuntu8
  Certificate verification failed: The certificate is NOT trusted. The certificate chain uses expired certificate.  Could not handshake: Error in the certificate verification. [IP: 101.6.15.130 443]
错误:2...

解决:执行sudo vim /etc/apt/sources.list修改里面清华源的url,把https改成http。注意这里要用sudo vim,如果只用vim的话没有权限。然后再执行刚才的命令,安装成功。
此时用gcc --version查看版本,发现仍然显示原来的gcc,原因是新装的gcc优先级不够,需要重新设置gcc的优先级:
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 10
最后的数字10为优先级(越大越高),因为只有一个4.8版本作为alternatives,可以不要纠结数字,这样设就行了。
然后把原来gcc的优先级降低:
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 1
然后可以输入以下命令查看设置结果(非必须) :
sudo update-alternatives --config gcc
在这里插入图片描述
最后再次输入命令gcc -version查看gcc的版本:
在这里插入图片描述
同理,修改默认的g++也是如此:

sudo apt-get install g++-4.8
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/g++-4.8 10
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/g++-7 1
sudo update-alternatives --config g++

在这里插入图片描述
在这里插入图片描述
测试gcc能不能用:gcc4.8可以支持c++11,因此为了验证是否能够正常工作,以新加入到C++11中的std::array为例。

#include <iostream>
#include <string>
#include <iterator>
#include <algorithm>
#include <array>

int main()
{
 // construction uses aggregate initialization
     std::array<int, 3> a1{ {1,2,3} };  // double-braces required
     std::array<int, 3> a2 = {1, 2, 3}; // except after =
     std::array<std::string, 2> a3 = { {std::string("a"), "b"} };
  
     // container operations are supported
     std::sort(a1.begin(), a1.end());
     std::reverse_copy(a2.begin(), a2.end(), 
                       std::ostream_iterator<int>(std::cout, " "));
  
     std::cout << '\n';
  
     // ranged for loop is supported
     for(auto& s: a3)
         std::cout << s << ' ';
     std::cout << '\n';    
 }

编译:g++ -std=c++11 -o stdarray stdarray.cpp. 一定要加上c++11,否则可能无法编译或者无法运行。
运行:./stdarray
结果输出:
在这里插入图片描述
则表示gcc确实能够支持C++11开发。

3. 安装CUDA

CUDA是英伟达专门为GPU计算推出的计算平台,从CUDA3.0开始已经支持C++和FORTRAN,所以上面我们需要将gcc和g++调整到CUDA支持的版本。
查看cuda版本:cat /usr/local/cuda/version.txt或者 nvcc -V。结果:CUDA Version 10.2.89
插播:CUDA driver version 和 runtime version的区别

CUDA Driver Version是跟nvidia的GPU驱动(nvidia-driver)绑定在一起的, 执行nvidia-smi得到右上角显示的cuda版本:
在这里插入图片描述
上图说明驱动版本是450.119.03,可支持的CUDA版本是≤11.0
CUDA Runtime Version是你自己在系统上安装的cuda版本,是你跑深度学习模型或其它程序调用的cuda版本,执行nvcc -V或者nvcc --version可以查看(前提是你正确安装了cuda并将cuda加入了环境变量),例如:
在这里插入图片描述
综上所述:CUDA Driver Version和CUDA Runtime Version的版本不必非要一致,但CUDA Runtime Version要<=CUDA Driver Version。

插播:确定CUDA是否可用于当前的pytorch或者tf

pytorch:https://bbs.huaweicloud.com/blogs/140384
tf: 只能在 import tensorflow as tf 的时候才能发现CUDA是否可用,如果不可用,会有如下类似的报错: ImportError: libcublas.so.9.0: cannot open shared object file: No such file or directory。 这就表示当前tf需要CUDA 9.0,但是没有找到,而决定tf应该使用哪个版本的CUDA,是tf安装目录下的一个_pywrap_tensorflow_internal.lib库文件定义的 。

下面来装我们的CUDA9.0。到NVIDIA官网CUDA9.0 下载页面下载runfile,选择ubuntu16.04,因为18.04版本的系统能够安装16.04版本对应的CUDA 。
在这里插入图片描述
文件下载后用以下指令安装:

sudo chmod a+x cuda_9.0.176_384.81_linux.run
sudo ./cuda_9.0.176_384.81_linux.run --no-opengl-libs

然后会打印出一堆内容,中间包含了默认路径(后面测试 cuda 的 Samples会用到,建议记一下)和条款:

Default Install Location of CUDA Toolkit
Linux platform:
/usr/local/cuda-#.#

Default Install Location of CUDA Samples
Linux platform:
/usr/local/cuda-#.#/samples

然后是一些问答。 大多数是yes,除了是否安装显卡驱动时,一定选择 no(之前安装过显卡驱动)

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 384.81?
(y)es/(n)o/(q)uit: n

Install the CUDA 9.0 Toolkit?
(y)es/(n)o/(q)uit: y

Enter Toolkit Location
 [ default is /usr/local/cuda-9.0 ]:

Do you want to install a symbolic link at /usr/local/cuda?
(y)es/(n)o/(q)uit: y

Install the CUDA 9.0 Samples?
(y)es/(n)o/(q)uit: y

Enter CUDA Samples Location
 [ default is /home/gsy ]:

Installing the CUDA Toolkit in /usr/local/cuda-9.0 ...
Missing recommended library: libGLU.so
Missing recommended library: libX11.so
Missing recommended library: libXi.so
Missing recommended library: libXmu.so
Missing recommended library: libGL.so

Installing the CUDA Samples in /home/gsy ...
Copying samples to /home/gsy/NVIDIA_CUDA-9.0_Samples now...
Finished copying samples.

===========
= Summary =
===========

Driver:   Not Selected
Toolkit:  Installed in /usr/local/cuda-9.0
Samples:  Installed in /home/gsy, but missing recommended libraries

Please make sure that
 -   PATH includes /usr/local/cuda-9.0/bin
 -   LD_LIBRARY_PATH includes /usr/local/cuda-9.0/lib64, or, add /usr/local/cuda-9.0/lib64 to /etc/ld.so.conf and run ldconfig as root

To uninstall the CUDA Toolkit, run the uninstall script in /usr/local/cuda-9.0/bin

Please see CUDA_Installation_Guide_Linux.pdf in /usr/local/cuda-9.0/doc/pdf for detailed information on setting up CUDA.

***WARNING: Incomplete installation! This installation did not install the CUDA Driver. A driver of version at least 384.00 is required for CUDA 9.0 functionality to work.
To install the driver using this installer, run the following command, replacing <CudaInstaller> with the name of this run file:
    sudo <CudaInstaller>.run -silent -driver

Logfile is /tmp/cuda_install_1090.log

之后声明一下环境变量,并将其写入到 ~/.bashrc 文件(在用户目录下)的尾部,输入内容如下:

export PATH=/usr/local/cuda-9.0/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-9.0/lib64:$LD_LIBRARY_PATH

保存退出,并输入下面指令使环境变量立刻生效: source ~/.bashrc
设置环境变量和动态链接库
在命令行输入sudo vim /etc/profile
在打开的文件末尾加入: export PATH=/usr/local/cuda/bin:$PATH
创建链接文件
sudo vim /etc/ld.so.conf.d/cuda.conf
在打开的文件中添加如下语句: /usr/local/cuda/lib64
保存退出,然后执行 sudo ldconfig使链接立即生效。
测试 cuda 的 Samples
切换到 CUDA Samples 的默认安装路径(根据安装后打印出来的提示是/usr/local/cuda-9.0/samples), 终端下输入:sudo make all -j4,等几分钟,出现“Finished building CUDA samples”,然后输入

cd bin/x86_64/linux/release
./deviceQuery

然后打印出一堆东西,能输出GPU的信息,就说明ok。最后可以看到CUDA的runtime version已经变成了9.0:
在这里插入图片描述
查看cuda版本: nvcc --version
在这里插入图片描述
如果不对,可以在~/.bashrc里添加路径:

export PATH="$PATH:/usr/local/cuda-9.0/bin"
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/cuda-9.0/lib64/"
export LIBRARY_PATH="$LIBRARY_PATH:/usr/local/cuda-9.0/lib64"

4. 安装cuDNN

cuDNN是英伟达为CUDA加速运算推出的加速库,用于在GPU上实现高性能现代并行计算。
看cuDNN版本:cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2
在这里插入图片描述即:cuDNN7.6.5,已经满足,不需要再装了。但还没完:要把cudnn的一些文件复制到cuda文件夹下(我这里没找到cudnn之前安装的文件夹,所以把原来有的cuda10.2里的文件复制到了新装的cuda9.0里面,毕竟它也是来源于cudnn文件夹):

sudo cp /usr/local/cuda-10.2/targets/x86_64-linux/include/cudnn.h /usr/local/cuda-9.0/include/cudnn.h
sudo cp /usr/local/cuda-10.2/targets/x86_64-linux/lib/libcudnn* /usr/local/cuda-9.0/lib64

然后安装 libcupti-dev 包:sudo apt-get install libcupti-dev
并给上述文件添加读取权限:
sudo chmod 755 /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*

5. 最后安装Tensorflow-gpu

先在环境变量里增加一句(这是使用tf的要求):export CUDA_HOME=/usr/local/cuda-9.0
然后安装依赖(for Python 3.n ): sudo apt-get install python3-pip python3-dev
然后安装tf-gpu版: pip3 install tensorflow-gpu==1.5.0
如果报错的话可以试试 pip install tensorflow-gpu==1.5.0,或者自己下载 清华镜像源的文件 ,然后pip或pip3 install tensorflow_gpu-1.5.0-cp36-cp36m-manylinux1_x86_64.whl
然后用anaconda创建一个python3.6的环境,进入后import测试:

import tensorflow as tf

hello = tf.constant('hello,tf')
sess = tf.Session()
print(sess.run(hello))  # b'hello,tf'

a = tf.constant(10)
b = tf.constant(22)
print(sess.run(a + b))   # 32
tf.__version__   # 1.5.0

能够输出就说明装好了。这里可能会打印一些关于GPU的信息,别慌,不是报错。最后一行代码是查看tf版本。
因为装的是gpu版本,可以使用下面的代码来测试是否能够成功启动gpu:

from tensorflow.python.client import device_lib
print('GPU:',tf.test.is_gpu_available())

在这里插入图片描述
输出true就行了,大功告成~

参考资料

Ubantu 18.04 安装 TensorFlow 详细教程
Ubuntu17.04安装TensorFlow1.2的GPU版本
tensorflow对应cuda的兼容版本问题
Ubuntu18.04下安装CUDA和cudnn
除此以外也参考了其他资料,但难以追溯了,一并感谢。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

百把人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值