ubuntu下的GPU环境配置
Nvidia diver是最基础的跟硬件直接交互的底层软件,cuda依赖于driver,cuDNN依赖于cuda,tensorRT最终模型的推理加速依赖于前面这些基础的加速环境。
搜索显卡
下面指令分别是查看集成显卡和查看NVIDIA显卡1
2lspci | grep VGA
lspci | grep NVIDIA
1 GPU驱动安装
ubuntu显卡驱动安装有四中方法:
- 通过ubuntu仓库安装
- 在英伟达官网选择相应版本的驱动安装
- 在ubuntu软件和更新界面的附加驱动中安装
- -添加ppa源安装
1.1 ubuntu仓库安装
只需要一条指令即可安装成功,成功安装后需要重启
1 | sudo ubuntu-drivers autoinstall |
1 | nvidia-smi #若出现电脑GPU信息则成功 |
1.2 离线驱动安装
首先进入英伟达官网
下载网址;https://www.nvidia.cn/Download/index.aspx?lang=cn
安装完成后nvidia-smi查看驱动信息
1.3 附加驱动安装方法
更新软件源
在其他站点中选择清华源,更新后终端执行
1 | sudo apt-get update |
安装驱动:菜单栏选择附加驱动,会进行自动搜索,选择一个版本的专有驱动,点击应用更改,更改后重启即可,
1.4 ppa仓库安装
(1)首先禁用nouveau
1 | sudo gedit /etc/modprobe.d/blacklist.conf |
在最后一行添加
1 | blacklist nouveau |
(2)执行以下指令
1 | sudo apt-get remove --purge nvidia* |
2 深度学习环境
2.1 cuda安装
什么是CUDA
2006年11月,NVIDIA推出了CUDA,这是一个通用的并行计算平台和编程模型,它利用NVIDIA gpu中的并行计算引擎,以比CPU更高效的方式解决许多复杂的计算问题。
2.1.1 下载cuda
这里下载的是11.4.0
按照官方的提示下载并运行run文件
1 | wget https://developer.download.nvidia.com/compute/cuda/11.4.0/local_installers/cuda_11.4.0_470.42.01_linux.runsudo sh cuda_11.4.0_470.42.01_linux.run |
按装出现下面提示,输入accept
由于上面已经安装过显卡的驱动了。这里把驱动安装取消(空格键)其他都选择上
2.1.2 设置权限
1 | sudo chmod -R 755 /usr/local/cuda-11.4 |
安装完成后会有一个连接文件/usr/local/cuda
指向真正的/usr/local/cuda-11.4
2.1.3 配置环境变量
可以在~/.bashrc中加入环境变量
1 | export CUDA_HOME=/usr/local/cuda |
2.1.4 验证安装
1 | nvcc -V |
版本信息
1 | cat /usr/local/cuda/version.json |
2.2 cuDNN安装
2.2.1 什么是cudnn
NVIDIA CUDA深度神经网络库(cuDNN)是一个用于深度神经网络的gpu加速库。cuDNN为标准例程提供了高度优化的实现,比如前向卷积、后向卷积、池化、归一化和激活层。cuDNN是NVIDIA深度学习SDK的一部分。
2.2.2 CUDA与CUDNN的关系
CUDA看作是一个工作台,上面配有很多工具,如锤子、螺丝刀等。cuDNN是基于CUDA的深度学习GPU加速库,有了它才能在GPU上完成深度学习的计算。它就相当于工作的工具,比如它就是个扳手。但是CUDA这个工作台买来的时候,并没有送扳手。想要在CUDA上运行深度神经网络,就要安装cuDNN,就像你想要拧个螺帽就要把扳手买回来。这样才能使GPU进行深度神经网络的工作,工作速度相较CPU快很多。
2.2.3 cudnn对cuda的影响
从官方安装指南可以看出,只要把cuDNN文件复制到CUDA的对应文件夹里就可以,即是所谓插入式设计,把cuDNN数据库添加CUDA里,cuDNN是CUDA的扩展计算库,不会对CUDA造成其他影响。
2.2.4 cudnn版本
根据下图描述,各个版本的对应关系如上面的链接
下图是最新的cudnn8.3.3的对应关系,历史版本的对应关系在 NVIDIA cuDNN Archives. 的个版本的cudnn support Matrix中
从下图看出cudnn8.3.3支持的硬件和对应的cuda版本还有算力(SM)
2.2.5 cudnn下载
这里选择的是cudnn-linux-x86_64-8.4.0.27_cuda11.6-archive.tar.xz
2.2.5 cudnn安装
1 | tar -xvf cudnn-linux-x86_64-8.4.0.27_cuda11.6-archive.tar.xz |
1 | sudo cp include/cudnn*.h /usr/local/cuda-11.4/include |
2.2.3 cuDNN版本查看
1 | cat /usr/local/cuda/include/cudnn_version.h |
2.3 nvcc 和nvidia-smi
nvcc 属于CUDA的编译器,将程序编译成可执行的二进制文件,nvidia-smi 全称是 NVIDIA System Management Interface ,是一种命令行实用工具,旨在帮助管理和监控NVIDIA GPU设备。
CUDA有 runtime api 和 driver api,两者都有对应的CUDA版本, nvcc —version 显示的就是前者对应的CUDA版本,而 nvidia-smi显示的是后者对应的CUDA版本。
用于支持driver api的必要文件由 GPU driver installer 安装,nvidia-smi就属于这一类API;而用于支持runtime api的必要文件是由 CUDA Toolkit installer 安装的。nvcc是与CUDA Toolkit一起安装的CUDA compiler-driver tool,它只知道它自身构建时的CUDA runtime版本,并不知道安装了什么版本的GPU driver,甚至不知道是否安装了GPU driver。
CUDA Toolkit Installer通常会集成了GPU driver Installer,如果你的CUDA均通过CUDA Tooklkit Installer来安装,那么runtime api 和 driver api的版本应该是一致的,也就是说, nvcc —version 和 nvidia-smi 显示的版本应该一样。否则,你可能使用了单独的GPU driver installer来安装GPU dirver,这样就会导致 nvidia-smi 和 nvcc —version 显示的版本不一致了。
通常,driver api的版本能向下兼容runtime api的版本,即 nvidia-smi 显示的版本大于nvcc —version 的版本通常不会出现大问题。
CUDA有两个主要的API:runtime(运行时) API和driver API。这两个API都有对应的CUDA版本(如9.0和11.1等)。
用于支持driver API的必要文件(如libcuda.so)是由GPU driver installer安装的。nvidia-smi就属于这一类API。
用于支持runtime API的必要文件(如libcudart.so以及nvcc)是由CUDA Toolkit installer安装的。(CUDA Toolkit Installer有时可能会集成了GPU driver Installer)。nvcc是与CUDA Toolkit一起安装的CUDA compiler-driver tool,它只知道它自身构建时的CUDA runtime版本。它不知道安装了什么版本的GPU driver,甚至不知道是否安装了GPU driver。
综上,如果driver API和runtime API的CUDA版本不一致可能是因为你使用的是单独的GPU driver installer,而不是CUDA Toolkit installer里的GPU driver installer。
runtime和driver API区别
runtime和driver API在很多情况非常相似,也就是说用起来的效果是等价的,但是你不能混合使用这两个API,因为二者是互斥的。也就是说在开发过程中,你只能选择其中一种API。简单理解二者的区别就是:runtime是更高级的封装,开发人员用起来更方便,而driver API更接近底层,速度可能会更快。
也就是说driver 与runtime并不是一一对应的哦,CUDA Toolkit(runtime)本质上只是一个工具包而已,所以我可以在同一个设备上安装很多个不同版本的CUDA Toolkit,比如同时安装了CUDA 9.0、CUDA 9.2、CUDA 10.0三个版本。既然NVIDIA显卡驱动和CUDA Toolkit本身是不具有捆绑关系的,也不是一一对应的关系,那为啥我们总是傻傻分不清楚呢。。。因为离线安装的CUDA Toolkit会默认携带与之匹配的最新的驱动程序!!!
这也就能解释,为啥NVIDIA的官网里同时有
CUDA Toolkit
和
NVIDIA Driver
两种下载了
2.4 pytorch匹配的版本选择
那么 nvcc —version 与 nvidia-smi 的版本不一致的情况下,有些朋友可能就会懵了:我该如何选择与CUDA版本匹配的Pytorch呢?(炼个丹也太南了吧~!)
其实,只要上去Pytorch官网瞄瞄,细心的你应该能够发现在命令中指定CUDA版本时,用的是 cudatoolkit,而 nvcc —version 显示的版本就是通过CUDA Toolkit Installer在安装时决定的,因此,我们应该选择与 nvcc —version 对应的CUDA版本匹配的Pytorch。
3 nvidia-smi
参考:https://www.jianshu.com/p/ceb3c020e06b
3.1 nvidia-smi介绍
nvidia-sim简称NVSMI,提供监控GPU使用情况和更改GPU状态的功能,是一个跨平台工具,支持所有标准的NVIDIA驱动程序支持的Linux和WindowsServer 2008 R2 开始的64位系统。这个工具是N卡驱动附带的,只要装好驱动,就会有这个命令
3.2 nvidia-smi常用命令介绍
3.2.1 显示GPU当前的状态:nvidia-smi
表格参数详解:
- GPU:本机中的GPU编号(有多块显卡的时候,从0开始编号)图上GPU的编号是:0
- Fan:风扇转速(0%-100%),N/A表示没有风扇
- Name:GPU类型,图上GPU的类型是:Tesla T4
- Temp:GPU的温度(GPU温度过高会导致GPU的频率下降)
- Perf:GPU的性能状态,从P0(最大性能)到P12(最小性能),图上是:P0
- Persistence-M:持续模式的状态,持续模式虽然耗能大,但是在新的GPU应用启动时花费的时间更少,图上显示的是:off
- Pwr:Usager/Cap:能耗表示,Usage:用了多少,Cap总共多少
- Bus-Id:GPU总线相关显示,domain:bus:device.function
- Disp.A:Display Active ,表示GPU的显示是否初始化
- Memory-Usage:显存使用率
- Volatile GPU-Util:GPU使用率
- Uncorr. ECC:关于ECC的东西,是否开启错误检查和纠正技术,0/disabled,1/enabled
- Compute M:计算模式,0/DEFAULT,1/EXCLUSIVE_PROCESS,2/PROHIBITED
- Processes:显示每个进程占用的显存使用率、进程号、占用的哪个GPU
3.2.2 隔几秒刷新一下显存状态:nvidia-smi -l 秒数
隔两秒刷新一下GPU的状态:nvidia-smi -l 2
3.2.3 将监控结果写入文件
1 | nvidia-smi -l 1 --format=csv --filename=report.csv --query-gpu=timestamp,name,index,utilization.gpu,memory.total,memory.used,power.draw |
- -l:隔多久记录一次,命令中写的是1
- —format:结果记录文件格式是csv
- —filename: 结果记录文件的名字
- —query-gpu:记录哪些数据到csv文件
- timestamp:时间戳
- memory.total:显存大小
- memory.total:显存使用了多少
- utilization.gpu:GPU使用率
- power.draw:显存功耗,对应Pwr:Usage
上面是显存监控中常用的几个命令,如果还有什么参数想了解,可以通过:
nvidia-smi -h 命令查看
如果想调整结果记录文件的字段,可以通过下面的命令查看对应的字段:
nvidia-smi —help-query-gpu
3.2.4 命令参考网址
https://nvidia.custhelp.com/app/answers/detail/a_id/3751
4 TensorRT安装
EA 版本代表抢先体验(在正式发布之前)。
GA 代表通用性。 表示稳定版,经过全面测试。