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

官方网站,接下来根据上面的要求一个个去装gcc、CUDA和cuDNN,以及建python环境:

版本 Python 版本 编译器 构建工具 cuDNN CUDA
tensorflow-2.6.0 3.6-3.9 GCC 7.3.1 Bazel 3.7.2 8.1 11.2
tensorflow-2.5.0 3.6-3.9 GCC 7.3.1 Bazel 3.7.2 8.1 11.2
tensorflow-2.4.0 3.6-3.8 GCC 7.3.1 Bazel 3.1.0 8.0 11.0
tensorflow-2.3.0 3.5-3.8 GCC 7.3.1 Bazel 3.1.0 7.6 10.1
tensorflow-2.2.0 3.5-3.8 GCC 7.3.1 Bazel 2.0.0 7.6 10.1
tensorflow-2.1.0 2.7、3.5-3.7 GCC 7.3.1 Bazel 0.27.1 7.6 10.1
tensorflow-2.0.0 2.7、3.3-3.7 GCC 7.3.1 Bazel 0.26.1 7.4 10.0
tensorflow_gpu-1.15.0 2.7、3.3-3.7 GCC 7.3.1 Bazel 0.26.1 7.4 10.0
tensorflow_gpu-1.14.0 2.7、3.3-3.7 GCC 4.8 Bazel 0.24.1 7.4 10.0
tensorflow_gpu-1.13.1 2.7、3.3-3.7 GCC 4.8 Bazel 0.19.2 7.4 10.0
tensorflow_gpu-1.12.0 2.7、3.3-3.6 GCC 4.8 Bazel 0.15.0 7 9
tensorflow_gpu-1.11.0 2.7、3.3-3.6 GCC 4.8 Bazel 0.15.0 7 9
tensorflow_gpu-1.10.0 2.7、3.3-3.6 GCC 4.8 Bazel 0.15.0 7 9
tensorflow_gpu-1.9.0 2.7、3.3-3.6 GCC 4.8 Bazel 0.11.0 7 9
tensorflow_gpu-1.8.0 2.7、3.3-3.6 GCC 4.8 Bazel 0.10.0 7 9
tensorflow_gpu-1.7.0 2.7、3.3-3.6 GCC 4.8 Bazel 0.9.0 7 9
tensorflow_gpu-1.6.0 2.7、3.3-3.6 GCC 4.8 Bazel 0.9.0 7 9
tensorflow_gpu-1.5.0 2.7、3.3-3.6 GCC 4.8 Bazel 0.8.0 7 9
tensorflow_gpu-1.4.0 2.7、3.3-3.6 GCC 4.8 Bazel 0.5.4 6 8
tensorflow_gpu-1.3.0 2.7、3.3-3.6 GCC 4.8 Bazel 0.4.5 6 8
tensorflow_gpu-1.2.0 2.7、3.3-3.6 GCC 4.8 Bazel 0.4.5 5.1 8
tensorflow_gpu-1.1.0 2.7、3.3-3.6 GCC 4.8 Bazel 0.4.2 5.1 8
tensorflow_gpu-1.0.0 2.7、3.3-3.6 GCC 4.8 Bazel 0.4.2 5.1 8

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

1. 更新电脑显卡驱动

不同版本的CUDA对驱动的要求不同,如下:
linux配tensorflow-gpu:步步避坑+常见报错处理
可以通过nvidia-smi查看服务器驱动:
linux配tensorflow-gpu:步步避坑+常见报错处理
驱动版本是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
linux配tensorflow-gpu:步步避坑+常见报错处理
最后再次输入命令gcc -version查看gcc的版本:
linux配tensorflow-gpu:步步避坑+常见报错处理
同理,修改默认的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++

linux配tensorflow-gpu:步步避坑+常见报错处理
linux配tensorflow-gpu:步步避坑+常见报错处理
测试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
结果输出:
linux配tensorflow-gpu:步步避坑+常见报错处理
则表示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版本:
linux配tensorflow-gpu:步步避坑+常见报错处理
上图说明驱动版本是450.119.03,可支持的CUDA版本是≤11.0
CUDA Runtime Version是你自己在系统上安装的cuda版本,是你跑深度学习模型或其它程序调用的cuda版本,执行nvcc -V或者nvcc –version可以查看(前提是你正确安装了cuda并将cuda加入了环境变量),例如:
linux配tensorflow-gpu:步步避坑+常见报错处理
综上所述: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 。
linux配tensorflow-gpu:步步避坑+常见报错处理
下载文件后,使用以下命令进行安装:

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:
linux配tensorflow-gpu:步步避坑+常见报错处理
查看cuda版本:nvcc –version
linux配tensorflow-gpu:步步避坑+常见报错处理
如果不对,可以在~/.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
linux配tensorflow-gpu:步步避坑+常见报错处理即: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())

linux配tensorflow-gpu:步步避坑+常见报错处理
输出true就行了,大功告成~

参考

Ubantu 18.04 安装 TensorFlow 详细教程
Ubuntu17.04安装TensorFlow1.2的GPU版本
tensorflow对应cuda的兼容版本问题
Ubuntu18.04下安装CUDA和cudnn
除此之外,我还参考了其他材料,但很难追溯。谢谢你。

版权声明:本文为博主百把人原创文章,版权归属原作者,如果侵权,请联系我们删除!

原文链接:https://blog.csdn.net/sheagu/article/details/123300280

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
社会演员多的头像社会演员多普通用户
上一篇 2022年3月7日 下午5:29
下一篇 2022年3月7日 下午6:00

相关推荐