llama.cpp b11430为Hexagon后端加入FA按KV头切分,Qwen3-0.6B预填充吞吐提升 58%
llama.cpp发布b11430,Hexagon后端的flash_attn在row-split多核模式下改为按KV头切分,避免每个核心读取完整KV cache;维护方给出的 4 核ubatch=1024 实测中,Qwen3-0.6B预填充吞吐从 6977 t/s升至 11026 t/s。
AI解读:这次改动针对Hexagon后端row-split多核模式下的flash_attn:原先按Q token切分,每个核心仍需读取全部KV头,削弱了多核在显存带宽上的收益;改为按KV头切分后,每个核心只读自己负责的头分片。
切换条件明确:只有当n_kv_heads能被核心数整除时才启用头切分,否则回退到原来的token-block切分。发布说明举的例子是Gemma-4在 4 核上只有 2 个KV头,因此走回退路径、没有变化。
该行为由GGML_HEXAGON_FA_HEAD_SPLIT控制,默认开启;相关标志被塞进现有is_dst_fp32的kparams字节第 1 位,以不超过 128 字节的kernel_params限制。
维护方给出的 4 核row-split、ubatch=1024 的预填充吞吐:Qwen3-0.6B从 6977 到 11026 t/s(+58%),llama-3.2-3B从 3717 到 5522 t/s(+49%),Qwen3.5-4B从 2739 到 2855 t/s(+4%),Gemma-4 MoE无变化。
发布说明称解码(TG)不受影响,因为相对每层matmul与barrier开销,flash_attn在解码时间中占比很小。同一提交还包含矩阵乘、多设备求解器与HMX路径的一系列更新。
这些数字是维护方在特定硬件、核心数与ubatch配置下的测量,其他设备、核心数或批大小下的表现未在来源中给出。
llama.cpp发布构建b11430,主要变更是一次面向Hexagon后端的缩放改进,提交标题为“hexagon: matmul and flash-atten scalability updates (#29974)”。
flash_attn改为按KV头切分,并设有回退条件
发布说明称,在row-split模式下每个核心原本负责每个MUL_MAT的一行输出分片,但flash_attn此前按Q token(扁平qrow切分)划分,而不是按头划分。这使每个核心都必须读取完整的KV cache(全部n_kv_heads),抵消了多核在flash_attn上的内存带宽收益。
改动后,HMX与HVX的flash_attn内核在n_kv_heads能被n_cores整除时按KV头切分:第i个核心独占处理 [i*n_kv_heads/N, (i+1)*n_kv_heads/N) 这些头,只读取其对应的KV cache头分片。当n_kv_heads % n_cores != 0 时,回退到原来的token-block切分。
- 发布说明举出的回退例子是Gemma-4在 4 核上只有 2 个KV头。
- 该行为由GGML_HEXAGON_FA_HEAD_SPLIT控制,默认 1(开启)。
- 该标志被塞进现有is_dst_fp32 kparams字节的第 1 位,以满足 128 字节的kernel_params blob限制。
- run.py新增了 -fa-head-split选项。
维护方给出的预填充吞吐变化
发布说明列出 4 核row-split、ubatch=1024 下PP(预填充)吞吐(t/s)的测量结果。
- Qwen3-0.6B:6977 → 11026(+58%)。
- llama-3.2-3B:3717 → 5522(+49%)。
- Qwen3.5-4B:2739 → 2855(+4%)。
- Gemma-4 MoE:无变化,发布说明给出的原因是MoE FFN占主导,走回退路径。
- TG(解码)不变,发布说明称flash_attn相对每层matmul+barrier的开销在解码时间中占比很小。
同一提交中的其他更新
该提交除头切分外,还包含矩阵乘与多设备求解器相关的多项改动,发布说明以列表形式列出。
- 更新matmul solver以反映row-split场景下工作量减少。
- 多设备场景下按expert更好地切分工作;为mdev切分做缓存行安全约束;移除expert映射循环中的标量除法。
- 将matmul展平为 2D,以便在多序列场景下使用HMX;支持在融合matmul中折叠维度;为F16激活启用MM融合。
- 修复批处理HMX matmul序言中的第二个权重块地址;修复融合HMX MUL_MAT_NX对量化权重丢掉最后一个部分tile的问题;改进不规则形状处理,移除vtcm的标量memset。
- 修复WoS构建错误;统一act张量命名;在host侧预计算softcap/scale。