最近发现在笔记本上用 cpu 来训练模型效率还是太慢了,正好我笔记本上有一块 nvidia gpu,准备折腾一下把这块 gpu 用起来
由于在笔记本环境下安装 gpu 开发环境比较痛苦,虽然最终失败了,但是过程比较有意义,值得备忘一下
我的开发环境主要是 pytorch + cuda
硬件环境就是 thinkpad w530 + 32g + K1000M
由于笔记本的 gpu 通常型号比较老,并不是大部分的 pytorch 都支持
1. 安装 cuda
网上有很多资料,怎么安装 nvidia-cuda-toolkit 的,apt install nvidia-cuda-toolkit 就可以直接装
但是我发现装完了之后没法用,pytorch 没法检测到 cuda 环境。这两个东西不完全是一个东西,有挺多差异的。
python3 -c ‘import torch; print(torch.cuda.is_available())’ 必须返回 true
最后用官方的安装方法成功了
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin sudo mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600 wget https://developer.download.nvidia.com/compute/cuda/11.7.0/local_installers/cuda-repo-ubuntu2004-11-7-local_11.7.0-515.43.04-1_amd64.deb sudo dpkg -i cuda-repo-ubuntu2004-11-7-local_11.7.0-515.43.04-1_amd64.deb sudo cp /var/cuda-repo-ubuntu2004-11-7-local/cuda-*-keyring.gpg /usr/share/keyrings/ sudo apt-get update sudo apt-get -y install cuda
2. 安装 nvidia-driver
ubuntu 默认源里面会有一些基本的 nvidia-driver
ubuntu-drivers devices 可以看到
# ubuntu-drivers devices == /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0 == modalias : pci:v000010DEd00000FFCsv000017AAsd000021F5bc03sc00i00 vendor : NVIDIA Corporation model : GK107GLM [Quadro K1000M] manual_install: True driver : nvidia-driver-390 - distro non-free driver : nvidia-340 - distro non-free recommended driver : nvidia-driver-418-server - distro non-free driver : xserver-xorg-video-nouveau - distro free builtin
这里面会推荐你使用 nvidia-340
但是我的实际测试来看,nvidia-340是没法用的,安装完了之后显示器各种异常,最后安装到 nvidia-driver-390 解决了显示器异常的问题
但是nvidia-driver-390 版本太低,cuda 现在依赖的 nvidia-driver 版本都是470以上了,所以光有 nvidia-driver 是不行的,必须和 cuda 配套。
最终在安装 cuda 的时候会自动安装 nvidia-driver 配套驱动,其实不用自己搞
安装完,需要重启机器,重启后 nvidia-smi 检查能不能看到显卡信息
Tue Jun 14 00:32:08 2022 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 470.57.02 Driver Version: 470.57.02 CUDA Version: 11.4 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |===============================+======================+======================| | 0 Quadro K1000M On | 00000000:01:00.0 On | N/A | | N/A 62C P0 N/A / N/A | 547MiB / 2000MiB | 76% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=============================================================================| | 0 N/A N/A 1362 G /usr/lib/xorg/Xorg 471MiB | | 0 N/A N/A 1852 G xfwm4 0MiB | | 0 N/A N/A 2976 G /usr/lib/firefox/firefox 0MiB | | 0 N/A N/A 3002 G fcitx-qimpanel 26MiB | | 0 N/A N/A 10987 G ...928668263600645675,131072 22MiB | +-----------------------------------------------------------------------------+
上面信息说明安装成功了
3. 安装 pytorch
pytorch 首页就有安装教程
按照自己的实际环境,设定安装环境,最后得到安装命令
另外,pytorch 最大的问题是并不支持所有的 gpu 列表,从我使用的 ubuntu 20.04 来看,最新版的 pytorch 最低要求 sm3.7 以上
python3 -c ‘import torch; torch.zeros(1).cuda()’
命令可以测试 cuda 运行情况
Found GPU0 Quadro K1000M which is of cuda capability 3.0. PyTorch no longer supports this GPU be…
~/.local/lib/python3.8/site-packages/torch/cuda/__init__.py:122: UserWarning: Found GPU0 Quadro K1000M which is of cuda capability 3.0. PyTorch no longer supports this GPU because it is too old. The minimum cuda capability supported by this library is 3.7. warnings.warn(old_gpu_warn % (d, name, major, minor, min_arch // 10, min_arch % 10))
这个问题似乎有很多讨论:
所以从目前的情况来看,pytorch 至少要 sm3.7 版本以上才能用
不同的 gpu 型号,都有一个最新的 sm 版本支持,如果当前pytorch的最低sm版本要比支持这个gpu的最新sm版本要大,那就能用,否则不能用
我的 gpu 型号是 K1000M
# lshw -numeric -C display *-display description: VGA compatible controller product: GK107GLM [Quadro K1000M] [10DE:FFC] vendor: NVIDIA Corporation [10DE] physical id: 0 bus info: pci@0000:01:00.0 version: a1 width: 64 bits clock: 33MHz capabilities: pm msi pciexpress vga_controller bus_master cap_list rom configuration: driver=nvidia latency=0
查询 gpu 型号的最高 sm 版本
https://developer.nvidia.com/cuda-gpus
发现基本上 K系列的显卡,都在 sm 3.0 之后停止支持了,而 pytorch 要求的 sm 版本不能低于 3.7,所以我这个机器没法用 gpu 版本的 pytorch
4. 一些其他问题
1)安装 nvidia-driver 后扩展显示器无法显示
首先确保你重启了!
如果 nvidia-smi 时出现 No running processes found 字样,说明没有活跃的进程。也就是 xorg 没有切换到 gpu 模式
原因:nvidia 驱动没安装对
解决办法:不一定要用 ubuntu-drivers devices 推荐(recommended 关键字)的 nvida-driver,可以多试试列表里的其他几种。装完重启!!!
2)安装 nvidia-driver 后内屏不显示,扩展显示器正常
xorg 配置不正确,通常是这个原因
我是参考的这个: https://askubuntu.com/questions/1059965/internal-laptop-screen-not-detected-when-using-nvidia-driver
解决办法很简单
cd /etc/X11 sudo rm xorg.conf sudo cp xorg.conf.nvidia-xconfig-original xorg.conf reboot
3)Ailed to initialize NVML: Driver/library version mismatch
这个问题是因为 cuda 和 nvidia-driver 版本不匹配导致的,正常来说按照教程安装不会有这个问题,但是可能由于反复安装卸载,导致环境被弄脏了,容易有这个问题
先检查版本:
- cuda 自带的 nvidia 版本
- nvidia-driver 运行版本
Please post the output of
dpkg -l |grep nvidia
and
ls -l /usr/lib/x86_64-linux-gnu/libcuda*
cat /proc/driver/nvidia/version
最后我发现 /proc/driver/nvidia/version 和 dpkg 里安装的 version 不一致。是因为我卸载旧版本 nvidia-driver 和安装新版本 nvidia-driver 之后没有重启机器导致的。
lsmod | grep nvidia 可以看到 nvidia-driver 是以内核模块加载上来的。所以安装完驱动,最好的方式是一定要确保机器重启了