理清GPU、CUDA、CUDA Toolkit、cuDNN关系以及下载安装

  • Post author:
  • Post category:其他


介于在服务器上安装Nvidia、CUDA、cuDNN等等,对各自的概念以及它们之间存在的关系一直不够清晰,借此机会,整理相关内容于此,若有错误望指正,评论多交流



GPU

显卡是我们平时说的GPU,现在大多数的电脑使用NVIDIA公司生产的显卡;常见的型号有Tesla V100,GTX950M,GTX1050TI,GTX1080等。



显卡驱动Driver

特指NVIDIA的显卡驱动程序。



CUDA

CUDA是显卡厂商NVIDIA推出的运算平台。CUDA™是一种由NVIDIA推出的通用并行计算架构,是一种并行计算平台和编程模型,该架构使GPU能够解决复杂的计算问题。CUDA英文全称是Compute Unified Device Architecture。

有人说:CUDA是一门编程语言,像C,C++,python 一样,也有人说CUDA是API。

官方说:CUDA是一个并行计算平台和编程模型,能够使得使用GPU进行通用计算变得简单和优雅。

运行CUDA应用程序要求系统至少具有一个具有CUDA功能的GPU和与CUDA Toolkit兼容的驱动程序。

查看CUDA版本命令:

nvcc -V



nvcc --version



cat /usr/local/cuda/version.txt


需要知道:CUDA和CUDA Driver显卡驱动不是一一对应的,比如同一台电脑上可同时安装CUDA 9.0、CUDA 9.2、CUDA 10.0等版本。



CUDA Toolkit

CUDA工具包的主要包含了CUDA-C和CUDA-C++编译器、一些科学库和实用程序库、CUDA和library API的代码示例、和一些CUDA开发工具。(通常在安装CUDA Toolkit的时候会默认安装CUDA Driver;但是我们经常只安装CUDA Driver,没有安装CUDA Toolkit,因为有时不一定用到CUDA Toolkit;比如我们的笔记本电脑,安装个CUDA Driver就可正常看视频、办公和玩游戏了)

详细内容见

NVIDIA官方



NVCC

NVCC就是CUDA的编译器,可以从CUDA Toolkit的/bin目录中获取,类似于gcc就是c语言的编译器。由于程序是要经过编译器编程成可执行的二进制文件,而cuda程序有两种代码,一种是运行在cpu上的host代码,一种是运行在gpu上的device代码,所以nvcc编译器要保证两部分代码能够编译成二进制文件在不同的机器上执行。



cuDNN

cuDNN的全称为NVIDIA CUDA® Deep Neural Network library,是NVIDIA专门针对深度神经网络中的基础操作而设计基于GPU的加速库。cuDNN为深度神经网络中的标准流程提供了高度优化的实现方式,例如convolution、pooling、normalization以及activation layers的前向以及后向过程。

CUDA这个平台一开始并没有安装cuDNN库,当开发者们需要用到深度学习GPU加速时才安装cuDNN库,工作速度相较CPU快很多。

CUDNN是基于CUDA的深度学习GPU加速库,有了它才能在GPU上完成深度学习的计算;


来自知乎的解释:CUDA看作是一个工作台,上面配有很多工具,如锤子、螺丝刀等。cuDNN是基于CUDA的深度学习GPU加速库,有了它才能在GPU上完成深度学习的计算。它就相当于工作的工具,比如它就是个扳手。但是CUDA这个工作台买来的时候,并没有送扳手。想要在CUDA上运行深度神经网络,就要安装cuDNN,就像你想要拧个螺帽就要把扳手买回来。这样才能使GPU进行深度神经网络的工作,工作速度相较CPU快很多。


基本上所有的深度学习框架都支持cuDNN这一加速工具,例如:Caffe、Caffe2、TensorFlow、Torch、Pytorch、Theano等。

Caffe可以通过修改Makefile.config中的相应选项来修改是否在编译Caffe的过程中编译cuDNN,如果没有编译cuDNN的话,执行一些基于Caffe这一深度学习框架的程序速度上要慢3-5倍(Caffe官网上说不差多少,明明差很多嘛)。Caffe对cuDNN的版本不是很严格,只要大于cuDNN 4就可以。

