llama.cpp b10839发布:修复Vulkan后端GET_ROWS崩溃,Qwen3-TTS与Qwen3-VL可正常加载
llama.cpp发布b10839,修复Vulkan后端因张量偏移未对齐导致GET_ROWS运算断言失败的问题,该问题影响Qwen3-TTS和Qwen3-VL等模型。
AI解读:这次更新解决了一个实际的崩溃问题:在Vulkan后端运行Qwen3-TTS或Qwen3-VL这类模型时,模型内部的ggml_view与GET_ROWS操作会产生非零视图偏移,而旧的shader代码没有正确处理这种偏移,导致程序直接断言退出。修复的核心是让Vulkan的GET_ROWS路径(包括量化版本)正确读取每个张量的基础偏移,并把缓冲区绑定到对齐位置,而不是简单退回CPU。这意味着使用AMD、Intel或部分NVIDIA GPU的用户,通过Vulkan后端加载这类多模态模型时不再会遇到启动即崩溃的情况。开发者(尤其是依赖llama.cpp构建本地推理应用的)可以升级到b10839并重新测试相关模型;普通用户只需更新到最新版即可,无需额外操作,但要注意这一改动仅针对Vulkan后端,其他后端不受影响。
llama.cpp于 4 月 29 日发布b10839版本,主要修复Vulkan后端在GET_ROWS操作上的崩溃问题。该问题影响使用ggml_view与ggml_get_rows组合的模型,如Qwen3-TTS和Qwen3-VL,在完全加载到GPU时(例如 -ngl 99)会触发GGML_ASSERT断言失败。
Vulkan后端修复GET_ROWS偏移处理
此前的Vulkan GET_ROWS shader在张量缓冲区偏移与view_offs相加后不对齐minStorageBufferOffsetAlignment时会触发断言,导致Qwen3-TTS、Qwen3-VL等模型硬崩溃。b10839中,get_rows_quant.comp补齐了get_aoffset()、get_boffset()、get_doffset() 调用,使量化路径能正确处理非零view_offs,例如KV缓存切片产生的偏移。
- 移除了supports_op() 中对GET_ROWS未对齐情况的CPU回退,因为Vulkan后端现在原生支持未对齐偏移。
- 对于使用vk_op_binary_push_constants的操作(如GET_ROWS、ADD、SUB、MUL),将缓冲区绑定到视图偏移附近的对齐位置,并通过push constant传递调整后的未对齐量,避免量化块类型偏移被截断。
- 新增ggml_vk_tensor_physical_offset统一UMA与非UMA设备的物理偏移查找,确保缓冲区绑定与push constant偏移一致。
- 修复了gated_linear_attn结构中的文件损坏问题。
测试覆盖与验证
新增后端测试覆盖F32、F16、Q4_0、Q4_K、Q8_0、I32类型,使用ggml_view_4d产生非零视图偏移,验证非量化与量化路径。还添加了offset_rows=3 的GET_ROWS测试,覆盖be1={1,7} 和v={false,true} 组合。所有 223 个GET_ROWS测试在NVIDIA RTX 5060 Ti上通过。
- 复现场景:llama-tts -m Qwen3-TTS-*.gguf -mm mmproj-*.gguf -ngl 99。
- 测试跳过了视图张量的梯度设置,因GGML_OP_VIEW无法通过ggml_set_param。
下载与构建状态
b10839提供多平台二进制:macOS(Apple Silicon与Intel)、iOS XCFramework、Linux(Ubuntu x64/arm64/s390x,含Vulkan、ROCm 10.0、OpenVINO、SYCL版本)、Android arm64、Windows(CPU、CUDA 12.4/13.3、Vulkan、OpenVINO、SYCL),以及Windows arm64的CUDA 13 preview和OpenCL Adreno版本。
- 注意:macOS Apple Silicon的KleidiAI构建和openEuler构建被禁用,相关PR见 #23780 和 #23705。
- UI包同步更新。