记一次Linux内核切换
近日,准备在服务器上进行huggingface大模型的本地部署,但需要如下的环境配置:
cuda 12.2.0+Python 3.9+miniconda+pytorch2.1.2
然而当前服务器的情况如下:
操作系统:ubuntu 22.04(Linux-x86_64)
GPU:NVIDIA GeForce RTX 3090 *1
Linux 内核:6.2.0-39-generic
NVIDIA 驱动:515.105.01
CUDA runtime API:11.7(nvcc -v)
CUDA driver API:11.7(nvidia-smi)
如果要部署大模型,首先需要升级cuda版本,但已有的anaconda虚拟环境都是基于当前的驱动版本部署的,一旦出现驱动更换,很容易导致很多原有的代码无法work,因此尝试安装多个cuda驱动。
但在尝试过程中不小心更新了Linux内核,导致了如下问题
使用 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.
且在python代码中显示无法调用gpu.
随后开始Debug:
- nvcc -V (查看是不是cuda崩了 结果正常运行)
- ls /usr/src | grep nvidia (查看安装的nvidia驱动是否被删除,文件依然存在)
- sudo apt-get install dkms (尝试使用dkms:动态内核模块支持是Linux生态系统中一个功能强大的程序/框架。)
- sudo dkms install -m nvidia -v 515.105.01 (尝试为当前运行的内核构建特定模块:nvidia 515.105.01)
结果报错:
ERROR: Cannot create report: [Errno 17] File exists: ‘/var/crash/nvidia-kernel-source-515.0.crash’
Error! Bad return status for module build on kernel: 6.5.0-35-generic (x86_64)
随后查看报错的文件夹其中消息提示:
/var/lib/dkms/nvidia/515.105.01/build/common/inc/nv-mm.h: In function ‘NV_GET_USER_PAGES_REMOTE’:
/var/lib/dkms/nvidia/515.105.01/build/common/inc/nv-mm.h:164:45: error: passing argument 1 of ‘get_user_pages_remote’ from incompatible pointer type [-Werror=incompatible-pointer-types]
…
make[2]: *** [/usr/src/linux-headers-6.5.0-35-generic/Makefile:2039:/var/lib/dkms/nvidia/515.105.01/build] 错误 2
猜测可能是gcc和内核不匹配。发现近期更新了内核。查看内核列表:
dpkg -l |grep linux-image
发现存在两个内核,于是尝试更新默认启动的内核,步骤如下(参考:https://blog.csdn.net/u010608421/article/details/115658479):
- 查看内核位置
gedit /boot/grub/grub.cfg
- …
- 重新启动
- 内核更换,work,所有问题都迎刃而解。