查看cuDNN版本:

cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2




CUDA Toolkit和 显卡驱动 的版本对应

每个版本的CUDA Toolkit 都对应一个最低版本的显卡驱动版本(CUDA Driver),详情见下表。

显卡驱动下载



CUDA Toolkit下载



显卡驱动安装教程



CUDA Toolkit安装教程1



CUDA Toolkit安装教程2

安装CUDA Driver核心命令:

sudo sh ./NVIDIA-Linux-x86_64-???.??.run


详细教程参考其他博客


需要知道:CUDA Toolkit和显卡驱动有版本的对应关系。

但同时:在同一台机器上(即同一个CUDA Driver版本)可以安装多个版本的CUDA(如CUDA 9.0、CUDA 10.1……只需要满足当前CUDA Driver版本支持安装的CUDA版本即可,满足关系见下图。


我的理解:安装CUDA就是安装CUDA Toolkit(CUDA是运算平台名称、CUDA Toolkit是工具包),就是从官网下载CUDA Toolkit安装.run文件(如cuda_9.0.176_384.81_linux.run)进行安装。

安装成功后,在/usr/local路径下才会有cuda-9.0文件夹,且同时才可以使用

nvcc -V

可以查询到CUDA版本

在这里插入图片描述


上图的官方文档

  • Anaconda在安装Pytorch时,会同时用户安装cudatoolkit,如命令

    conda install pytorch torchvision torchaudio cudatoolkit=10.1 -c pytorch

    ,其主要包含应用程序在使用CUDA相关的功能时所依赖的动态链接库。conda安装只会安装一些计算库,不会安装编译工具。而官方的cuda包包含的东西会完整一些。
  • 使用 Anaconda 安装的 CUDA Toolkit 不位于 lib64 路径中,也不会产生冲突
  • 在考虑

    pip install tensorflow-gpu

    安装tensorflow时,如安装TensorFlow2.1,需要安装CUDA Toolkit版本为10.1,而安装Tensorflow1.14.0,则要求cuda==10.0(tensorflow与cuda也有版本兼容问题,

    官方文档



    查询上图,我们发现需要显卡驱动版本应该大于等于418.96,故系统中的显卡驱动版本应该至少为418.39。

  • CUDA Toolkit本地安装包(local)内含特定版本Nvidia显卡驱动的,当在CUDA官网下载CUDA Toolkit后进行安装时会让用户选择安装项。

  • 如果想安装其他版本的显卡驱动,则就需要在Nvidia官网自己下载并先安装好(或本机已经安装了合适版本的显卡驱动时),最后在安装CUDA Toolkit时取消安装内置版本的Nvidia显卡驱动。



CUDA / CUDA Toolkit和cuDNN的版本对应


CUDA / CUDA Toolkit和cuDNN之间有版本对应关系。

但同时:同一个CUDA 版本支持安装多个版本的cuDNN(如cuDNN v7.6.4、cuDNN v7.6.3……选择其一安装即可。


cuDNN下载



cuDNN下载安装教程

  • 查阅cuDNN下载网站,可以知道,如果目前电脑中安装了CUDA Toolkit=10.1(也就是CUDA10.1),那么cuDNN的可选版本有7.6.4、7.6.3、7.6.2

    同上,如需要安装TensorFlow2.1,故我们需要安装CUDA Toolkit=10.1,同时cuDNN就需要从7.6.4、7.6.3、7.6.2这三个版本中选择。



显卡驱动程序的选择

在这里插入图片描述

在这里插入图片描述

可以查看所下载的驱动版本支持的GPU版本:

在这里插入图片描述




nvidia-smi 和 nvcc 结果的版本为何不一致

首先需要知道,两者不是必须一致

在这里插入图片描述

CUDA 有两种API,分别是运行时API和驱动API:Runtime API 与 Driver API。


nvidia-smi是 CUDA Driver API(驱动API)的版本,也是当前驱动支持的最高CUDA版本

,如在这里是10.0。



nvcc的结果是对应 CUDA Runtime API(运行API)的版本



在这里插入图片描述


每个CUDA的版本(指上文介绍安装的cudatoolkit)会要求一个最低的显卡驱动版本;而显卡驱动会提供一个最高支持的CUDA 版本。

https://blog.csdn.net/ljp1919/article/details/102640512

https://blog.csdn.net/qxqxqzzz/article/details/103453413

https://forums.developer.nvidia.com/t/cuda-driver-version-9-0-cuda-runtime-version-8-0/60139

https://stackoverflow.com/questions/53422407/different-cuda-versions-shown-by-nvcc-and-nvidia-smi

https://www.cnblogs.com/yhjoker/p/10972795.html

https://zhuanlan.zhihu.com/p/91334380




使用conda命令安装pytorch时候cudatoolkit的版本是哪个?


答:

我们只需要根据项目代码要求来确定cudaoolkit包的版本,安装相应的pytorch即可,如算法需要cuda10.2,那么就可以

conda install pytorch torchvision cudatoolkit=10.2 -c pytorch



上述命令在使conda安装torch时候,会提供一个cudatoolkit工具包,其中包含了CUDA的运行API(主要是一些动态链接库文件libXXXX.so.xxx等),在运行基于pytorch的代码时会使用conda提供的cudatoolkit包,而忽视Nvidia官方的CUDA Toolkit。这也就是为什么有时候我们通过

nvcc -V

查看的CUDA运行API版本很低(比如7.5),但是能成功运行cuda9.0的pytorch的原因。


但是需要注意:

如果项目代码需要使用

python setup.py develop



./make.sh

来编译依赖cuda的torch模块(如C语言脚本)时候,这个时候可能会导致错误,错误原因是编译过程使用的是系统自带的CUDA而不是conda安装的CUDA包,当系统自带CUDA版本不支持项目代码时,会引发一些奇怪的问题,所以最好的办法是保持conda安装的cudatoolkit版本与系统自带版本(

nvcc -V

查看)一致。

那么可能就有人要问了,“不能编译的时候调用conda安装pytorch时附带安装的cudatoolkit吗?”答案是往往不行,因为conda只安装上了部分动态链接文件,只占Nvidia官方CUDA的一小部分,且没有安装开发工具包和驱动程序,而往往编译过程需要依赖其他头文件等,conda安装的cudatoolkit不具备这些头文件等,故不行。

办法也只能是自行安装一个新版本CUDA,具体过程见上文,多版本CUDA管理见下文。


pytorch寻找可用CUDA的路径:


1、环境变量CUDA_HOME 或 CUDA_PATH

2、/usr/local/cuda

3、which nvcc的上级目录

4、如果上述都没有结果,则torch.utils.cpp_extension.CUDA_HOME为None,会使用conda安装的cudatoolkit,其路径为cudart 库文件目录的上级目录。

# pytorch 实际使用的运行时的 CUDA 目录
import torch.utils.cpp_extension
torch.utils.cpp_extension.CUDA_HOME  #会打印出CUDA的目录,如 /usr/local/cuda

# 编译时使用的 cuda 版本
import torch
torch.version.cuda  # 就是conda环境中安装pytorch时候安装的cuda版本



CUDA多版本切换/管理方式

当本机上安装有多个版本cuda时可以通过一下步骤进行管理/版本切换,比如我们要切换使用cuda9.1:

sudo vim ~/.bashrc加入以下的内容:

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

修改完毕保存,

source ~/.bashrc

sudo rm -rf /usr/local/cuda # 删除旧版本的软连接
sudo ln -s /usr/local/cuda-9.1 /usr/local/cuda # 建立新版本的软连接
                                              # 前面的路径是需要的版本的cuda的安装路径。

之后再使用nvcc -V查看cuda版本,如




写在最后(一定要看嗷!)


  • conda search 【package_name】 --info



    anaconda search -t conda 【package_name】

    这个命令可以查看当前源可下载安装的包的版本+平台等信息。
  • 在安装pytorch的时常用命令

    conda install pytorch=x torvhsion=x cudatoolkit=10.1 -c pytorch

    中的

    -c

    的含义是指定搜索程序包的其他通道。Navigator和conda查找包的位置,如果希望从默认通道以外的其他通道安装,则要使用-c指定具体通道,默认为http://conda.anaconda.org/.。所以上述安装pytorch的命令中

    -c

    的意义是指定从torch官方的渠道进行下载,而不使用默认渠道。


    另外

    :博主遇到了以下情况:

    使用

    conda install pytorch=1.8.0 torchvision=0.9.0 cudatoolkit=10.1 -c torch

    会报找不到目标资源,进而无法安装;而

    conda install pytorch=1.8.0 torchvision=0.9.0 cudatoolkit=10.1 -c pytorch

    可以找到目标资源并成功安装。
  • 在安装Nvidia驱动时,可能会遇到gcc版本过高或较低的问题,可以参考其他文章安装合适版本的gcc,

    gcc镜像下载



    gcc5.4安装教程

  • cmake下载源:

    https://cmake.org/files/

    。安装教程见下方:

    教程
tar xzvf cmake-3.11.2.tar.gz
sudo apt-get install gcc   # 确认是否安装好
sudo apt-get install g++  # 确认是否安装好
cd  cmake-3.11.2
sudo ./bootstrap
sudo make
sudo make install
  • 执行

    conda install tensorflow-gpu=xx

    会自动安装cudatoolkit和cudnn。
  • 以深度学习为例,当网络模型依赖CUDA时,可以直接用conda安装CUDA(这里安装的只是CUDA的部分,只有部分动态链接库),如

    conda install cudatoolkit==XXX

    ,无需安装从 nvidia 官网下载cuda 安装包(但这样做需要确保GPU显卡驱动是已经安装好的)。


    conda虚拟环境单独安装cuda和cudnn教程

  • 好用的源

    ,可以自主选择torch+cuda版本下载并本地安装

    pip install xxx.whl

    (并且强烈建议再加上

    --no-deps

    来取消依赖项检查):

    torch+cuda.whl:

    https://download.pytorch.org/whl/torch_stable.html


    torch_scatter、torch_spline_conv、torch_sparse、torch_cluster:

    https://data.pyg.org/whl/

    (需要根据环境中已安装好的torch-cuda版本进行选择)
  • 关于安装pytorch和torchvision,安装指定版本的pytorch可以使用

    conda install pytorch==XXXX

    ,同样经常用到的torchvision也可以用conda安装,需要注意torch、torchvision和python三者间有个版本对应关系,见下表或

    pytorch-previous-version安装

  • pytorch官方文档:

    https://pytorch.org/docs/1.8.0/
pytorch torchvision python cuda
1.8.0 0.9.0 >=3.6 10.2,11.1
1.7.1 0.8.2 >=3.6 9.2, 10.1,10.2,11.0
1.7.0 0.8.0 >=3.6 9.2, 10.1,10.2,11.0
1.6.0 0.7.0 >=3.6 9.2, 10.1,10.2
1.5.1 0.6.1 >=3.5 9.2, 10.1,10.2
1.5.0 0.6.0 >=3.5 9.2, 10.1,10.2
1.4.0 0.5.0 ==2.7, >=3.5, <=3.8 9.2, 10.0
1.3.1 0.4.2 ==2.7, >=3.5, <=3.7 9.2, 10.0
1.3.0 0.4.1 ==2.7, >=3.5, <=3.7 9.2, 10.0
1.2.0 0.4.0 ==2.7, >=3.5, <=3.7 9.2, 10.0
1.1.0 0.3.0 ==2.7, >=3.5, <=3.7 9.0, 10.0
<=1.0.1 0.2.2 ==2.7, >=3.5, <=3.7 9.0, 10.0

代求证:


conda install pytorch安装的是torch CPU版本,conda install pytorch torchvision -c pytorch安装的是GPU版本



切换CUDA版本不用增删动态链接库,而是使用 LD_LIBRARY_PATH 来控制适用不同版本的 CUDA runtime。 anaconda 也是用 LD_LIBRARY_PATH 来控制CUDA版本的



在使用 CMake 等编译和运行的过程中,可以根据 CUDA_PATH 这个环境变量选择CUDA 版本,而不需要删除、创建软连接

更多详情见:

知乎专栏

对网络上一些言语若有疑问,欢迎在评论区交流 [抱拳][抱拳][抱拳]



版权声明:本文为qq_42406643原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。