本文档涵盖了 GGML 的 CUDA 后端实现,该后端为张量操作和神经网络推理提供 NVIDIA GPU 加速。CUDA 后端支持各种量化数据类型、多 GPU 配置以及使用 CUDA 核心和 Tensor Cores 的优化矩阵运算。
有关其他 GPU 后端的信息,请参阅 Metal 后端、Vulkan 后端 和 SYCL 后端。有关通用后端架构概念,请参阅 后端。
CUDA 后端是一个模块化系统,它与 GGML 的后端抽象层进行接口,同时为张量操作提供优化的 CUDA 实现。
来源:ggml/src/ggml-cuda/ggml-cuda.cu1-830 ggml/src/ggml-cuda/common.cuh1-830
来源:ggml/src/ggml-cuda/ggml-cuda.cu758-829 ggml/src/ggml-cuda/common.cuh630-648
CUDA 后端通过 ggml_cuda_device_info 结构管理多个 GPU 设备,并提供设备发现和配置功能。
后端通过 ggml_cuda_init() 初始化设备,该函数
cudaGetDeviceCount() 检测可用的 CUDA 设备跟踪的关键设备属性包括:
cc:计算能力nsm:流式多处理器数量smpb/smpbo:每个块的共享内存vmm:虚拟内存管理支持warp_size:每个 warp 的线程数(NVIDIA 为 32,AMD 为 64)来源:ggml/src/ggml-cuda/ggml-cuda.cu176-291
该后端通过头文件抽象厂商差异,将 CUDA API 映射到等效的厂商 API
| 厂商 | 标题 | 目标硬件 |
|---|---|---|
| NVIDIA | vendors/cuda.h | CUDA GPU |
| AMD | vendors/hip.h | ROCm/HIP GPU |
| 摩尔线程 | vendors/musa.h | MUSA GPU |
来源:ggml/src/ggml-cuda/vendors/cuda.h1-16 ggml/src/ggml-cuda/vendors/hip.h1-244 ggml/src/ggml-cuda/vendors/musa.h1-141
CUDA 后端实现了复杂的内存管理,支持内存池、虚拟内存和高效的分配策略。
来源:ggml/src/ggml-cuda/ggml-cuda.cu300-515
对于支持 VMM 的设备,后端使用 ggml_cuda_pool_vmm,它提供了:
CUDA_POOL_VMM_MAX_SIZE)cuMemCreate() 按需分配物理内存来源:ggml/src/ggml-cuda/ggml-cuda.cu398-505
该后端通过 ggml_backend_cuda_split_buffer_type 支持将大型张量分割到多个设备上
来源:ggml/src/ggml-cuda/ggml-cuda.cu763-928
CUDA 后端实现了优化的矩阵运算,支持量化和标准数据类型以及多种算法变体。
来源:ggml/src/ggml-cuda/mmq.cu270-324 ggml/src/ggml-cuda/mmq.cuh12-19
mmq.cuh 和 mmq.cu 文件实现了量化类型(MMQ)的矩阵乘法,支持:
支持的量化类型:
Q4_0, Q4_1:4 位量化Q5_0, Q5_1:5 位量化Q8_0:8 位量化Q2_K 到 Q6_K:K 量化变体IQ*:整数量化变体关键参数:
MMQ_ITER_K:迭代大小(256)MMQ_NWARPS:Warp 数量(8)MMQ_DP4A_MAX_BATCH_SIZE:DP4A 内核的最大批处理大小(64)来源:ggml/src/ggml-cuda/mmq.cuh12-15 ggml/src/ggml-cuda/mmq.cu6-66
后端通过两种实现提供优化的矩阵向量乘法
mmv.cu):适用于 float、half 和 nv_bfloat16mmvq.cu):适用于量化数据类型两种实现都支持:
来源:ggml/src/ggml-cuda/mmv.cu5-101 ggml/src/ggml-cuda/mmvq.cu137-224
CUDA 后端提供了全面的量化支持,以减少内存使用并提高推理速度。
来源:ggml/src/ggml-cuda/mmq.cuh27-48 ggml/src/ggml-cuda/mmq.cuh50-84
quantize.cu 文件实现了计算过程中的即时量化
量化过程
d = amax / 127)来源: ggml/src/ggml-cuda/quantize.cu4-146
后端使用 ggml_cuda_should_use_mmq() 根据以下因素在 cuBLAS 和自定义 MMQ 内核之间进行选择
来源: ggml/src/ggml-cuda/mmq.cu270-324
后端利用了各种硬件功能
来源: ggml/src/ggml-cuda/common.cuh226-262 ggml/src/ggml-cuda/mma.cuh1-16
后端通过以下方式提供全面的错误处理
NO_DEVICE_CODE 用于不支持的架构来源: ggml/src/ggml-cuda/common.cuh135-146 ggml/src/ggml-cuda/ggml-cuda.cu66-76