以下介绍如何在Linux-Mint/Ubuntu 18.04的环境下安全配置CUDA开发环境。笔者最近由win10换到Linux-Mint,电脑配置是9代I7,RTX 2060,在经历过千辛万苦(N次重装系统 + 卡死)后,结合各论坛讨论总结出CUDA环境的正确食用方式。在这里说一下,网上很多文章都具有误导性(不假思索的机翻),人云亦云,这里提供的方法不需要关闭Linux桌面环境,十分安全方便。
首先我们要理解什么是CUDA,知道了它的原理才能让你知道那些网上的虚假教程坑在哪里,以及为什么会让你不止一次的失败、卡死。
CUDA,全称Compute Unified Device Architecture,是NVIDIA开发的GPGPU使用技术,旨在通过整合CPU、GPU优化程序的多线程性能。CUDA中有Host和Device,其中Host是CPU(这里指9代I7), Device指GPU(RTX2060)。CUDA开始于CPU,但通过把并行程度较高的部分分配给GPU执行提高效率,CUDA的执行会大量消耗GPU的算力,导致显示不正常,但在windows环境下系统会自动切换到核显。
简要介绍了CUDA,那让我们看看网上教程及部分讨论有什么错误的地方,首先我们要知道Ubuntu 18.04/Linux-Mint的初始安装环境下,用的是NVIDIA的nouveau公版开源驱动,由于这是开源,导致并不完全兼容N卡,而且相比闭源驱动无法发挥N卡的最高性能(在此对老黄素质三连)。Ubuntu 18.04 LTS版本是自带有最新的430版本驱动的。
那么那些错误到底有哪些呢:
那么如何安装才算正确呢?注意上述方法虽然看似无解,都是可以避免的,这里介绍本人多次尝试后总结的步骤(后附上指令):
这里我们通过安装nvidia-prime避开这些问题
sudo apt install nvidia-prime
sudo prime-select intel
sudo prime-select query
确认是‘intel’
打开additional driver菜单,安装430驱动
安装完毕后不要急着重启,这时禁用nouveau:
sudo bash -c "echo blacklist nouveau > /etc/modprobe.d/blacklist-nvidia-nouveau.conf"
sudo bash -c "echo options nouveau modeset=0 >> /etc/modprobe.d/blacklist-nvidia-nouveau.conf"
cat /etc/modprobe.d/blacklist-nvidia-nouveau.conf
确认是:
blacklist nouveau
options nouveau modeset=0
更新内核initramfs:
sudo update-initramfs -u
sudo reboot
重启
官网下载CUDA toolkit 10.0:
https://developer.nvidia.com/cuda-10.0-download-archive?target_os=Linux&target_arch=x86_64&target_distro=Ubuntu&target_version=1804&target_type=runfilelocal
cd Downloads
sudo chmod u+x cuda_10.0.130_410.48_linux.run
sudo ./cuda_10.0.130_410.48_linux.run
执行安装
问到要不要安装410图形加速套件时选择NO,如果yes系统会卸载430驱动安装410驱动
安装完成后
sudo nano ~/.bashrc
最后加入两行:
export PATH=/usr/local/cuda-10.0/bin${PATH:+:$PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-10.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
ctrl X退出,y保存
然后 source ~/.bashrc
这时候输入:
nvcc -V
就可以看出来cuda版本了,10.0
官网下载10.0对应的CuDNN包,然后解压后把cuda下的文件拷贝至/usr/local/cuda:
sudo cp cuda/include/cudnn.h /usr/local/cuda/include
sudo cp cuda/include/cudnn.h /usr/local/cuda/include
sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*
这一步某个教程写的很详细了:https://blog.csdn.net/u010801439/article/details/80483036
到此时就安装完成了,重启
注意我们这里用的显示卡都是intel的核显,而N卡是作为计算卡使用,然后安装tensorflow,pycharm,caffe, hashcat吧~
(别问我安装hashcat干什么,嘿嘿)
如果nvidia-smi显示错误,切换N卡: sudo prime-select nvidia
然后输入:
dmesg | grep NVRM
查看nvidia-smi
正确的话切回来sudo prime-select intel
通过用intel显示卡我们可以尽可能发挥N卡的计算效能,以及运行CUDA程序的效率。
注意因为我们选择了Intel核显作为主显示卡,所以开机时N卡的CUDA模块不会加载,而如果我们
需要用到CUDA时怎么用呢?
ctrl + alt + T打开terminal,输入:
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 prime-select nvidia
显示:
No devices were found
继续输入:
dmesg | grep NVRM
就可以加载CUDA内核模块了,这时候输入nvidia-smi查看就可以出来啦:
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 430.26 Driver Version: 430.26 CUDA Version: 10.2 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 GeForce RTX 2060 Off | 00000000:01:00.0 Off | N/A |
| N/A 55C P8 3W / N/A | 6MiB / 5934MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
| No running processes found |
+-----------------------------------------------------------------------------+
注意:此时应切换回核显以求保险
sudo prime-select intel
这一步有时间的同学可以用bash脚本实现自动化,就不用每次开机都这么烦了 :D
以下附上脚本:
打开一个空的shell文件,就叫它cuda_init.sh吧
touch cuda_init.sh
sudo nano cuda_init.sh
打开shell脚本,输入:
#! /bin/bash
prime-select nvidia
dmesg | grep NVRM
nvidia-smi
prime-select intel
echo "CUDA has been initiated!"
保存以后退出
每次开机执行:
sudo ./cuda_init.sh
就可以省去之前的步骤
(其实我只是为了炫耀一下新笔记本上的2060)