TensorFlow 以及 cuda 和 cudnn 的环境配置问题

一、首先要搞清楚的问题

1) 关于显卡驱动

显卡驱动是我们使用显卡的最基础的条件,没有显卡驱动就没有办法使用显卡;但是,对于机器学习或者深度学习环境的配置来说,不必过多的关注显卡驱动,我们要做的只是要看看我们的显卡驱动是不是版本过低,因为每一个版本的 cuda toolkit 都有一个最低版本的显卡驱动要求【如果版本过低或者不是 NVIDIA 驱动,因为CUDA Toolkit本地安装包内含特定版本Nvidia显卡驱动,下面安装 cuda 中可以选择更新显卡驱动】

  • 显卡驱动版本一定不能低,而且支持向后兼容,因此越高越好

如下所示,展示了每一个 cuda 版本对显卡驱动的最低要求,通常来说,我们的显卡版本只要高于这个要求,就可以不在关注显卡驱动的问题

TensorFlow 以及 cuda 和 cudnn 的环境配置问题_第1张图片

2) 关于 cuda 和 cudnn 【这一部分参考地址】

  1. cuda: CUDA是一个并行计算平台和编程模型,能够使得使用GPU进行通用计算变得简单和优雅【官方说法】
  2. cuda toolkit installer: 主要包含了 CUDA-C 和 CUDA-C++ 编译器、一些科学库和实用程序库、CUDA 和library API 的代码示例、和一些 CUDA 开发工具。 cuda toolkit installer 集成了 cuda driver ,因此默认情况下会安装【有关他们之间的关系,看下一小节】;但是通常情况下,我们可能只会安装 cuda driver api ,因为这个就可以满足我们日常的需求
  3. cudnn:全称为NVIDIA CUDA® Deep Neural Network library,是NVIDIA专门针对深度神经网络中的基础操作而设计基于GPU的加速库。cudnn 为深度神经网络中的标准流程提供了高效的实现方法;
  4. cuda 与 cudnn 关系:【知乎上的解释】CUDA看作是一个工作台,上面配有很多工具,如锤子、螺丝刀等。cuDNN是基于CUDA的深度学习GPU加速库,有了它才能在GPU上完成深度学习的计算。它就相当于工作的工具,比如它就是个扳手。但是CUDA这个工作台买来的时候,并没有送扳手。想要在CUDA上运行深度神经网络,就要安装cuDNN,就像你想要拧个螺帽就要把扳手买回来。这样才能使GPU进行深度神经网络的工作,工作速度相较CPU快很多。

3)关于 nvidia-smi 显示的 cuda 版本问题

  • 如下图所示,在使用 nvidia-smi 命令的时候,会出现 cuda 版本号

TensorFlow 以及 cuda 和 cudnn 的环境配置问题_第2张图片

  • 这里区分一下 nvcc -Vnvidia-smi 【以下内容的参考地址】
    1. nvcc 属于 cuda 的编译器,将程序编译成可执行的二进制文件;而 nvidia-smiNVIDIA System Management Interface,是一种命令行使用工具,用来帮助管理和监控 NVIDIA GPU 设备;
    2. cuda 有 runtime apidriver api两种,分别有对应的 cuda 版本;前者是 nvcc 种看到的,后者是 nvidia-smi 种看到的
    3. 用于支持 driver api 的必要文件是 GPU driver installer 安装;用于支持 runtime api 的必要文件由 cuda toolkit installer 安装;而 nvcc 是与后者一起安装的 cuda compiler-driver tool,所以 nvcc 反应的是 runtime api 的版本
    4. 但是 cuda toolkit installer 是集成了 GPU driver installer 的;这个在我们安装 cuda 的时候应该会注意到,会询问我们是不是要安装显卡驱动;如果我们选择安装显卡驱动,那么这两个命令显示的 cuda 版本应该是一致的,否则可能不一致;但是 driver api 版本的 cuda 通常会向下兼容 runtime apt 版本的 cuda,所以一般来说,只要 nvidia-smi 显示的 cuda 版本大于 nvcc 显示的 cuda 版本,基本上就不会出现什么问题;

