本文主要针对使用UEFI的设备,不保证不使用UEFI的PC也能成功。
问题描述
笔者很久之前就被Nvidia CUDA的安装所困扰;按官网下载的.run文件安装驱动后,有很大概率会出现问题。其中一种比较典型的情况是DKMS构建内核模块失败(查阅日志发现是编译器版本不匹配,而且我至今没有成功让它忽略过这个检查。这是我自行编译过GNU编译套装导致的),即便不使用DKMS仍然会有莫名其妙的问题。即便成功安装驱动,用官网CUDA安装包也可能引发驱动问题,其中一种我遇到的情形就是X服务无法正确运行。最坑的是,就算安上了CUDA也不代表一切OK。
询问学长后得知Ubuntu 18.04 LTS似乎可以做到安装CUDA,遂升级后再次尝试。(笔者已经因为CUDA在Ubuntu 16.04 LTS上重装好几次了。)终于,在Ubuntu 18.04 LTS下尝试成功了,于是分享整个安装过程避免再有萌新被坑。
系统环境
Ubuntu 18.04 LTS,使用
sudo apt-get update
sudo apt-get upgrade
后得到的5.3.0-28-generic内核。使用
cat /proc/version
uname -r
两条指令之一可以查看自己的内核版本。
硬件上必须有Nvidia显卡设备(不然你为啥要装CUDA?)。
**特别注意:**不同设备需要的驱动版本、OpenGL版本、CUDA版本可能有差异,请自行在官网查询。
安装过程
安装驱动
这里说是主要坑点其实有我自己的问题,要是仔细阅读那一堆英文提示的话很早就能解决了。
此外,很多说法说安装闭源驱动需要先禁用nouveau开源驱动,然而实践表明其实并不一定。安装闭源驱动后开源驱动相当于自动被屏蔽了。
使用指令
sudo apt-get install nvidia-<驱动版本号>
其中,笔者个人选择的驱动版本号是可选的版本号中最大的,我这里是435。后来证明GeForce GTX1050可以使用435版闭源驱动。
在安装时有一个过程需要手动处理,就是Secure Boot密码。按笔者的理解,应该是和UEFI启动安全相关的一个东西,这个密码大概类似于数字签名之类的,没有这个签名是无法启动对应程序的(多数程序不需要这一步是因为不需要访问底层设施,但该驱动可能需要)。
输入Secure Boot密码并完成安装后需要reboot重启,这里是一个主要的坑点,很多人第一次看到时可能像我一样直接继续启动了,其实需要在这里再次输入Secure Boot密码才行(不然相当于是你给了某人一个名字却没给他上户口,在MOK看来和没给名字没有区别。说实话笔者也不太清楚这个MOK具体是什么东西)。
下面是MOK Management下的操作过程:
选择Enroll MOK(执行MOK操作)->一路继续/是->输入Secure Boot密码->确定完成。这个过程中,输入密码时密码不会显示出来,这是很正常的。
如果上面这步有错,Nvidia驱动将会安装失败。只要从头再来一遍就可以了。通常而言,这一步不会造成太大的破坏。
确认驱动情况
使用
nvidia-smi
即可查看当前情况。如果驱动安装不成功,将会显示无法与显卡沟通(甚至干脆显示没有这个指令)。安装正确的话将会显示显卡驱动基本信息。
安装CUDA
很多教程使用官网下载的文件来安装CUDA,很容易产生包冲突(并导致驱动挂掉),其实根本没必要。使用
sudo apt-get install nvidia-cuda-*
即可安装完整的CUDA,笔者这里是9.1版本,足够新了。
确认CUDA工具链安装
nvcc -v
如果正确输出工具链版本信息就表示工具链安装成功。
例程试验
#include <stdio.h>
#include <cuda_runtime.h>
#include <errno.h>
__global__ void helloFromGPU(void){
printf("GPU kernel\n");
}
int main(){
cudaError_t status;
int num;
status = cudaGetDeviceCount(&num);
if (status == cudaErrorNoDevice) {
perror("No device found\n");
return 1;
}
printf("Found %d device(s)\n", num);
helloFromGPU<<<1,10>>>();
cudaDeviceReset();
return 0;
}
如果正确输出GPU kernel字样,且输出找到了设备的信息(Found 1 device(s),也可能更多),就表示Nvidia驱动和CUDA完全配置妥当了。