这四者从底层(硬件)到上层(软件)的顺序是:驱动->cuda(->cudnn)->深度学习库。cudnn加括号是因为cudnn的版本和cuda版本是一一对应的,深度学习库的版本依赖往往是直接看cuda版本,而不需要关注cudnn。

这其中最重要的问题是版本依赖。

显卡驱动

显卡驱动是告诉系统如何调用显卡这个硬件,

  • 驱动版本越新越好,都是向下兼容的。新的驱动仍然支持旧的cuda,但旧的驱动就无法支持新版本的cuda。比如4302.6的驱动只能支持到10.1的cuda,10.2和11.0的就不行。
  • 同一个驱动版本可以用在不同型号的显卡(前提是这个型号的显卡有更新到该版本的驱动)。比如我一开始在1080上安装430.26的驱动,后来我把TITAN X (Pascal)装上去,一样可以正常用,不需要针对TITAN重装驱动。但是我为了支持cuda11想把驱动更新到450,这就行不通。因为NVIDIA已经停止对TITAN X (Pascal)更新驱动了,TITAN X (Pascal)最新驱动版本停留在2019年的436.15。

cuda与cudnn

cuda是构筑在显卡驱动之上的工具库(toolkit),cudnn是构筑在cuda之上的深度学习相关的工具库。因此,不管是做graphics(3D渲染等)还是搞深度学习,想要使用显卡都必须安装cuda,但做graphics的朋友就不需要安装cudnn。

cudnn

由于cudnn的关系更简单,因此这里放在前面说。如上所述,cudnn和cuda的版本一般是一一对应的(加上一般是因为低于对应版本的cudnn也可以使用,但是可能性能会有差),甚至于cudnn只不过是解压出来放在cuda文件夹里的一个文件夹。装好就不用再管它。

cuda

cuda和驱动,cuda和cudnn的关系在上面已经说过了。那么它和我们工作的核心——深度学习库是什么关系呢。

  • 一般来说,深度学习库的开发者每发布一个新版本的深度学习库,都会让它同时兼容好几代的cuda,但太旧的就不会再支持。如pytorch1.6已经不支持cuda8了。因此需要一定程度上保持cuda的与时俱进。(除非由于显卡型号太老,没有新的驱动支持了,也就装不了新的cuda。比如我的TITAN X Pascal)
  • 在安装tensorflow和pytorch时,它实际上会同时在conda的虚拟环境里帮你安装cudatoolkit,但注意这个cudatoolkit并不能等同于系统里的cuda。原因是cudatoolkit只支持pytorch或tensorflow等部分库的使用,实际上它只是整个cuda的一部分,即pytorch的库要用到的部分。如果你要在虚拟环境里编译其他要用到cuda的库,是没办法用到cudatoolkit的,只能用系统里的cuda。用实际案例来解释一下:假设现在系统里安装了10.0的cuda,你在conda虚拟环境里安装了cuda10.2的pytorch1.6,那么pytorch确实可以正常使用没毛病。但是此时你需要自己编译一个同时基于pytorch和cuda的库,由于它没法用到pytorch的cudatoolkit,而只能使用系统cuda,而系统cuda版本和pytorch对应的cuda版本又不相同,那么它很有可能就会编译失败。我已经碰过好几次这种坑了。
  • 那么以上问题是不是就没有办法了呢。也不是。因为在ubuntu里,cuda的路径/usr/local/cuda实际上是一个软链接(类似windows里的快捷方式),它链接了另一个同目录下的另一个cuda文件夹,比如/usr/local/cuda-10.0。更方便的是,它只需简单两行代码(直接搜多cuda切换就能找到)就可以链接到同目录下的其他cuda文件夹,比如/usr/local/cuda-10.2。(当然是在你显卡型号够新才能支持。)这就意味着我们可以轻易地改变系统cuda版本。不过如果你只是希望使用pytorch或者tensorflow一个库,而不需要其他依赖于pytorch和cuda的库,那么不需要这一步,有了cudatoolkit即可。
  • what if 你不是root用户,就没法把cuda装在/usr/local/cuda,或者你在公用服务器上跑代码,也不好直接把所有人的cuda都换成另一个。此时应该把cuda装在用户目录下,更改~/.bashrc中的cuda路径,把所有/usr/local/cuda改成你的实际安装路径。那么其他库安装时就会链接到你的用户目录下安装的cuda。注意此时安装时要点进options,把Library install path 和Toolkit Options中的Toolkit Install Path都改成相同的用户目录下的文件夹。最后把对应的cudnn复制到cuda文件夹中即可。

综上,为了更可能高的兼容性和更方便的操作,我们需要:

  1. 用尽可能新的或者流行的显卡,这样才能获取NVIDIA最新的驱动版本支持(显然这一点主要是老板控制)
  2. 装尽可能新的驱动,从而获得最新的cuda版本支持。
  3. 装尽可能多的cuda放着,以免不时之需。
  4. 换环境时要留意cuda是否需要更换