Open ysl2 opened 7 months ago
场景:运行
nvidia-smi
命令的时候,报错:NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running.
原因:缺少当前内核的头文件,这通常发生在内核更新之后。
sudo apt install linux-headers-"$(uname -r)"
sudo apt install dkms
# 下面这条命令有可能报错找不到`linux-headers-xxxx-amd64`。此时需要通过apt安装一下。
sudo dkms install -m nvidia -v 418.87.00
其中,418.87.00 是之前安装 nvidia 驱动的版本号,可通过下面方法查到:
# 如果下面这条命令显示的是`nvidia-current-418.87.00`,那还需要将其软连接到`/usr/src/nvidia-418.87.00`
ls /usr/src | grep nvidia
手动在家目录下面安装cuda和cudnn
以下方法,考虑到Tensorflow对版本依赖性更强,更易出问题,下面的例子的第一步中是按照Tensorflow来进行的,后面的步骤Pytorch和Tensorflow通用。选择的cuda版本是10.2,对应的cudnn版本是v8.7.0。
确定要安装的cuda和cudnn版本。pytorch可能可以省略这一步(因为pytorch出问题比较少,基本上按照官网命令就可以,所以没有针对pytorch查过具体的cuda和cudnn版本)。假设需要跑tensotflow代码,应该先从官网找到版本匹配关系。通过查找所需要的版本,已经能确定了具体需要安装哪个版本的cuda和cudnn。然后进入到下一步。
https://tensorflow.google.cn/install/source?hl=en#tested_build_configurations
根据上面的版本信息,手动安装对应版本的cuda。下面的例子选择了cuda 10.2版本。
首先去cuda官网,下载对应的安装包。下载出来的文件名字类似于
cuda_10.2.89_440.33.01_linux.run
这样后缀是run的文件,可能几百兆。然后任意指定目录的 上级目录 需要预先手动创建好。比如下面的例子中,选择了
~/.vocal/bin/cuda-10.2
。这个路径一开始并不存在。需要先mkdir ~/.vocal/bin
创建上级目录。之后通过下面的命令,执行上面的
run
文件,安装cuda到指定的目录里面通过第一步确定的cudnn版本,安装对应的cudnn。注意cudnn的版本,同时也是跟cuda版本绑定的。(比如cudnn v8.7.0,可能有对应cuda 10或者11或者12类似的情况),所以需要确定到底需要支持哪个cuda版本的cudnn版本。这里假设对应的版本是cudnn 8.7.0,对应的cuda是10.2
也是通过官网安装cudnn。需要先注册一个账号。不过如果通过下面的wget,或许可以直接下载下来。注意同时需要确定cudnn和cuda的版本号
将解压出来的文件夹中的
include
子文件夹和lib64
子文件夹里的内容,分别移动到上述第二步指定的 cuda 安装路径下面对应的include
文件夹和lib64
(或者lib
)文件夹下面。注意:如果之前 cudnn 的
include
子文件夹里面包含so.7
结尾的文件(比如libcudnn.so.7
),需要将这些移动后的文件位置(对应于$HOME/.vocal/cuda-10.2/include/libcudnn.so.7
)创建软连接到$HOME/.vocal/bin/cuda-10.2/lib64/libcudnn.so.7
。不然有可能依然报错说找不到libcudnn.so.7
。也就是说,libcudnn.so.7
这个需要include
文件夹和lib
文件夹都有一份。具体原因没有再研究过了。后面如果需要多个版本的cuda和cudnn,同样可以安装其他版本的cuda和cudnn,到比如
~/.vocal/bin/cuda-12.1
这个地方,然后只需要改一下~/.bashrc
里面的$PATH
和$LD_LIBRARY_PATH
,再重启一下bash。这样就能切换过去。更进一步地,可以直接把指定$PATH
在前面附加成通用的~/.vocal/bin/cuda
,然后通过软连接的方式,任意把某个cuda版本链接到~/.vocal/bin/cuda
,这样就不用重启bash了,可以任意切换cuda版本。