4)TensorFlow, cuda 以及 cudnn 版本对应关系

  • 首先在官方网站可以查看对应关系【只截取了比较新的版本】

TensorFlow 以及 cuda 和 cudnn 的环境配置问题_第3张图片

  • 我们在做项目或者拷贝别人的项目的时候,首先要考虑的是 TensorFlow 的版本,然后根据 TensorFlow 的版本确定好自己需要的 Python,cuda 以及 cudnn 的版本

二、配置环境

1)安装 anaconda & 创建虚拟环境

  • 对于机器学习或者深度学习来说使用 anaconda 是非常方便的,因为我们不同的项目往往需要不同的环境,我们不可能根据一个项目的要求配置环境,其他的不管了,这样的话其他的项目可能就废了;使用 anaconda 我们可以为每一个要求不同环境的项目构建一个虚拟环境,这样我们本地就可以同时存在多个虚拟环境,不同的项目可以使用自己的环境配置
  • 在官网下载自己所用系统的、最新版本的 anaconda,在本地安装即可;如果遇到问题,可以网上搜索一下
  • 安装成功之后,Linux 系统的用户可以使用下面的命令创建并进入虚拟环境,其他用户自行查找
// 创建虚拟环境,可以自己制定 Python 版本
conda create -n your_env_name python=3.6

// 进入虚拟环境
conda activate your_env_name

// 退出虚拟环境
conda deactivate
  • 可以将 conda 的更新源切换为国内源,下载速度立马加快数倍
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/linux-64/
conda config --set show_channel_urls yes

2) 安装 TensorFlow

  • 在安装 TensorFlow 之前,确定好两个问题:1)安装哪一个版本的 TensorFlow;2)现在是不是在虚拟环境中,如果不是,参考上一步
  • 使用下面的命令安装对应版本的 TensorFlow
conda install tensorflow-gpu==1.13.1

3) 安装 cuda

  • 在安装 cuda 之前,首先要根据 TensorFlow 确定所要安装的 cuda 版本,这里使用的是 10.0 版本

安装步骤

  1. 官网下载对应版本的 cuda 版本,之后使用命令 sudo sh cuda_10.0.130_410.48_linux.run 安装

TensorFlow 以及 cuda 和 cudnn 的环境配置问题_第4张图片

  1. 安装过程中会有几个问题,通常的选择:
Do you accept the previously read EULA?
accept/decline/quit: accept   #同意

Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 384.81?
(y)es/(n)o/(q)uit: n   # 如果你的驱动版本是够用的,选择 n ;否则选择 y

Install the CUDA 10.0 Toolkit?
(y)es/(n)o/(q)uit: y  #选择yes 安装cuda

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

Do you want to install a symbolic link at /usr/local/cuda?
(y)es/(n)o/(q)uit: y   #选择yes 建立cuda软链接

Install the CUDA 10.0 Samples?
(y)es/(n)o/(q)uit: y  #选择yes 安装cuda 样例程序

Enter CUDA Samples Location
 [ default is /home/adminpc ]: # Enter
  1. 报错处理:
Missing recommended library: libGLU.so
Missing recommended library: libX11.so
Missing recommended library: libXi.so
Missing recommended library: libXmu.so

#安装缺少的依赖包
sudo apt-get install freeglut3-dev build-essential libx11-dev libxmu-dev libxi-dev libgl1-mesa-glx libglu1-mesa libglu1-mesa-dev

#再次执行安装
sudo sh cuda_10.0.130_410.48_linux.run
  • 如果总是显示缺少依赖包,同时上面的方法不起作用,但是 cuda 显示已经安装了,就可以暂时先不管它,继续做后面的工作
  1. 添加到环境变量
  • 使用命令 sudo gedit ~/.bashrc 打开文件;
  • 在文件的最后添加下面的语句:
export PATH=/usr/local/cuda/bin${PATH:+:${PATH}}
    
export LD_LIBRARY_PATH=/usr/local/cuda/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

export CUDA_HOME=/usr/local/cuda
  • 使用 source ~/.bashrc 来使得环境变量生效

