llama.cpp b12246调整Vulkan后端:高通GPU大head标量flash attention限为每组 8 行
该项目称,在Adreno X1-85上,head size 256、KV 4096的FLASH_ATTN_EXT用例从 711 毫秒降到 17 毫秒,此前一直无法完成的test-backend-ops现在可以跑完。
AI解读:PR #30829 的描述称,当head size大于 128 且KV长度至少 1024 时,原实现每个工作组使用 16 行,在Adreno驱动上会把寄存器溢出到暂存内存,速度约慢 40 倍。
新规则是:在高通设备上,只要hsk或hsv大于 128,每个工作组最多使用 8 行;更小的head仍保留 16 行,因为在高通X2 Elite上 16 行对这些head更快。
来源给出的具体数字:Adreno X1-85上FLASH_ATTN_EXT(hsk=256、kv=4096)用例,nb=64 从 711 毫秒降至 17 毫秒,nb=512 从没有结果变为 125 毫秒;此前寄存器溢出在X1-85上为每次调用 264 字节,8 行时为 0。
测试结果方面,项目称该最大test-backend-ops用例此前在X1 Elite上变成数秒的单次dispatch,超过Windows GPU超时导致测试无法完成,现在可完成。X2-90上Gemma 4 E4B pp512、深度 4096、启用flash attention时,吞吐从 81-90 t/s提升至 117 t/s。
以上数字均来自该版本发布说明与PR描述,属于项目方自测,未经过第三方独立复现。
llama.cpp发布b12246版本,更新内容为Vulkan后端在高通Adreno GPU上的标量flash attention行数限制,对应PR #30829。项目称这一改动修复了head size较大、KV较长时的寄存器溢出和测试超时问题。
高通的“大head”场景改用 8 行
发布说明称,当head sizes大于 128 且KV不少于 1024 时,原标量flash attention每个工作组使用 16 行。在高通Adreno驱动上,该配置会把寄存器溢出到暂存内存(X1-85上每次调用 264 字节,8 行时为 0),并导致约 40 倍的速度下降。
改动后的规则是:在高通设备上,当hsk或hsv大于 128 时,每个工作组最多使用 8 行;更小的head继续使用 16 行。发布说明称,在X2 Elite上 16 行对小head更快。
- 适用条件:高通设备,且hsk或hsv > 128
- 上限:每个工作组最多 8 行
- 小head保持 16 行
项目方给出的性能与测试数据
发布说明列出两项具体结果。Adreno X1-85上FLASH_ATTN_EXT(hsk=256、kv=4096):nb=64 从 711 毫秒降至 17 毫秒,nb=512 从“无结果”变为 125 毫秒;test-backend-ops可以完成。Adreno X2-90上Gemma 4 E4B pp512、深度 4096、启用flash attention:81-90 t/s提升至 117 t/s。
项目方还称,此前最大的test-backend-ops用例在X1 Elite上变成数秒的单次dispatch,超过Windows GPU超时,测试无法完成。
- X1-85,FLASH_ATTN_EXT hsk=256 kv=4096:nb=64 711 ms → 17 ms
- 同用例nb=512:此前无结果 → 125 ms
- X2-90,Gemma 4 E4B pp512,深度 4096:81-90 → 117 t/s
发布范围
b12246提供的构建覆盖macOS/iOS、Linux(Ubuntu的CPU、Vulkan、CUDA 12/13、ROCm、OpenVINO、SYCL,以及Snapdragon的CPU/Adreno GPU/Hexagon NPU)、Android、Windows(CPU、OpenCL Adreno、CUDA、Vulkan、OpenVINO、SYCL、ROCm)等平台;openEuler构建标注为DISABLED,macOS上KleidiAI启用的arm64构建同样标注为DISABLED。
- 改动本身针对Vulkan后端 + 高通Adreno
- 发布包覆盖多个平台,与本次改动范围不同
- openEuler及KleidiAI启用的macOS构建为禁用状态