CUDA 软件栈

CUDA 软件栈

深度学习等项目通常需要 GPU 的支持,而 CUDA 负责连接程序与硬件 GPU。CUDA 是由 NVIDIA 推出的一种通用并行计算架构,既是一种并行计算平台,也是一种编程模型。该架构使 GPU 能够解决复杂的计算问题。CUDA 的英文全称是 Compute Unified Device Architecture

要正确配置 CUDA 环境,我们需要先了解程序是如何利用 GPU 运行的。CUDA 的软件栈(software stack)如下图所示:

如上图,在编写 GPU 程序时,我们可以选择不同的方式与 GPU 交互:可以使用 CUDA Libraries 的高性能实现,调用 CUDA Runtime 提供的 API,或者直接调用底层的 CUDA Driver API。

  • CUDA Libraries:包括 CUDA 提供的高性能函数库,用于简化开发者的工作。常见的库有:

    • cuBLAS:基本线性代数子程序库,用于矩阵计算。
    • cuDNN:深度学习库,为神经网络提供优化支持。
  • CUDA RuntimeCUDA 运行时 API,提供对 GPU 的高层次控制,可以通过定义 Kernel 函数实现并行计算,简化了与 GPU 的交互。

  • CUDA DriverCUDA 驱动 API,位于 Runtime API 的底层,直接与 GPU 硬件交互,适合高级用户进行定制化开发,例如动态加载模块等。

概念介绍

显卡

GPU 是显卡上的一块芯片,这也就是我们需要操纵的硬件部分。对于该部分需要了解的是,不同的N卡具有不同的计算能力(Compute Capability),这是直接与 GPU 挂钩的。不同型号 GPU 的计算能力见官网

显卡驱动

显卡驱动是显卡与计算机连接的桥梁,可以让计算机识别到 GPU 硬件,因此必须正确安装。

NVIDIA Driver 是 NVIDIA 显卡的驱动软件。对于家用电脑,一般可以先在 官网 下载并安装显卡驱动。
下载后,可以通过命令查看驱动信息,如下图所示:

由图可知,当前驱动的版本为 550.107.02,同时发现 CUDA Version12.4。这是因为 CUDA Driver 包含在驱动程序中,也就是说此时已经下载了上一部分提到的 CUDA Driver 层,版本为 12.4

CUDA Toolkit

CUDA Toolkit 由以下组件组成:

  • CompilerCUDA-CCUDA-C++ 编译器 NVCC 位于 bin/ 目录中。它建立在 NVVM 优化器之上,而 NVVM 优化器本身构建在 LLVM 编译器基础结构之上。开发人员可以使用 nvvm/ 目录下的 Compiler SDK 直接针对 NVVM 进行开发。

  • Tools:提供一些工具,例如 profilerdebuggers,这些工具可以从 bin/ 目录中获取。

  • Libraries:以下列出的一些科学库和实用程序库可以在 lib/ 目录中使用(Windows 上的 DLL 位于 bin/ 中),它们的接口位于 include/ 目录中:

    • cudart:CUDA Runtime
    • cudadevrt:CUDA device runtime
    • cupti:CUDA profiling tools interface
    • nvml:NVIDIA management library
    • nvrtc:CUDA runtime compilation
    • cublas:BLAS (Basic Linear Algebra Subprograms,基础线性代数程序集)
    • cublas_device:BLAS kernel interface
  • CUDA Samples:演示如何使用各种 CUDA 和库 API 的代码示例。可在 Linux 和 Mac 的 samples/ 目录中获得,Windows 上的路径是 C:\ProgramData\NVIDIA Corporation\CUDA Samples

  • CUDA Driver:运行 CUDA 应用程序需要系统至少有一个具有 CUDA 功能的 GPU 和与 CUDA Toolkit 兼容的驱动程序。
    每个版本的 CUDA Toolkit 都对应一个最低版本的 CUDA Driver。如果安装的 CUDA Driver 版本低于官方推荐版本,很可能无法正常运行。
    CUDA Driver 是向后兼容的,这意味着根据 CUDA 的特定版本编译的应用程序可以在后续发布的 Driver 上继续工作。通常,为了方便,在安装 CUDA Toolkit 时会默认安装 CUDA Driver

由以上可知,CUDA Toolkit 为我们编写 CUDA 程序提供了运行时,而无需直接使用底层的驱动程序。
CUDA Toolkit 包含了编译器 nvcc,可以通过 nvcc -V 查看;同时也提供了一些链接库。由于这一层是由 Driver 层包装得来的,所以 CUDA Toolkit 会一同包含前文提到的 Driver。如果已经下载好驱动,则在下载 CUDA Toolkit 时无需勾选 Driver。

需要注意的是,CUDA Runtime 的版本对底层 Driver 有版本要求(底层支持上层)。

  • 一方面,如下图所示,可以在 官网 中查看 CUDA Toolkit 版本所要求的最低 Driver 版本。
  • 另一方面,可以通过 nvidia-smi 查看当前的 CUDA Driver 版本,并确保满足 CUDA Driver >= CUDA Runtime 的要求。

另一方面,CUDA 版本并不是只要足够小就能高枕无忧。一些新的架构(由计算能力体现)也需要较新版本的 CUDA
对于 CUDA Toolkit 的版本选择,除了不能高于底层驱动的最大支持(CUDA Driver 版本),还需要符合硬件计算能力对 CUDA Toolkit 的要求(高于最低版本要求)。
GPU 的算力与 CUDA 版本的对应关系可以通过 wiki官网 获取。

cuDNN

cuDNNcuDNN 的全称为 NVIDIA CUDA® Deep Neural Network library,是 NVIDIA 专门针对深度神经网络中的基础操作设计的基于 GPU 的加速库。
cuDNN 为深度神经网络中的标准流程提供了高度优化的实现方式,例如 convolutionpoolingnormalization 以及 activation layers 的前向和后向过程。

Pytorch

安装 CUDApytorch 时,会安装一个不完整的 CUDA Toolkitpytorch 中可以调用 GPU 也是因为这个原因。
这个不完整的包主要包含在使用 CUDA 相关功能时所依赖的动态链接库,但不会安装底层的驱动程序和编译工具等。

因此,如果只使用 pytorch 编写深度学习应用,可以不用单独安装 CUDA Toolkit,而是在安装完底层驱动后,直接在 conda 创建的环境中安装 pytorch 以及相应的 CUDA 包即可。此时对于 CUDA 版本的选择与安装 CUDA Toolkit 时一致:

  • 一方面,版本需要低于 CUDA Driver 版本。
  • 另一方面,版本需要支持 GPU 的计算能力。

而如果使用 C++ 编写 CUDA 程序(.cu 文件),则需要安装 NVIDIA Driver 和完整的 CUDA Toolkit,并使用 nvcc 进行编译。

参考:

  1. CUDA C++ Programming Guide
  2. 图文并茂讲解CUDA, CUDA Toolkit, CUDA Driver, CUDA Runtime, nvcc之间的关系及其版本兼容性
  3. 显卡,显卡驱动,nvcc, cuda driver,cudatoolkit,cudnn到底是什么?

CUDA 软件栈
https://kaysonyu.github.io/2024/12/DL-Env-Conf/
Author
Yu Kang
Posted on
December 23, 2024
Licensed under