Appearance
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注册,但默认 OFF(option(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_indiceskernel 把 mask 压缩为索引表;启用条件较严格(需 mask、无 max_bias/logit_softcap、K->ne[1] >= max(4096, 2*n_kv_max)等),服务 DSV4/GLM 的稀疏注意力 - branchless Q4_K/Q5_K unpack(
73ab7599b)— mmvq 反量化走无分支路径提速,DGX Spark 上加 L2 prefetch - 静态 cuBLAS workspace(
d9b6be07d)— 为 cuBLAS handle 提供静态 workspace - gfx90c HIP 支持(
473599738);f16 Flash Attention 修复 divergent barrier(b74f590ea);mmid/mmf 修复数据竞争(73a43d1f6) - 删除
GGML_CUDA_PEER_MAX_BATCH_SIZE(24f5bf8a4)— 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 bf16 —
GGML_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 参数调优(
971595d66、427291b5b、8f83678fd) - Mamba-2 prefill 优化 — chunked SSD MMA kernel(
11cd98842) - 修复
mul_mv_iq3_xxs在ne00 < 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_ROWS(
0cae43063);修复 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+add与add+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-shift、Q5_1、gemma4 dense/embedding
- 算子实现持续改进(operator improvements)
后端选择策略
Scheduler 自动将计算图节点分配到最优后端:
- 检查每个操作的支持情况
- 优先使用 GPU 后端
- 不支持的操作 fallback 到 CPU
- 跨后端操作自动插入数据传输
split compute 同步策略回退:更早的窗口曾让调度器在 split compute(计算图切分到多个后端)时"放宽同步"——为 CUDA 增加 CPU→CUDA 的异步拷贝(
ggml_backend_cuda_cpy_tensor_async),减少 token 间的同步点。该优化后被回退(86b94708fRevert#20793,#25138),调度器不再做该放宽。此外调整过「按权重张量所在后端卸载算子」的判定逻辑(dee2a846b),改变部分算子被分到哪个后端执行。本窗口调度器三项变化:
- split inputs 动态扩容(
dbadb68ee,#22789)—ggml_backend_sched_split::inputs从定长数组(GGML_SCHED_MAX_SPLIT_INPUTS = 30)改为指针 + 容量,满时翻倍 realloc;修复宽 MoE(>30 个输入)多后端崩溃。- 输入数不再强制产生新 split(
992cb503c,#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 采样下沉到设备端)
相关概念
- backend — 后端抽象详解
- tensor — 张量数据在设备间的传输
- quantization — 各后端的量化 kernel 实现