Skip to content

GGML 后端与硬件抽象 — 概念

后端接口设计

GGML 定义了统一的后端接口 ggml_backend

每个后端实现以下核心能力:

  • Buffer 分配 — 在设备上分配/释放内存
  • Tensor 操作 — 实现支持的操作集合
  • 数据传输 — Host ↔ Device 数据拷贝
  • 计算执行 — 执行计算图的节点

CPU 后端

CPU 后端是最基础的后端,支持所有 GGML 操作:

  • SIMD 加速 — 利用 AVX2/AVX512 (x86)、NEON (ARM)、SVE (ARM 动态宽度)、RVV (RISC-V 扩展 VLEN)、LSX (LoongArch) 指令集
  • 线程池ggml-threading.cpp 管理 OpenMP 或自定义线程池
  • 量化运算 — 优化的量化 kernel(Q4_0 矩阵乘法等)
  • KleidiAI 混合调度 — Arm 平台支持 CPU+DSP 动态分块混合执行

实验性 ggml-et 后端(Extension Transformation,082b326fc)— 一个第二套 CPU 后端,思路是把多个算子融合成单个 "uberkernel" 执行(实现 MUL_MAT / ROPE / RMS_NORM / GLU / SOFT_MAX / GET_ROWS 等)。它通过 ggml-backend-reg.cpp 注册,但默认 OFFoption(GGML_ET ... OFF)),目前仅作实验,尚不参与默认调度。swiglu_clamp 也在其支持列表中。

CPU 本窗口增量:新增 iqp.cpp(AVX2 加速 i-quant 大批量矩阵乘,85c55223c)、SpacemiT IME kernel 按条件编译(2637dfe37)、s390x q5_1 未初始化累加修复、__fp16__ARM_FP16_FORMAT_IEEE 门控、新增运行时 CPU 特性检测头 ggml-feats.h(aarch64 HWCAP / SVE2 / SME2,132753bf4)、SME2 F32 GEMV、KleidiAI 构建重构为独立 kleidiai/CMakeLists.txt 且 dispatch 时不再惰性初始化 buffer type(b81c99b47)。

CUDA 后端

CUDA 后端利用 NVIDIA GPU 加速:

  • 自定义 CUDA kernel 实现核心操作
  • 支持 tensor parallel 多 GPU 推理
  • 异步执行与流 (stream) 管理
  • 支持 Flash Attention 等 GPU 优化
  • 快速 Walsh-Hadamard 变换 (fwht.cu) — 用于相关变换的高效实现
  • PDL (Persistent Descriptor Launch) — 针对 MoE 矩阵乘法的持久化调度,需 CTK ≥ 12.3,注意与 __restrict__ 的竞态问题已修复
  • AMD MFMA 路由 — batch ≥ 4 时自动将量化 matmul 路由到 MMQ 路径
  • CONCAT 标量类型ggml_concat 现支持标量数据类型在 CUDA 后端执行
  • ssm_scan 数据竞争修复 — State Space Model 的 scan kernel 修复了数据竞争
  • 显存读取后重置 context — 读取显存大小后重置 CUDA context,避免状态泄漏
  • REPEAT 收紧GGML_OP_REPEAT 仅支持 F32/F16
  • HIP 扩展 — gfx1152 / gfx1153 加入 RDNA3.5 目标
  • cublasSgemmBatched — 对 HIP/MUSA vendor 头映射 cublasSgemmBatched;out_prod 广播(dps2>1)路径改走批量 GEMM
  • cpy.cu 修复cpy.cu 拷贝路径多项修正;新增 cudaMemcpy2DAsync 快路径
  • binary ops 整数溢出 — 二元算子的 CUDA 实现修复整数溢出
  • col2im_1d — 补齐 1D col2im 的 CUDA kernel
  • 稀疏 Flash Attention(本窗口,8e93a9773)— 经 ggml_flash_attn_ext_set_n_kv_max() 启用(非新算子):mask 中的有限项被当作稀疏 K/V 集合,新增 flash_attn_mask_to_sparse_indices kernel 把 mask 压缩为索引表;启用条件较严格(需 mask、无 max_bias/logit_softcap、K->ne[1] >= max(4096, 2*n_kv_max) 等),服务 DSV4/GLM 的稀疏注意力
  • branchless Q4_K/Q5_K unpack73ab7599b)— mmvq 反量化走无分支路径提速,DGX Spark 上加 L2 prefetch
  • 静态 cuBLAS workspaced9b6be07d)— 为 cuBLAS handle 提供静态 workspace
  • gfx90c HIP 支持473599738);f16 Flash Attention 修复 divergent barrier(b74f590ea);mmid/mmf 修复数据竞争(73a43d1f6
  • 删除 GGML_CUDA_PEER_MAX_BATCH_SIZE24f5bf8a4)— peer access 不再按 batch size 门控,CMake 选项一并移除
  • SM87 MMVQ→MMQ 交叉点调优8c1a25166);RDNA3 MoE MMQ N-tiles 调整先合入后又回退(0c963452e / e71b80510
  • 虚拟设备命名缩短a14dba686)— 设备描述从 "name (physical device P, virtual device V)" 改为 "name (dev pP/vV)",Metal 同步