4) 安装 cudnn

  • 首先要知道自己需要的是哪一个版本的 cudnn

  • 官网下载对应版本的 cudnn,下载之后解压;

  • 解压之后的文件夹中包含有 includelib64 两个文件夹,将这两个文件夹中的内容分别添加到 cuda 安装路径中的 includelib64 中;通常,cuda 的安装路径是 /usr/local/cuda-10.0/

  • 给新添加的文件增加可执行权限

    sudo chmod a+r /usr/local/cuda/include/cudnn.h
    sudo chmod a+r /usr/local/cuda/lib64/libcudnn*
    

5) 其他问题

  • 到目前位置,就配置好了 TensorFlow 以及环境

  • 测试,观察运行在 CPU 还是 GPU 上

    import tensorflow as tf
    import os 
    os.environ['TF_CPP_MIN_LOG_LEVEL']='1'
    
    a=tf.constant([1.0,2.0,3.0,4.0,5.0,6.0],shape=[2,3],name='a')
    b=tf.constant([1.0,2.0,3.0,4.0,5.0,6.0],shape=[3,2],name='b')
    c=tf.matmul(a,b)
    
    sess=tf.Session(config=tf.ConfigProto(log_device_placement=True))
    print(sess.run(c))
    
  • GPU 不能使用可能的原因

    1. cuda, cudnn, python, tensorflow 的版本不匹配,检查自己的版本是不是有问题
    2. cuda 有没有安装好,使用 nvcc -V 进行检查
    3. cuda 的路径是不是已经添加到环境变量
  • 问题 ImportError: libcublas.so.10.0: cannot open shared object file: No such file or directory,可能的原因:【此处参考地址】

    1. TensorFlow 与 cuda 版本不一致
    2. 系统找不到 cuda;需要添加到环境变量
    3. pycharm 中出现这种错误可以给 pycharm 中添加环境变量 LD_LIBRARY_PATH=/usr/local/cuda/lib64

三、多个版本的 cuda 使用方案

  • 当安装多个版本的 cuda 的时候,我们可以在 /usr/local 路径下看到多个类似 cuda-10.0 的文件夹,这些文件夹分别对应不同的 cuda 版本;同时我们可以看到一个 cuda 的软连接
  • 多个版本的 cuda 方案是:1)将软连接作为路径写入 cuda 的环境变量 2)想要切换 cuda 版本的时候,将软连接的链接对象切换为对应版本即可
sudo rm -rf cuda # 删除旧版本的软连接
sudo ln -s /usr/local/cuda-9.1 /usr/local/cuda # 建立新版本的软连接
                                              # 前面的路径是需要的版本的cuda的安装路径。

四、gcc 版本过高问题

  • Ubuntu 20.04 默认的 gcc 版本是 gcc 9.3,有时候就需要主动降低 gcc 版本;这个修改 gcc 版本可能让一些不了解的人担心会出现问题,其实完全不需要担心,Ubuntu 可以存在多个版本的 gcc,下载一个低版本的 gcc,暂时作为默认版本即可;这一部分的参考文章
  • 安装 gcc-7
sudo apt-get install gcc-7 g++-7
  • 设置 gcc 和 g++ 的优先级
# 设置 gcc 优先级
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 9
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 1

# 设置 g++ 优先级
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-7 9
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-9 1
  • 查看优先级
# 查看 gcc 优先级
sudo update-alternatives --display gcc

# 查看 g++ 优先级
sudo update-alternatives --display g++

五、pytorch 中 cuda 问题

  • 本节参考地址
  • pytorch 的环境是比较好配置的,因为默认会使用 conda 下载一个叫做 cudatoolkit 的文件,这个文件是 cuda toolkit installer 这个官方的简化版

TensorFlow 以及 cuda 和 cudnn 的环境配置问题_第5张图片

  • 从上面也可以看出,在搭建环境的时候,我们可以在虚拟环境中安装不同版本的 cudatoolkitcudnn ,这样我们就可以非常方便地使用多个版本的 cuda,而不需要每次都手动处理软连接的问题
  • 这篇文章是一个参考;这篇文章是使用 conda 搭建 TensorFlow 环境

你可能感兴趣的:(Linux,tensorflow,cuda,cudnn)