已复制
全屏展示
复制代码

NVIDIA显卡驱动、cuda、cudnn概念梳理


· 7 min read

关于如何安装cuda、cudnn详情见文章: https://yuchaoshui.com/882bffe/

一. 显卡驱动

显卡驱动是告诉系统如何使用显卡这个硬件。通常指 NVIDIA Driver 一个驱动软件。下载地址:https://www.nvidia.com/Download/index.aspx

CUDA(见后文介绍) 有两个主要的 API,分别是runtime API 和 driver API。

1.1 nvidia-smi

nvidia-smi 全称 NVIDIA System Management Interface,是 NVIDIA Management Library(NVML)构建的命令行实用工具,包含在显卡驱动(NVIDIA display driver)中。

nvidia-smi 调用的是 Driver API。最开始 Driver API 是与显卡沟通的底层 API,但是人们发现 Driver API 太过底层,由此引入了 Runtime API。

1.2 CUDA Driver API

对于 Driver API(显卡驱动程序提供) :

  • CUDA Driver 是与 GPU 沟通的驱动级别底层 API
  • 对 Driver API 的理解,有利于理解后续的 Runtime API
  • CUDA Driver 随显卡驱动发布,需要与 cuda toolkit 分开看
  • CUDA Driver 对应于 cuda.h 和 libcuda.so
  • Driver API 主要知识点是 Context 的管理机制 以及 CUDA 系列接口的开发习惯(错误检查方法),还有内存模型

runtime API 和 driver API 与其它概念之间的关系见后文图。

二. GPU & CPU

GPU(图像处理器,Graphics Processing Unit)和CPU(中央处理器,Central Processing Unit)。GPU和CPU中主要有运算单元、Control单元、Cache单元,Control单元是用在逻辑控制的,Cache单元是用来做数据缓存的。

CPU可以通过Cache来减少存取主内存的次数,也就是减少内存延迟。Control单元主要是为了通用性,复杂的逻辑控制单元可以保证CPU高效分发任务和指令,所以CPU擅长逻辑控制,是串行计算。

GPU有更多的运算单元,而Control和Cache单元不如CPU多,因为GPU在进行并行计算的时候每个运算单元都是执行相同的程序,而不需要太多的控制。GPU中Cache很小,因为GPU可以通过并行计算的方式来减少内存延迟。所以GPU擅长高强度计算,是并行计算。

三. CUDA

英文全称是Compute Unified Device Architecture,CUDA是显卡厂商NVIDIA推出的并行计算平台和编程模型,能够使得使用GPU进行通用计算变得简单和优雅,CUDA只能在NVIDIA的GPU上运行,而且只有当要解决的计算问题是可以大量并行计算的时候才能发挥CUDA的作用。

CUDA运行原理:在 CUDA 的架构下,一个程序分为host 端和 device 端。Host 端是指在 CPU 上执行的部分,而 device 端则是在GPU芯片上执行的部分(又称为kernel)。通常 host 端程序会将数据准备好后,复制到显卡的内存中,再由GPU芯片执行 device 端程序,完成后再由 host 端程序将结果从显卡的内存中取回。

总结:CUDA是一个并行计算平台和编程模型

四. CUDA Toolkit

即是实现CUDA并行计算平台和编程模型的工具箱,包含了一系列套件。包括GPU加速库,程序调试和优化工具。可以从NVIDIA官网下载,也可在通过虚拟环境管理工具conda 或者 pip下载。我们说的安装cuda一般是指安装 cuda toolkit。

  • 通过NVIDIA官网下载的CUDA toolkit中包含有如GDB,NVCC及显卡驱动等工具,安装包名称类似这样的:cuda_11.1.1_win10_network.exe。
  • 通过pip安装的cudatoolkit通常仅包括必要的库文件。

4.1 nvcc

NVCC 就是cuda编译器(NVIDIA CUDA Compiler),类似于gcc是C++的编译器一样。CUDA程序是要经过编译成可执行的二进制文件,而cuda程序有两种代码,一种是运行在cpu上的host代码,一种是运行在gpu上的device代码,所以 nvcc 编译器能够编译成两种二进制文件在不同的机器上执行。

可以从CUDA Toolkit的/bin目录中获取。

4.2 nvcc与nvidia-smi版本不一致

nvcc 与 nvidia-smi 输出cuda版本不一致问题:CUDA有两个主要的 API:runtime API 和 driver API。这两个 API 都有对应的CUDA 版本。

  • 用于支持 driver API 的必要文件(如libcuda.so)是由 GPU driver installer 安装的。nvidia-smi 就属于这一类API。
  • 用于支持 runtime API 的必要文件(如libcudart.so)是由CUDA Toolkit installer安装的。nvcc是与CUDA Toolkit一起安装的,它只知道它自身构建时的CUDA runtime版本。它不知道安装了什么版本的GPU driver,甚至不知道是否安装了GPU driver。

综上,如果 driver API 和 runtime API 的CUDA 版本不一致可能是因为你使用的是单独的 GPU driver installer,而不是 CUDA Toolkit installer 里的 GPU driver installer。

runtime API 与 driver API 的区别:runtime是更高级的封装,开发人员用起来更方便,而driver API更接近底层,速度可能会更快。

五. CUDNN

cudnn的全称是 CUDA Deep Neural Network library,是NVIDIA打造的针对深度神经网络的加速库,是一个用于深层神经网络的GPU加速库。如果你要用GPU训练模型,cuDNN不是必须的,但是一般会采用这个加速库。CUDA这个平台一开始并没有安装cuDNN库,当开发者们需要用到深度学习GPU加速时才安装cuDNN库,工作速度相较CPU快很多。

安装包类似这样:cudnn-windows-x86_64-8.8.0.121_cuda11-achive.zip

六. 概念总结

要想让你的程序跑起来,通常需要安装三个组件:

  • 显卡驱动:驱动软件,类比声卡驱动,摄像头驱动。
  • cuda toolkit:是CUDA并行计算平台和编程模型的工具箱。
  • cudnn:深度学习GPU加速时才安装加速库。

简言之,cuda是在显卡驱动之上的工具库,cudnn是在cuda之上的深度学习相关的工具库。因此,不管是做graphics(3D渲染等)还是搞深度学习,想要使用显卡都必须安装cuda,但做 graphics 的朋友就不需要安装cudnn,甚至于cudnn只不过是解压出来放在cuda文件夹里的一个文件夹。

七. 常用命令总结

# 查看cuda版本号
nvcc -V

# 查看显卡驱动cuda等信息
nvidia-smi

# 显卡版本
nvidia-smi -L

八. tensorflow 与 pytorch

在安装tensorflow和pytorch时,它实际上会同时在conda的虚拟环境里帮你安装cudatoolkit,但注意这个cudatoolkit并不能等同于系统里的cuda。原因是cudatoolkit只支持pytorch或tensorflow等部分库的使用,实际上它只是整个cuda的一部分,即pytorch的库要用到的部分。

如果你要在虚拟环境里编译其他要用到cuda的库,是没办法用到cudatoolkit的,只能用系统里的cuda。

用实际案例来解释一下:假设现在系统里安装了10.0的cuda,你在conda虚拟环境里安装了cuda10.2的pytorch1.6,那么pytorch确实可以正常使用没毛病。但是此时你需要自己编译一个同时基于pytorch和cuda的库,由于它没法用到pytorch的cudatoolkit,而只能使用系统cuda,而系统cuda版本和pytorch对应的cuda版本又不相同,那么它很有可能就会编译失败。

参考资料:

🔗

文章推荐