基础概念

显卡/显卡驱动

显卡(Video card,Graphics card)全称显示接口卡,又称显示适配器,是计算机最基本配置、最重要的配件之一,由GPU、显存等组成。(与之类似的概念还有网卡,声卡等)显卡是电脑进行数模信号转换的设备,承担输出显示图形的任务。具体来说, 显卡负责将电脑的数字信号转换成模拟信号让显示器显示出来。

早期显卡一般都是集成在主板上,只完成最基本的信号输出工作,并不用来处理数据。后续发展才出现了独立显卡,显卡因此分为了独立显卡和集成显卡。集成显卡是指集成在主板上,因此不能随意更换。而独立显卡是作为一个独立的器件插在主板的AGP接口上的,可以随时更换升级。另外,集成显卡使用物理内存,而独立显卡有自己的显存。一般而言,同期推出的独立显卡的性能和速度要比集成显卡好、快。目前主流的游戏笔记本通常都配有一个集成显卡和一个独立显卡,轻薄笔记本则可能只有一个集成显卡。

显卡是硬件设备,必须在电脑的软件层面安装对应的显卡驱动,显卡驱动需要正确地与特定型号的显卡硬件匹配才能正常工作。制造商会为每款显卡发布相应的驱动程序。如果没有安装正确的驱动程序,操作系统可能无法识别显卡,或者显卡功能可能会受到限制。

NVIDIA的显卡驱动包含了两个平行版本:game ready和studio,顾名思义一个针对游戏优化,一个针对使用显卡加速的软件优化,也有的说一个相当于预览版,另一个相当于稳定版。

GPU

GPU(Graphic Processing Unit,图形处理单元)是图形处理器,一般GPU就是直接焊接在显卡上的,是显卡上的一块芯片,就像CPU是主板上的一块芯片。大部分情况下,我们所说GPU就等同于指显卡,但是实际情况是GPU是显示卡的“大脑”,是显卡的一个核心零部件,核心组成部分。GPU本身并不能单独工作,只有配合上附属电路和接口,才能工作。这时候,它就变成了显卡。

GPU的功能经过了以下几个阶段的发展,显卡厂商 NVIDIA 在其中发挥了主要的推动作用:

  • 仅用于图形渲染,此功能是GPU的初衷,这一点从它的名字就可以看出:Graphic Processing Unit,图形处理单元。
  • 后来人们发现,GPU这么一个强大的器件只用于图形处理太浪费了,它应该用来做更多的工作,例如浮点运算。怎么做呢?直接把浮点运算交给GPU是做不到的,因为它在当时只能用于图形处理。最容易想到的,是把浮点运算做一些处理,打包伪装成图形渲染任务,然后交给GPU来做。这就是 GPGPU(General Purpose GPU)的概念。不过这样做有一个缺点,就是你必须有一定的图形学知识,否则你不知道如何包装。
  • 为了让不擅长图形学的人也能利用GPU强大的算力,NVIDIA提出了CUDA,CUDA提供了一给通用的运算平台,使对GPU的使用不再局限于图形处理,可以扩展到更多的并行计算领域。

GPU通常用来和CPU进行比较:CPU相当于有几个高手,它们每时每刻都在给你执行各种复杂的任务,是电脑真正的大脑;GPU则相当于有一个军团,里面的士兵的能力没有CPU中的高手那么强,只能执行一些简单的任务,是显卡的大脑,但是胜在量大,如果一个任务可以分解为成百上千个平行的简单任务,那么GPU中的士兵就可以每个人分一个简单任务,同时工作,将大任务迅速完成。

CPU对GPU是绝对的领导关系:CPU中的高手打包一个大任务,然后发送给GPU,安排GPU中的士兵们去执行。安排给GPU执行的大任务在早期通常是与图形渲染和显示相关的,这也是GPU的本职工作,后期随着GPU算力的迅速发展以及CUDA的发布,一些并行的计算任务也被安排给GPU来计算。

CUDA

CUDA(Compute Unified Device Architecture)是NVIDIA推出的通用的并行的运算平台,它提供了一种并行计算的编程模型,使开发人员能够利用 GPU 中的大量线程并行执行任务。

CUDA 平台包括 CUDA 编程语言、CUDA 编译器、CUDA 运行时和库以及用于管理 GPU 资源和执行 CUDA 程序的工具,其中

  • CUDA 编程语言主要基于标准的 C/C++,但是提供了额外的语法和库函数来描述并行计算任务。
  • CUDA 编译器能够将 CUDA 代码编译为针对 GPU 架构优化的机器码。CUDA 运行时库提供了与 GPU 交互的接口,包括内存管理、线程同步和并行计算等功能。

CUDA的存在,使得用户可以方便地开发CUDA程序,利用GPU强大的并行计算能力,而不再需要像以前那样先将计算任务打包伪装成图形渲染任务,再交由GPU处理。

并不是所有GPU都支持CUDA,只有NVIDIA自家的GPU才支持,并且显卡和显卡驱动(CUDA driver)的版本不能太低,如果希望安装指定版本的CUDA,那么对显卡驱动有最低版本要求,显卡驱动是向前兼容的。在安装了NVIDIA显卡的电脑上,使用下面的命令可以查看显卡版本,驱动版本和当前显卡支持的最高CUDA版本(这并不代表CUDA已经完整安装,只是安装了驱动层面的工具)

1
$ nvidia-smi

nvidia-smi全程是NVIDIA System Management Interface ,它是一个NVIDIA提供的命令行实用工具,旨在帮助管理和监控NVIDIA GPU设备。在我的电脑上完整输出如下