Metal 后端

Metal 后端针对 Apple Silicon 优化:

  • 使用 Metal Compute Shaders
  • 统一内存架构(CPU/GPU 共享内存)
  • 通过 ggml-metal.metal 实现 shader
  • Metal Performance Shaders (MPS) 加速
  • 远程分配器优化 — buffer 复用心跳从 500ms 降至 5ms,显著加速 Metal buffer 重用
  • GLU kernel 模板化 — SwiGLU 等 kernel 现已模板化,同时支持 f16/f32 输入
  • repeat bf16GGML_OP_REPEAT 支持 BF16 数据类型
  • im2col 1D 修复 — 修复音频模型 1D 卷积的 im2col 路径
  • rope_back — 补齐 GGML_OP_ROPE_BACK(旋转位置编码的反向)Metal 实现
  • concat f16/bf16 — concat 算子支持 f16 与 bf16,并在 concat kernel 中加入 BF16 支持检查
  • kernel 源码拆分(本窗口,b615f5b4b)— 单体 ggml-metal.metal 被拆为 ggml/src/ggml-metal/kernels/ 下约 23 个 per-op .metal 源文件(+ common.h / dequantize.h / quantize.h),metallib 拆成 8 个库并行编译加载,大幅缩短构建时间
  • fa-vec 调优 — 为 M2 Max / M3 / M3 Max 补齐剩余的 fa-vec kernel 参数调优(971595d66427291b5b8f83678fd
  • Mamba-2 prefill 优化 — chunked SSD MMA kernel(11cd98842
  • 修复 mul_mv_iq3_xxsne00 < 1024 时的 idle threads(88ada91c1)与 early-return 路径的内存泄漏(6a1a922d2
  • 新增 ggml-metal-tuning.cpp/.h 调优参数管理;稀疏 FA 支持(与 CUDA 同一 n_kv_max 入口,7bb0fc18f

Vulkan 后端

Vulkan 后端提供跨平台 GPU 加速:

  • Compute Shader 实现
  • 支持 NVIDIA cooperative matrix (GL_NV_cooperative_matrix_decode_vector) 加速 matmul
  • BF16 Flash Attention — 新增对 BF16 KV cache 的 Flash Attention 支持
  • FWHT Intel 路径 — 使用共享内存 reduction 的快速 Walsh-Hadamard 变换
  • MUL_MAT_VEC 优化(4 K per iteration for F16/32)
  • 避免在 AMD UMA 设备上优先选择 transfer queue
  • 更多 CONCAT 类型 — 含标量类型的 concat 支持
  • 非连续 unary/GLU — 支持非连续张量的逐元素与 GLU 操作
  • memcpy pipeline barrier — 内存拷贝读取操作插入流水线屏障,保证正确性
  • 连续 buffer transfer 快路径 — 连续缓冲区传输走优化路径
  • Asahi Linux — 使用中等 matmul tile 适配 Apple Silicon 驱动
  • v_dot2_f32_f16 — 在 matmul 与 Flash Attention 中使用点积内建函数加速
  • 降低 iq1 共享内存 — mul_mm 的 iq1 量化共享内存占用降低
  • mul_mat_id cm2 decode_vector — B 矩阵加载使用 cooperative matrix decode
  • 更多算子覆盖 — 新增 CONV_3D、GET_ROWS_BACK、gated_delta_net(S_v=16)、以及 SQR/SQRT/SIN/COS/CLAMP/LEAKY_RELU/NORM 等 unary/norm 算子
  • FA softmax 前加 bias — Flash Attention 中先加 bias 再 softmax,避免数值溢出
  • UMA host-visible — UMA 设备上优先选择 host-visible 内存缓冲
  • Intel Xe-LPG Plus — 新增 INTEL_XE1 架构枚举,在 Intel Xe-LPG Plus 上启用 coopmat1;mul_mm ALIGNED 改为 spec constant
  • mul_mat_vecq mi50 — 针对 MI50 优化 mul_mat_vecq
  • 健壮性 — shader 编译失败即 fail build;可在超时时降低图提交批次;构建时记录实际内存属性
  • 提交启发式按 flops — 图提交阈值(submission heuristic)从「按 matmul 源权重张量大小」改为「按 flops」判断,把计算量计算抽离成独立函数,更准确地决定是否拆分提交
  • Q2_0 支持 — 新增对 GGML_TYPE_Q2_0 量化类型的支持(经 sync: ggml 落地)
  • 融合 UNARY + MUL(本窗口,64e9bceb2#27220)— GELU / SIGMOID / SILU / SOFTPLUS 激活与后续 MUL 融合为单个 shader
  • rms_norm 融合机会9ac8c408a)— 识别 rms_norm 链的融合模式
  • TQ1_0 支持8fe90e1fb)— mm / mat-vec / mat-vec-id / dequant / get_rows 全路径
  • DeepSeek V4 融合超连接算子7a333e724)— DSV4_HC_COMB/PRE/POST 三个融合 op 的 Vulkan 实现
  • type-aligned GET_ROWS0cae43063);修复 32-bit 目标上的 Vulkan-Hpp handle 使用(f014bfef8

SYCL 后端

Intel GPU 加速:

  • 已从 CUDA 移植多列 MMVQ(Matrix-Vector 量化乘法)
  • Flash Attention 扩展支持 Q4_1, Q5_0, Q5_1 类型
  • 虚拟内存池 (ggml_sycl_pool_vmm) 管理
  • GET_ROWS op 扩展更多数据类型
  • Q3_K mul_mat 内存访问模式优化
  • K-quant DMMV native subgroup — 使用 native subgroup size 进行 K-quant 的 DMMV
  • soft_max 修复 — 修正 f32 max reduction 的精度问题
  • reorder 扩展 — reorder 函数支持 fp32/fp16,构建脚本同步更新
  • set_rows 扩展 — 支持 q1_0、mxfp4、nvfp4 类型
  • pool_1d — 新增 1D 池化,代码统一抽离到 pool.cpp/hpp
  • 移除逐分配 Level Zero 检查 — 不再对每次分配做运行时 Level Zero 检查,减少开销
  • F16 默认开启GGML_SYCL_F16=ON 成为默认;进一步在 bin_bcast 与 unary、SQR/SQRT/LOG/SIN/COS/CLAMP、EXPM1/FLOOR/TRUNC/ROUND 等算子上支持 fp16/bf16
  • 卷积算子 — 新增 conv_2d / conv_2d_dw / conv2d_transpose / conv_3d
  • Q1_0 与重排 MoE — 支持 Q1_0 的 MUL_MAT + OUT_PROD;reordered Q4_K/Q5_K/Q6_K 用于 MoE MUL_MAT_ID
  • USM 系统分配 — 可选 USM system allocations;--split-mode tensor 支持
  • 健壮性 — 修复 MoE prefill 中 async memcpy 的 use-after-free;新增 dev2dev memcpy;soft_max 输入 clamp 防下溢
  • 本窗口:批量 L2_NORM kernel(dbeb37548)、rms_norm+mul+addadd+add 残差链融合(6703d7894)、oneMKL FA 开关重构为全局变量(f9f09f02c)、GGML_SYCL_MEMTRACE 按分配点归因设备分配(cd8cdf395)、Kronecker FWHT 支持恢复

OpenCL 后端

移动/嵌入式 GPU 加速:

  • 新增 Q5_0, Q5_1 基础支持
  • 大 batch 场景使用 flat gemv 优化(Q4_K, Q6_K)
  • BF16 支持通过转换为 F16 实现
  • GATED_DELTA_NET op 实现
  • Adreno Q5 gemm/gemv — 为 Qualcomm Adreno GPU 新增 q5_0 / q5_1 的 GEMM 与 GEMV kernel
  • Flash Attention 改进 — FA 实现进一步优化
  • mul_mat_f16_f32_l4 — decode 阶段 f16×f32 矩阵乘优化;q8_0 gemv 精度提升
  • 非连续行 norm — norm 支持非连续行;关闭时刷新未完成的 profiling 批
  • 本窗口:conv2d 正确处理非连续输入(7d701b592)、q4_K/q5_K mul_mat 权重打包选择(d03efa5d5)、lm_head 量化 GEMV / 中批量 GEMM(speculative decoding / MTP 场景,95ef7fc16)、elementwise 与 data-movement 算子覆盖扩展(1548a240e)、Adreno xmem SDPA 路径(4acf4a4cb)、多流 batch 下跳过 Adreno KQ/KQV image kernel(8190848bb

WebGPU 后端

浏览器端 GPU 加速:

  • FlashAttention 重构 + 标准化量化支持
  • MMVQ 路径:Q4/Q8/Q2_K/Q4_K
  • q4_0/q8_0 SET_ROWS 支持
  • 清理 legacy MUL_MAT pipeline
  • i-quants mul_mat 提速 — importance-quant 矩阵乘性能优化
  • prefill 加速 — k-quants 的 prefill 提速,matmul 针对 Q4/Q5/Q8 与 k-quants 重构
  • 2D workgroups — scale、binary、unary 算子改用二维工作组提升并行度
  • concat buffer overlap — 处理 concat 算子的缓冲区重叠 / 别名(aliasing)
  • MTP mat-vec — MTP 推测解码小 batch 场景改走 mat-vec 路径,提升效率
  • F16 适配器开关 — 在 Vulkan + NVIDIA 上提供 F16 适配器开关
  • 本窗口:src0/src1 重叠的 mulmat(如 minimax-01,5112b9738)、修复 binding alias 以支持所有架构(bc71c24c9)、GET_ROWS case 块格式化(c0b1871bc);MUL_MAT 进入「可能需要额外内存」算子列表(557614e02,配合 alloc size 预估)

Hexagon DSP 后端

Qualcomm Hexagon DSP 加速:

  • 通用算子融合框架htp-opnode.h 支持任意算子组合融合
  • RMS_NORM + MUL 融合(减少内存带宽)
  • Q4_1 支持 MUL_MAT 和 MUL_MAT_ID
  • CONCAT op、GELU_quick 激活函数
  • GATED_DELTA_NET K>1 支持
  • MUL_MAT / MUL_MAT_ID 重构 — 32×32 tiled weight 重打包、统一 kernel 参数与缓存图(cached graphs)
  • op-trace — HVX/HMX/DMA 事件的细粒度追踪;ssm-conv 权重使用 padded stride
  • 本窗口:新增 RELU / LEAKY_RELU(050dde50c)与 F16 unary(ABS/LOG 等,f027c4f1b)、HTP 下 hvx-quant / set-rows / get-rows / allreduce 内核、Hexagon 正式列入 docs/ops.md 算子覆盖表(e107984bc

OpenVINO 后端

Intel OpenVINO 加速:

  • 升级至 OV 2026.2.1,提供自包含的 release 包
  • 支持 context-shiftQ5_1、gemma4 dense/embedding
  • 算子实现持续改进(operator improvements)

后端选择策略

Scheduler 自动将计算图节点分配到最优后端:

  1. 检查每个操作的支持情况
  2. 优先使用 GPU 后端
  3. 不支持的操作 fallback 到 CPU
  4. 跨后端操作自动插入数据传输

split compute 同步策略回退:更早的窗口曾让调度器在 split compute(计算图切分到多个后端)时"放宽同步"——为 CUDA 增加 CPU→CUDA 的异步拷贝(ggml_backend_cuda_cpy_tensor_async),减少 token 间的同步点。该优化后被回退86b94708f Revert #20793#25138),调度器不再做该放宽。此外调整过「按权重张量所在后端卸载算子」的判定逻辑(dee2a846b),改变部分算子被分到哪个后端执行。

本窗口调度器三项变化

  • split inputs 动态扩容dbadb68ee#22789)— ggml_backend_sched_split::inputs 从定长数组(GGML_SCHED_MAX_SPLIT_INPUTS = 30)改为指针 + 容量,满时翻倍 realloc;修复宽 MoE(>30 个输入)多后端崩溃。
  • 输入数不再强制产生新 split992cb503c#28387)— 删除了「split 输入数满即强制开新 split」的启发式,后端输入(backend inputs)不再因数量触发额外切分。
  • split 竞态修复849798132#26040)— 无输入的 split 若与前一 split 后端不同,先同步前一后端(allocator 可能跨 split 复用 buffer 区域);event 现在对每个 split 都 record。
  • 另有 graph_optimize 回调新增 add_alloc_dep 机制(57291f264):后端可请求 scheduler 把保活张量作为 GGML_OP_NONE 依赖节点插入图副本。

RPC 后端

  • RPC 协议 4.0.3 → 6.0.0(本窗口)— tensor_memset(→5.0.0,f5b9bd39b)与 event / async backend API(→6.0.0,d0132a680)两次 major 跳版;rpc-server 二进制需与客户端版本匹配
  • Apple RDMA 传输b114b4739)— macOS 上可用 RDMA 作为 RPC transport(transport-apple.cpp
  • use_count 填充af5172627)— RPC 上报 buffer 使用计数,使后端内部融合成为可能;ggml_backend_op_alloc_size_may_expand 通用查询替代 RPC 内的硬编码「输出可能扩张」算子列表
  • 后端搜索路径不可读时不再崩溃(4cbe8b070

后端采样 (Backend Sampling)

对于 MTP (Multi-Token Prediction) 推测解码,采样器链可以部分在设备上执行:

  • Top-K 采样在 GPU 上完成,避免将全部 logits 从 Device 传回 Host
  • 显著减少 D2H 数据传输量,提升推测解码效率
  • 通过 --spec-draft-backend-sampling 启用(默认开启)
  • 该能力现已扩展到 EAGLE3 推测解码(draft 采样下沉到设备端)

相关概念