AI 软件栈
AI 软件栈把框架中的张量运算逐层转换为 GPU 指令。理解各层边界有助于处理版本不兼容、算子缺失和性能退化。
快速开始¶
一条典型调用链如下:
先确认 Driver 能识别设备,再确认框架安装包支持相应 CUDA 运行时,最后通过小型矩阵乘法验证计算。系统安装的 CUDA Toolkit 主要提供编译器与开发工具,不等于 Python 框架实际链接的 CUDA 运行时版本。
组件职责¶
| 组件 | 职责 |
|---|---|
| NVIDIA Driver | 管理设备,并向上提供驱动 API |
| CUDA Toolkit | 提供 NVCC、头文件、调试与性能工具 |
| cuBLAS | 提供矩阵乘法等线性代数算子 |
| cuDNN | 提供深度学习常用算子 |
| Triton | 使用 Python 风格语言编写自定义 GPU Kernel |
CUDA 与 NVCC¶
CUDA 是 NVIDIA 提供的并行计算平台与编程模型,运行时、驱动 API、编译工具和算子库共同组成其软件生态。原文曾将 CUDA 类比为操作系统内核、将 CUDA Toolkit 类比为 GNU 工具链;该类比有助于入门,但两者并非一一对应:Driver 负责设备访问,CUDA Runtime 提供运行接口,Toolkit 则包含编译器、头文件和开发工具。
NVIDIA CUDA 编译器 (NVIDIA CUDA Compiler, NVCC) 用于编译 .cu 文件。CUDA C/C++ 在普通 C/C++ 上增加 Kernel、线程层级和设备内存等语法。源文件中的普通代码是主机端代码 (host code),在 GPU 上运行的 Kernel 是设备端代码 (device code)。NVCC 会分离两类代码,将主机端部分交给受支持的 C/C++ 编译器,将设备端部分编译为 GPU 代码,最后参与链接。原文曾把普通 C/C++ 误写为 device code,此处按实际含义更正。
一个最小检查案例是分别运行 nvidia-smi 与 nvcc --version:前者证明 Driver 能识别设备,后者证明 Toolkit 中的编译器可用。即使 nvcc 不存在,预编译的 PyTorch 仍可能通过自带 CUDA Runtime 使用 GPU;只有编译自定义 CUDA 扩展时才通常需要本地 Toolkit。
Triton 案例¶
当现有算子无法高效融合“读取 -> 归一化 -> 激活 -> 写回”等操作时,可用 Triton 编写融合 Kernel,减少中间张量和显存往返。优化前应先建立正确性测试与基准,比较不同输入尺寸和数据类型,而不是只测一个理想形状。
版本排查¶
出现 CUDA unavailable 或未定义符号时,应依次核对硬件、Driver、框架构建版本、动态库搜索路径和扩展编译参数。Driver 通常需要向后兼容应用使用的 CUDA 运行时;第三方扩展还必须与框架 ABI、编译器和 GPU 架构匹配。