开源llama.cpp Releases·原文 2026年10月5日

llama.cpp b11404为Metal加入少行MMA矩阵乘法,面向投机解码

该合并请求为Apple7及以上、未启用tensor API的Metal设备新增 2 至 16 行src1的mat-mul内核,并给出按权重类型区分的启用行数阈值;提交称M3 Ultra上DFlash2解码此前慢于串行解码。

AI解读:llama.cpp发布b11404,合并请求标题为“metal : few-row MMA mat-mul”(#29869),内容是为Metal后端增加面向少行矩阵乘的MMA内核,动机是投机解码每步只需校验少量草稿token。

提交说明称,在没有tensor API的情况下,Metal此前用mat-vec内核跑这些矩阵乘,其耗时随src1每一行增长,因此M3 Ultra上的DFlash2解码比串行解码更慢;这是合并请求给出的描述,不是独立基准复现。

新内核覆盖 2 至 16 行src1,运行在 8x8 simdgroup矩阵上;Q4_0、Q8_0、Q5_K有独立内核,F32、F16、Q4_1、Q5_0、Q5_1、Q4_K、Q6_K走基于 16 权重反量化器的通用路径。

启用条件为MTLGPUFamilyApple7+且不使用tensor API,行数阈值依权重类型不同:F32为 6 行,F16、Q4_K、Q5_0、Q5_1为 3 行,其他类型为 2 行;这些阈值来自M3 Ultra上的测试结果。

融合表方面,MUL_MAT + ADD可在MMA store中加同形状残差,最多 16 个相邻同布局f32拷贝可合并为一次dispatch;融合检查与ggml_graph_optimize会依据设备属性,仅在支持融合的设备上打包。

后续提交按review意见移除了CPY_BATCH融合及其内核与测试,并回退了内存范围改动;releases页面同时列出macOS、Linux、Windows、Android等平台构建产物链接。

llama.cpp发布b11404,合并提交“metal : few-row MMA mat-mul”(#29869)为Metal后端新增少行矩阵乘内核,目标是加速投机解码中每步对少量草稿token的校验。

提交说明称,在没有tensor API的Metal设备上,这类矩阵乘此前由mat-vec内核执行,耗时随src1行数增长,导致M3 Ultra上的DFlash2解码比串行解码还慢。

内核范围与启用条件

新内核面向 2 至 16 行src1,运行在 8x8 simdgroup矩阵上:每个权重对所有行只反量化一次,同一threadgroup内的simdgroup按K维切分。

Q4_0、Q8_0和Q5_K有各自独立内核;F32、F16、Q4_1、Q5_0、Q5_1、Q4_K、Q6_K则走基于 16 权重反量化器的通用路径。

这些内核仅在MTLGPUFamilyApple7+且未启用tensor API的设备上使用,并按在M3 Ultra上超过mat-vec内核的行数阈值启用。

  • 启用行数阈值:F32为 6 行,F16、Q4_K、Q5_0、Q5_1为 3 行,其他类型为 2 行。
  • Q4_0在 2 行时使用mat-vec内核的 2 行变体。
  • 提交称阈值来自M3 Ultra上的性能对比,未提供其他设备的阈值数据。

融合与图优化改动

融合表允许MUL_MAT + ADD在MMA store中直接加入同形状残差;最多 16 个相邻、同布局的f32拷贝、且位于相同两个张量之间时,可作为一次dispatch执行。

融合检查与ggml_graph_optimize会读取设备属性,因此重排仅在支持该融合的设备上打包MUL_MAT + ADD,适用于所有src1行数。

当重排打包一组时,视图不计入GGML_METAL_FUSION_MAX,因此中间夹有视图的 16 个循环状态快照拷贝可保持为一组。

  • 编码器会检查融合组的内部节点并发情况,按范围跟踪被写入的视图,并不把CPY的目标计为读取。
  • 行数很少时,CONCAT会把长行拆分到多个threadgroup。
  • 测试覆盖了少行MUL_MAT、MUL_MAT_ADD、CPY_BATCH和CONCAT用例,包括test-backend-ops的prepare_graph钩子、test-metal-graph-optimize与test-metal-cpy-batch-alias。

review后的回退与构建产物

后续提交按review意见移除了CPY_BATCH融合及其内核和测试,并回退了内存范围改动;内存范围、图重排和CPY编码器恢复到与master一致的状态。

其余清理提交包括:合并mma pipeline选择逻辑、去掉has_tensor门控、调整operand/residual逻辑、去掉Q4_0 ne11=2 特例,并将融合逻辑与设备属性解耦。

该release页面同时列出macOS(Apple Silicon与Intel)、iOS XCFramework、Ubuntu(CPU、Vulkan、CUDA 12/13、ROCm 10.0、OpenVINO、SYCL)、Windows、Android、openEuler及UI的构建产物链接,其中macOS KleidiAI enabled与openEuler标记为DISABLED。

  • 提交信息由github-actions[bot] 发布,署名为Co-authored-by: Georgi Gerganov。
  • release未附独立的性能复现数据,仅给出合并请求中M3 Ultra的相对描述。

信息来源

llama.cpp Releases原始来源