CUDA驱动版本与运行版本不匹配问题详解
报错内容:CUDA driver version is insufficient for CUDA runtime version
1 如何查看自己的cuda驱动版本和cuda运行版本
1.1 查看CUDA驱动版本
命令行输入:nvidia-smi
以我的电脑为例,输出中显示Driver Version: 430.34
,此为驱动版本。
1.2 查看CUDA运行版本
命令行输入:nvcc -V
我的电脑输出10.2.89版本。
在网上查到很多文章说利用conda list
或者pip list
查看cudatoolkit和cudnn程序包版本,但是我用这两个查看的结果发现我的电脑并没有这两个包。
2 为什么会分驱动版本和运行版本?
2.1 驱动版本
在讲驱动版本之前,先来明晰几个概念:GPU、显卡和显卡驱动。
这里大家最熟悉的可能就是显卡。显卡顾名思义,就是用来“显示”的卡,在计算机中主要承担的是显示图形的任务。显卡越好,显示的效果就越好,所以爱打游戏的人和从事专业图形设计的人对显卡就额外重视。
而我们常说的GPU(Graphics Processing Unit),中文全称图形处理器,你听这个名字,就是用来处理图形的东西,所以 GPU也是显卡的主要处理单元。GPU和显卡,都能归在硬件的范畴之中。
显卡驱动则是一个软件,顾名思义,用于“驱动”显卡,就好像一辆车(GPU),需要一个司机(显卡驱动)来发动它,一个硬件能够正常运行,也需要程序去“驱动”它。因此,显卡驱动的版本是与GPU硬件有关的,根据硬件的不同,下载的显卡驱动也不同。
我们刚刚用来查看自己的驱动版本的命令行nvidia-smi
中的smi是System Management Interface的缩写,用于管理GPU设备。所以这个命令行输出的信息与其管理的硬件有关。再回看上面的输出:
可以得到,我们的驱动版本是430.34,其能兼容的最高CUDA版本也贴心地写在一旁:10.1。
2.2 运行版本
要说运行版本,我们就要先从CUDA说起。
CUDA的全称是Compute Unified Device Architecture,按照NVIDIA官方的说法,CUDA是一个并行计算平台和编程模型,能够使得使用GPU进行通用计算变得简单和优雅。
翻译一下也就是说,CUDA是NVIDIA为了帮助大家更好地使用他们生产的GPU而开发的一个辅助工具。好像汽车厂商(NVIDIA)卖给你了车(GPU),帮你请了司机(显卡驱动),又负责教司机如何开车开得简单又优雅(CUDA)。这里的CUDA,一般指的是CUDA Toolkit,也就是我们的运行版本。
2.3 问题成因
但是呢,问题就在这儿了。有好老师(CUDA Toolkit)不一定能教出好学生(驱动)。
官网上有一张CUDA工具包和其最低可兼容驱动版本的表格
如图所示,像我们的这个驱动430.34,它只能学会使用CUDA10.1以下的工具包。更高级的CUDA工具包只有更高级别的驱动才会用,所以才导致了这个问题。就像报错信息说的那样:CUDA driver version is insufficient for CUDA runtime version. 我们的问题就是:对于我们的CUDA运行版本来说,驱动版本太低了!
那么要解决这个问题,有两种方法:
- 升级驱动
- 降级CUDA工具包
因为我用的是学校的电脑,没(懒)办(得)法升级驱动了,所以这里我只降级了CUDA工具包。有(勤)条(劳)件的小伙伴可以升级一下自己的驱动。
3 解决方法:降级CUDA工具包
由于我这个新建的虚拟环境没有CUDA Toolkit,所以直接conda install cudatoolkit=10.1
就行了。本来就有安装toolkit的小伙伴可以uninstall一下再装更低版本。
有的时候可能会报错The following packages are not available from current channels
,说明你这个源里现在没有这个版本的toolkit了。这里贴一个网址,大家可以把包下到本地,再走本地路径安装,例如conda install C:/xxxxx
由于我这边的电脑是无图形化界面windows,所以只能提供这两种命令行能实现的解法。如果大家是在自己的电脑上跑,有图形化界面的话,感觉还是升级驱动比较快哦。
CUDA工具包降级了之后再次运行代码,报错消失了,但又报了别的错,修bug真是条漫漫长路(远目