GPU相关概念
概念
显卡
:显卡,是图形处理单元(GPU)的简称,是独立的处理单元,可以进行图像处理和计算,硬件设备。CUDA
:英文全称是Compute Unified Device Architecture
,是显卡厂商 NVIDIA 推出的运算平台。按照官方的说法是,CUDA 是一个并行计算平台和编程模型,能够使得使用 GPU 进行通用计算变得简单和优雅。对于 GPU 本身的编程,使用的是CUDA
语言来实现的。但是,在我们使用 PyTorch 编写深度学习代码时,使用的CUDA
又是另一个意思。在 PyTorch 使用CUDA
表示要开始要求我们的模型或者数据开始使用 GPU 了。- 我们使用 GPU 时使用的是
.cuda()
而不是使用.gpu()
。这是因为当前 GPU 的编程接口采用 CUDA,但是市面上的 GPU 并不是都支持 CUDA,只有部分 NVIDIA 的 GPU 才支持,AMD 的 GPU 编程接口采用的是 OpenCL,在现阶段 PyTorch 并不支持。 - 数据在 GPU 和 CPU 之间进行传递时会比较耗时,我们应当尽量避免数据的切换。
- GPU 运算很快,但是在使用简单的操作时,我们应该尽量使用 CPU 去完成。
- 当我们的服务器上有多个 GPU,我们应该指明我们使用的 GPU 是哪一块,如果我们不设置的话,tensor.cuda()方法会默认将 tensor 保存到第一块 GPU 上,等价于 tensor.cuda(0),这将有可能导致爆出
out of memory
的错误。
- 我们使用 GPU 时使用的是
NVCC
:CUDA
的编译器,可以从CUDA Toolkit
的/bin
目录中获取,类似于gcc
就是c
语言的编译器。由于程序是要经过编译器编程成可执行的二进制文件,而cuda
程序有两种代码,一种是运行在cpu
上的host
代码,一种是运行在gpu
上的device
代码,所以nvcc
编译器要保证两部分代码能够编译成二进制文件在不同的机器上执行。是CUDA Toolkit
中的一部分CUDA Driver
: 运行CUDA
应用程序需要系统至少有一个具有CUDA
功能的GPU
和与CUDA
工具包兼容的驱动程序。CUDA Driver
是向后兼容的,这意味着根据 CUDA 的特定版本编译的应用程序将继续在后续发布的Driver
上也能继续工作。cudnn
:专门为深度学习计算设计的软件库,里面提供了很多专门的计算函数,如卷积等。还有很多其他的软件库和中间件,包括实现c++ STL
的thrust
、实现gpu
版本blas
的cublas
、实现快速傅里叶变换的cuFFT
、实现稀疏矩阵运算操作的cuSparse
以及实现深度学习网络加速的 cuDNN 等等CUDA Toolkit
: (nvidia):CUDA
完整的工具安装包,其中提供了Nvidia
驱动程序、开发CUDA
程序相关的开发工具包等可供安装的选项。包括CUDA
程序的编译器、IDE、调试器等,CUDA 程序所对应的各式库文件以及它们的头文件。nvidia
的cudaToolkit
会安装对应显卡驱动,.deb
安装包会默认安装,.run
会询问是否安装。CUDA Toolkit (Pytorch)
:CUDA
不完整的工具安装包,其主要包含在使用CUDA
相关的功能时所依赖的动态链接库。不会安装驱动程序。gpu架构
指的是硬件的设计方式,例如流处理器簇中有多少个 core、是否有 L1 or L2 缓存、是否有双精度计算单元等等。每一代的架构是一种思想,如何去更好完成并行的思想芯片
:就是对上述 gpu 架构思想的实现,例如芯片型号 GT200 中第二个字母代表是哪一代架构,有时会有 100 和 200 代的芯片,它们基本设计思路是跟这一代的架构一致,只是在细节上做了一些改变,例如 GK210 比 GK110 的寄存器就多一倍。有时候一张显卡里面可能有两张芯片,Tesla k80 用了两块 GK210 芯片。这里第一代的 gpu 架构的命名也是 Tesla,但现在基本已经没有这种设计的卡了,下文如果提到了会用 Tesla 架构和 Tesla 系列来进行区分。显卡系列
:在本质上并没有什么区别,只是 NVIDIA 希望区分成三种选择,GeForce 用于家庭娱乐,Quadro 用于工作站,而 Tesla 系列用于服务器。Tesla 的 k 型号卡为了高性能科学计算而设计,比较突出的优点是双精度浮点运算能力高并且支持 ECC 内存,但是双精度能力好在深度学习训练上并没有什么卵用,所以 Tesla 系列又推出了 M 型号来做专门的训练深度学习网络的显卡。需要注意的是 Tesla 系列没有显示输出接口,它专注于数据计算而不是图形显示。GeForce的显卡型号
:是不同的硬件定制,越往后性能越好,时钟频率越高显存越大,即 G/GS<GT<GTS<GTX。
注:CUDA Toolkit 完整和不完整的区别:在安装了 CUDA Toolkit (Pytorch)后,只要系统上存在与当前的 cudatoolkit 所兼容的 Nvidia 驱动,则已经编译好的 CUDA 相关的程序就可以直接运行,不需要重新进行编译过程。如需要为 Pytorch 框架添加 CUDA 相关的拓展时(Custom C++ and CUDA Extensions),需要对编写的 CUDA 相关的程序进行编译等操作,则需安装完整的 Nvidia 官方提供的 CUDA Toolkit。
conda 与 nvidia 官方提供的 cudatoolkit 的区别
Nvidia 官方提供的 CUDA Toolkit 是一个完整的工具安装包,其中提供了 Nvidia 驱动程序、开发 CUDA 程序相关的开发工具包等可供安装的选项。使用 Nvidia 官网提供的 CUDA Toolkit 可以安装开发 CUDA 程序所需的工具,包括 CUDA 程序的编译器、IDE、调试器等,CUDA 程序所对应的各式库文件以及它们的头文件。
Nvidia 官方提供安装的 CUDA Toolkit 包含了进行 CUDA 相关程序开发的编译、调试等过程相关的所有组件。但对于 Pytorch 之类的深度学习框架而言,其在大多数需要使用 GPU 的情况中只需要使用 CUDA 的动态链接库支持程序的运行( Pytorch 本身与 CUDA 相关的部分是提前编译好的 ),就像常见的可执行程序一样,不需要重新进行编译过程,只需要其所依赖的动态链接库存在即可正常运行。故而,Anaconda 在安装 Pytorch 等会使用到 CUDA 的框架时,会自动为用户安装 cudatoolkit,其主要包含应用程序在使用 CUDA 相关的功能时所依赖的动态链接库。在安装了 cudatoolkit 后,只要系统上存在与当前的 cudatoolkit 所兼容的 Nvidia 驱动,则已经编译好的 CUDA 相关的程序就可以直接运行,而不需要安装完整的 Nvidia 官方提供的 CUDA Toolkit .
通过 Anaconda 安装的应用程序包位于安装目录下的 /pkg 文件夹中,如笔者的目录即为 /home/xxx/anaconda3/pkgs/ ,用户可以在其中查看 conda 安装的 cudatoolkit 的内容,如下图所示。可以看到 conda 安装的 cudatoolkit 中主要包含的是支持已经编译好的 CUDA 程序运行的相关的动态链接库。 严格说 Linux 下面其实没有动态连接库一说,Windows 下面是 DLL 文件(dynamic link library),而 Linux 下面类似的概念是 SO 文件(sharing object)

计算指标与矩阵运算
FLOPS
:"FLOPS" 是 "Floating Point Operations Per Second" 的缩写,意为每秒浮点运算次数。它是衡量计算机系统或处理器性能的一种常见指标,特别是在科学计算、工程领域和高性能计算中。例如,一个处理器的性能为 1 TFLOPS,意味着它可以每秒执行 1 万亿次浮点运算。Latency
生成第一个 Token 的时间(Time To First Token (TTFT)
生成每一个输出 Token 的时间(Time Per Output Token (TPOT)
Latency = TTFT + TPOT *(要生成的 Token 数 - 1)
Latency 可以转换为 Tokens Per Second (TPS):TPS = (the number of tokens to be generated) / Latency。
优化:
- 通信时延对 MACs 的影响 >> 优化带宽
- Batch Size 大小与内存大小 >> 多级缓存设计