老显卡装cuda碰到的问题
有一个快十年的机器,双CPU共12核,里面有一块Nvidia的老显卡,系统是Ubuntu 16.04。通过lspci |grep -i VGA知道是03:00.0 VGA compatible controller: NVIDIA Corporation GF114 [GeForce GTX 560 SE] (rev a1)。
想测试一下kaldi的GPU加速(估计加得非常有限),于是装cuda。在ubuntu里添加了nvidia的官方源,直接apt-get install cuda。装了一大堆之后kaldi会顺利编译成功。
重启后,发现CPU有一个核会长期被一个systemd-udevd进程占用100%。对N记在Linux下驱动的印象一直不佳,怀疑是它的问题。网上找了一圈方案,有一个说直接删掉 /lib/udev/rules.d/71-nvidia.rules 。但这样应该等效于相关驱动白装了。不死心,继续找,找到了一个正确答案。
可以通过 udevadm monitor 看到kernel和udev在不断加载和移除N卡相关驱动,然后 less /var/log/syslog 可以看到在不断滚动提示原因:
Mar 8 14:51:13 yaSpi systemd-udevd[6940]: Process '/sbin/modprobe nvidia-modeset' failed with exit code 1.
Mar 8 14:51:13 yaSpi kernel: [ 8367.505636] nvidia-nvlink: Nvlink Core is being initialized, major device number 239
Mar 8 14:51:13 yaSpi kernel: [ 8367.506268] NVRM: The NVIDIA GeForce GTX 560 SE GPU installed in this system is
Mar 8 14:51:13 yaSpi kernel: [ 8367.506268] NVRM: supported through the NVIDIA 390.xx Legacy drivers. Please
Mar 8 14:51:13 yaSpi kernel: [ 8367.506268] NVRM: visit http://www.nvidia.com/object/unix.html for more
Mar 8 14:51:13 yaSpi kernel: [ 8367.506268] NVRM: information. The 440.33.01 NVIDIA driver will ignore
Mar 8 14:51:13 yaSpi kernel: [ 8367.506268] NVRM: this GPU. Continuing probe...
Mar 8 14:51:13 yaSpi kernel: [ 8367.506290] NVRM: No NVIDIA graphics adapter found!
原来是我的老卡不再被新驱动支持了!
找到原因就好办了,去到报错消息提示的页面,可以看到 GeForce GTX 560 SE 确实仅被 Legacy 的390版驱动支持。而当前在ubuntu里装cuda,默认会装上440版的驱动。通过官方的一个兼容性列表,可以发现只有cuda 9.1才能和390的驱动配套。
于是要先卸载干净440的驱动:sudo apt-get remove cuda; sudo apt-get autoremove。然后再安装390的驱动:sudo apt-get install nvidia-390。某些直接替换的方法会报错,kernel编译不通过。
这样就可以通过sudo apt-get install cuda-toolkit-9-1安装上cuda的toolkit了。但如果install cuda-9-1仍然会要求装440的驱动。
豆瓣写东西排版好烂。