1
2
3
4
5
6
7
8
9
10
11
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 551.76 Driver Version: 551.76 CUDA Version: 12.4 |
|-----------------------------------------+------------------------+----------------------+
| GPU Name TCC/WDDM | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+========================+======================|
| 0 NVIDIA GeForce RTX 4060 ... WDDM | 00000000:01:00.0 Off | N/A |
| N/A 42C P8 6W / 55W | 0MiB / 8188MiB | 0% Default |
| | | N/A |
+-----------------------------------------+------------------------+----------------------+

这里GPU的型号为: NVIDIA GeForce RTX 4060,显示的CUDA版本是driver API层面的CUDA版本。

如果安装了CUDA,可以用下面的命令查看版本

1
$ nvcc --version

这里NVCC是CUDA中的典型代表,概念类似于GCC编译器,显示的CUDA版本是cuda toolkit所对应runtime API层面的版本,可以和runtime API层面的CUDA版本不一致。

CUDNN

CUDNN(CUDA Deep Neural Network library)是NVIDIA开发的用于深度神经网络的加速库。

它提供了高效的实现,用于在 NVIDIA GPU 上加速深度神经网络(DNN)的训练和推理。CUDNN 提供了针对各种常见深度学习任务的高性能、低级别的 GPU 加速原语,包括卷积、池化、归一化、激活函数等。

CUDNN 提供了针对 NVIDIA CUDA 平台的优化实现,可以充分利用 GPU 的并行计算能力,加速深度学习模型的训练和推理过程。它支持各种深度学习框架,如 TensorFlow、PyTorch、Caffe 等,使这些框架能够利用 GPU 的性能优势进行深度学习任务。

CUDA可以看作是一个工作台,上面提供了很多工具,如锤子、螺丝刀等。cuDNN就相当于是位于该工作台上的一把为深度学习框架定制的扳手,这个扳手在Pytorch的基本使用中并不需要,但是对于某些高级使用,例如自定义算子并使用CUDNN加速,则是需要的单独安装的。

下载安装

CUDA下载

第一个问题,NVIDIA官方下载的CUDA到底包含了什么?

NVIDIA官网下载的CUDA是一整套工具链,它包含了驱动,以及通常意义下的CUDA Toolkit:

  • cuda runtime 运行时

  • 各种库(但是尤其不含CUDNN)

  • 各种编译开发工具,例如nvcc编译器

将这些合在一起称为完整的CUDA。这里面的驱动其实可以单独下载,并且在电脑上其实早已经安装了显卡驱动。

第二个问题,conda自动下载的CUDA又是什么?

anaconda可以用来安装pytorch等使用CUDA的机器学习框架,根据官方推荐的命令下载pytorch时,conda会自动安装CUDA toolkit,但是这个名字是具有迷惑性的,因为相对于NVIDIA官方提供的CUDA是极其不完整的,只包含pytorch运行所需要的动态库,尤其不含驱动,只要电脑自带的显卡驱动版本足够高,就可以正常使用。通常pytorch需要这些就够了,但是如果需要进一步的使用CUDA,则需要安装NVIDIA的完整版CUDA和CUDNN。

搞清楚这些概念比较麻烦,下载安装时却很简单,只需要注意版本即可,安装中需要提供一个临时目录,在安装完成之后这个临时目录会被自动删除。

直接去官网可以无脑安装最新版CUDA:CUDA Toolkit 12.4 Downloads | NVIDIA Developer

因为我的电脑的显卡和显卡驱动都足够新,直接选择最新版CUDA 12.4,检查CUDA的版本是匹配的。安装完成之后,可以检查nvcc的版本。

Pytorch下载

pytorch本身是有cpu版和gpu版的区分的,gpu版本的pytorch在版本描述中带有cuda和cudnn。

pytorch官网提供的基于conda的 安装命令 如下:(可以用一个单独的conda环境来配置pytorch)

  • cpu版本的安装命令(可以看到多了cpuonly这个模块)
1
$ conda install pytorch torchvision torchaudio cpuonly -c pytorch
  • gpu版本的安装命令
1
$ conda install pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch -c nvidia

解释如下:

  1. pytorch torchvision torchaudio: 实际安装的几个python包
    • pytorch: 是 PyTorch 深度学习库,提供张量计算和自动求导等基础功能。
    • torchvision: 是 PyTorch 的一个子模块,专门用于视觉处理任务。
    • torchaudio: 是 PyTorch 的另一个子模块,专门用于音频处理任务。
  2. -c pytorch -c nvidia: 这是指定要从哪些渠道或源中获取资源
    • -c pytorch: 表示从 PyTorch 的官方渠道获取软件包。
    • -c nvidia: 表示从 NVIDIA 的渠道获取与 CUDA 相关的软件包。
  3. pytorch-cuda=12.1: 这指定了 PyTorch 库要与 CUDA 12.1 版本一起使用,注意PyTorch的官网命令中CUDA只有有限的几个版本号,并且不是最新的,这没有问题。

正如前文所说,PyTorch 其实并不需要单独手动安装CUDA和CUDNN,除非涉及到更高级的使用情形,因此这里安装了CUDA,但是没有安装CUDNN。PyTorch 对Python版本也有要求,版本不能太低了,至少python>=3.8,这里直接选择最新版3.12。

PyTorch 可以跑一段脚本来检测当前环境是否支持使用CUDA

1
2
3
4
5
6
7
8
9
10
11
12
import torch
flag = torch.cuda.is_available()
if flag:
print("CUDA可使用")
else:
print("CUDA不可用")

ngpu= 1
# Decide which device we want to run on
device = torch.device("cuda:0" if (torch.cuda.is_available() and ngpu > 0) else "cpu")
print("驱动为:",device)
print("GPU型号: ",torch.cuda.get_device_name(0))