llama.cpp b12086去掉Qwen卷积状态写入的一次多余拷贝
该版本修改build_conv_state_at:让ggml_cpy直接读取带步长的张量视图,不再先做连续拷贝。按发布说明,Qwen3.8-Flash-Next的 36 层GDN每生成一个token的设备拷贝次数从 72 次降到 36 次。
AI解读:llama.cpp发布b12086,提交 #31443 针对qwen4exp的卷积状态写入路径,去掉了一次中间连续拷贝。
发布说明称,build_conv_state_at此前会先把卷积输入尾部复制成连续内存,再写入循环状态,导致每个GDN层每生成一个token发两次设备拷贝,而一次就够。
在Qwen3.8-Flash-Next的 36 个GDN层上,发布说明给出的数字是每token从 72 次拷贝降为 36 次;投机解码会在每个回滚槽位再增加一次拷贝。
修改方式是让ggml_cpy像共享的build_conv_state一样直接读取带步长视图。来源未提供吞吐或延迟的实测数据。
llama.cpp发布b12086版本,其中提交 #31443 修改了qwen4exp相关路径下卷积状态尾部的写入方式。发布说明称,改动去掉了写入循环状态前的一次中间连续拷贝。
被去掉的那次拷贝
发布说明描述,build_conv_state_at在把卷积输入尾部写入循环状态之前,会先做一份连续副本。这样每个GDN层每生成一个token会发出两次设备拷贝,而实际一次就够。
按发布说明的数字,在Qwen3.8-Flash-Next的 36 个GDN层上,这相当于每token 72次拷贝,改动后为 36 次。投机解码时,每个回滚槽位还会再加一次拷贝。
改动后的做法是让ggml_cpy直接读取带步长的视图,与共享的build_conv_state已有做法一致,从而省掉这次额外拷贝。
- 提交:#31443,标题为“qwen4exp: write the conv state tail without an intermediate cont”
- 影响路径:build_conv_state_at(GDN层循环状态写入)
- Qwen3.8-Flash-Next(36 个GDN层):每token拷贝 72 次 → 36 次(发布说明数字)
- 投机解码:每个回滚槽位额外增加一次拷贝
适用对象与版本产物
这一改动针对使用GDN层、走qwen4exp卷积状态写入路径的模型推理;发布说明只以Qwen3.8-Flash-Next举例说明拷贝次数。b12086同时提供macOS/iOS、Linux、Android、Windows等平台的预编译包,覆盖CPU、CUDA 12/13、Vulkan、ROCm 10.0、OpenVINO、SYCL以及Snapdragon的CPU/Adreno GPU/Hexagon NPU等后端。
发布说明没有给出该改动带来的吞吐、延迟或显存变化数据,因此拷贝次数减半不能直接换算为端到端加速幅度。
- 发布页列出macOS arm64/x64、iOS XCFramework、Ubuntu x64/arm64/s390x、Windows x64/arm64、Android arm64等构建
- 后端包括CPU、CUDA、Vulkan、ROCm、OpenVINO、SYCL、OpenCL Adreno
- macOS Apple Silicon的KleidiAI构建与openEuler构建在发布页标注为DISABLED