GPU 相关配置和使用建议
基本信息和配置方法
显卡,驱动,CUDA,cuDNN
显卡
显卡又称图形处理器(graph processing unit,GPU),是一个硬件,主要功能是图形显示和处理,现在也是深度学习里面主流的并行计算硬件。常见的有 NVIDIA 的显卡(N 卡)和 AMD 的显卡(A 卡)
GPU 和 CPU(中央处理器,Central Processing Unit)在设计上的主要差异在于 GPU 有更多的运算单元,而 Control 和 Cache 单元不如 CPU 多,这是因为 GPU 在进行并行计算的时候每个运算单元都是执行相同的程序,而不需要太多的控制。Cache 单元是用来做数据缓存的,CPU 可以通过 Cache 来减少存取主内存的次数,也就是减少内存延迟(memory latency)。GPU 中 Cache 很小或者没有,因为 GPU 可以通过并行计算的方式来减少内存延迟。因此 CPU 的 Cahce 设计主要是实现低延迟,Control 主要是通用性,复杂的逻辑控制单元可以保证 CPU 高效分发任务和指令。所以 CPU 擅长逻辑控制,是串行计算,而 GPU 擅长高强度计算,是并行计算。
驱动
驱动(Driver)是连接硬件与系统内核的底层软件,和打印机、网卡等硬件一样,显卡也需要相应的驱动才能连接到系统,从而被调用。
驱动一般是向下兼容硬件和 CUDA 的,即新版本的驱动一般可以适用于当前和过去所有版本的显卡和 CUDA,所以一般都装最新版本驱动就行。但是不同操作系统需要的驱动可能是不同的,所以仍然要选择适合当前操作系统的驱动型号。
可以通过命令 nvidia-smi
查看当前安装的驱动的版本号,以及其最高支持的 CUDA 的版本号(注意不是已经安装的 CUDA 的版本号,是最高能够支持的 CUDA 的版本号)。如果想查看各个型号的驱动和 CUDA 版本的对应关系可以参考 官网信息
Ubuntu 系统驱动安装方法
首先确认显卡硬件接口能够被正常检测到,硬件安装正常。
lspci | grep NVIDIA
会显示当前安装的显卡及其硬件厂商、型号名称/序列号和 PCI ID 信息
禁用 nouveau
-
编辑黑名单配置
vim /etc/modprobe.d/blacklist.conf
,在文件最后添加下面两行blacklist nouveau options nouveau modeset=0
-
输入下面的命令更新并重启:
update-initramfs -u
,reboot
-
重启后输入
lsmod | grep nouveau
验证是否禁用成功,成功的话这行命令不会有输出。
卸载现有驱动(如果有的话)
sudo apt-get --purge remove "*cublas*" "cuda*"
sudo apt-get --purge remove "*nvidia*"
sudo apt autoremove
利用 Ubuntu 自带的驱动管理工具进行安装
- 如果提示系统没有安装
ubuntu-drivers
的话(一般在旧版本 Ubuntu 系统会出现),可以手动安装一下,sudo apt-get install ubuntu-drivers-common
ubuntu-drivers devices
查看当前系统推荐的驱动型号(会在推荐的驱动那一行末尾显示“recommended”)ubuntu-drivers autoinstall
自动安装上面推荐的驱动,如果想安装指定版本的驱动(如nvidia-430
)可以sudo apt-get install nvidia-430
reboot
重启机器,不然会报错Failed to initialize NVML: Driver/library version mismatch
nvidia-smi
检查显卡驱动安装是否成功,成功的话会显示显卡的具体信息和运行状态
也可以到官网下载需要的驱动手动进行安装。
CUDA / cuda toolkit
CUDA 是由 NVIDIA 开发的一种用于 GPU 的通用计算的并行计算平台和编程模型。有了 CUDA,开发人员可以通过利用 gpu 的能力来显著地加快计算应用程序的速度。CUDA 只能在 NVIDIA GPU 上直接使用,AMD GPU 不能直接运行编译好的 CUDA 程序,但是它提供了一套工具集 HIPify Tools,可以自动将 CUDA 代码转换成 HIP 代码。
一开始的时候(2020 年之前),配置深度学习环境还是需要手动安装 CUDA 到系统的。但是后来主流趋势是直接在虚拟环境中通过 conda 来安装,具体安装的方法参考 PyTorch官网 或者 TensorFlow 官网。注意需要选择和当前驱动匹配的 CUDA 版本(尽可能新但是没超过显卡驱动的支持上限的版本),可以通过 nvidia-smi
查看当前驱动最高支持的 CUDA 版本。
CUDA 安装完成后可以通过 nvcc -V
确定是否安装成功以及查看版本信息。注意,如果是通过 conda 在虚拟环境下安装的 CUDA 的话,这个命令必须在该虚拟环境下运行才可以。
如果想进一步测试是否安装成功,可以在 /usr/local/cuda/extras/demo_suite
目录下找到许多测试程序供我们测试。
CuDNN
用于深度神经网络的 GPU 加速库。它强调性能、易用性和低内存开销。NVIDIA cuDNN 可以集成到更高级别的机器学习框架中,如 Caffe2,Chainer,Keras,MATLAB,MxNet,PyTorch 和 TensorFlow。简单的插入式设计可以让开发人员专注于设计和实现神经网络模型,而不必花时间在底层 GPU 性能调整上就可以在 GPU 上实现高性能现代并行计算。
如果要用 GPU 训练模型,cuDNN 不是必须的,但是一般都会采用这个加速库,而且也不用单独去安装它,安装深度学习框架(如 PyTorch)的时候一般会自动安装。
更多配置
Persistence Mode
在使用 GPU 设备前,必须先加载 NVIDIA 内核模式驱动并连接到目标 GPU 设备。通常,如果内核模式驱动尚未加载,当用户调用 gpu 的时候会先加载驱动并对 GPU 执行初始化,这个过程对用户是透明的。当所有调用 GPU 的程序运行完成后,驱动程序会取消 GPU 的初始化状态。驱动加载行为会造成两个问题:(1)应用程序启动延迟 : 应用程序触发的 GPU 初始化过程中,每个 GPU 会由于要刷新 ECC 造成一个短暂的延迟 (约 1-3 秒)。如果 GPU 已经经过了初始化,不会再执行该步骤。比较明显的示例是,当我们安装完驱动重启系统后第一次执行 nvidia-smi 命令时会卡住一段时间才会显示结果。(2)Preservation of driver state : 如果驱动程序将 GPU 恢复到未初始化状态,则该 GPU 某些非持久状态会丢失,并恢复到默认配置,直到下次进入到 persistence mode,为了避免这种情况,GPU 应该始终保持在 persistence mode。
在那些开启桌面服务的系统中(如 windows 系统或者安装了 X 桌面的 Linux 系统),显卡驱动会在开机时自动加载,关机自动卸载。在那些关闭图形服务的机器上 (headless systems,如常用服务器) ,显卡的驱动程序在 GPU 程序开始运行时加载,程序关闭时卸载。如果驱动的 load/unload 频率过高,则 CPU 访问 PCIe config registers 时间过长导致 softlock,如此则会导致 GPU 挂掉。那么,如果我们搞一个驻留小程序在 GPU 上持续运行,占用 GPU 资源极小,但是又可以保持驱动不会被卸载,是不是就可以了?是的,而且英伟达官方也提供了这样一个工具,叫做 Persitence Mode。Persistence Mode 默认是 Off/关闭状态。为了解决上述问题,可以手动开启 Persistence Mode。开启之后,GPU 的响应速度会变快,但是待机功耗会增加一点。
可以通过 nvidia-smi
查看 persistence mode 的开启情况(Persistence-M
项)
NVIDIA 提供了 两种方法 来设置 GPU 的 Persistence Mode:
Persistence Daemon
推荐,通过一个守护进程来保持 persistence mode 的开启(以下命令需要以管理员权限运行)
sudo useradd nvidia-persistence
添加一个用于守护进程的用户sudo nvidia-persistenced --user nvidia-persistence
,开启守护进程- 可能会报错
nvidia-persistenced failed to initialize. Check syslog for more details
,但是用top -u nvidia-persistence
看一眼相关进程有没有运行,只要运行着就行
- 可能会报错
- 如果想关闭 persistence mode 可以运行
sudo nvidia-smi -pm 0
。 - 更多帮助信息参考
nvidia-persistenced --help
或者man nvidia-persistenced
Persistence Mode (Legacy)
不推荐,即将废弃的老方法(仅临时有效,重启失效)
- 为编号为 i 的 GPU 开启 persistence mode:
nvidia-smi -i <target gpu> -pm ENABLED
(ENABLED
参数等价于1
,相反,DISABLED
参数等价于 0) - 如果希望系统启动后自动进入 persistence mode,可以将以上命令加入
/etc/rc.d/rc.local
系统自启动列表 - 为所有 GPU 开启 persistence mode:
nvidia-smi -pm 1
Auto-launch service
另外还有一个网上找到基于自启动 service 的方法
- 查看是否存在文件
/lib/systemd/system/nvidia-persistenced.service
,如果没有就手动创建并写入:
[Unit]
Description=NVIDIA Persistence Daemon
After=syslog.target
[Service]
Type=forking
PIDFile=/var/run/nvidia-persistenced/nvidia-persistenced.pid
Restart=always
ExecStart=/usr/bin/nvidia-persistenced --verbose
ExecStopPost=/bin/rm -rf /var/run/nvidia-persistenced/*
TimeoutSec=300
[Install]
WantedBy=multi-user.target
- 设置服务自启动:
sudo systemctl enable nvidia-persistenced.service
- 立刻开启服务:
sudo systemctl start nvidia-persistenced.service