llama.cpp b11972修复控制向量层索引越界与多模态M-RoPE位置写入越界
该版本在common中按模型层数限制控制向量的方向张量索引,并在mtmd中将Qwen-VL、GLM、PaddleOCR、Qwen2.5-VL编码器的M-RoPE位置循环改为按完整merge块填充;PaddleOCR在构图阶段新增merge对齐图像的约束。
AI解读:common侧的问题是:方向张量的层索引从张量名解析时没有上界,缓冲区大小和写入偏移用int计算;索引很大时两者溢出,累加会写到缓冲区起始位置之前。修复方式是把模型层数传给加载器,像已有的零索引检查一样拒绝超过层数的索引,并改用size_t计算大小。
mtmd侧的问题是:Qwen-VL、GLM、PaddleOCR、Qwen2.5-VL编码器的位置循环在stride为n_merge的范围内硬编码 2x2 merge,当patch网格不是merge的整数倍时会写出positions缓冲区之外。修复改为按完整merge块迭代、内层走n_merge步,使写入受patch数量约束,对齐网格上的位置结果不变。
PaddleOCR还新增一项限制:在构图时要求图像与merge对齐,Qwen-VL系列此前已有同样的要求。
b11972同时提供macOS、iOS、Linux、Android、Windows的预编译包,涵盖CPU、Vulkan、CUDA 12/13、ROCm 10.0、OpenVINO、SYCL以及Snapdragon的Adreno GPU与Hexagon NPU等后端;macOS的KleidiAI构建与openEuler构建标注为DISABLED。
llama.cpp发布b11972版本,提交 #31336 修复了两处缓冲区越界写入问题:common中控制向量层索引缺少上界,以及mtmd中四个视觉编码器的M-RoPE位置填充循环。
上述修复说明来自该版本的发布说明,未附带上游复现步骤或性能数据。
控制向量层索引按模型层数设限
发布说明称,common中方向张量的层索引是从张量名解析出来的,此前没有上界;缓冲区大小和写入偏移都用int计算。索引过大时两个值都会溢出,累加操作会写到缓冲区起始位置之前。
修复把模型层数传给加载器,参照已有的零索引检查,拒绝超过层数的索引,并改用size_t计算大小。
M-RoPE位置循环改为按完整merge块填充
mtmd侧的问题出在Qwen-VL、GLM、PaddleOCR和Qwen2.5-VL编码器的位置循环:循环在stride为n_merge的范围内硬编码 2x2 merge,当patch网格不是merge的整数倍时,写入会超出positions缓冲区。
修复改为按完整merge块迭代、内层走n_merge步,使写入受patch数量约束;发布说明称在对齐网格上位置结果与修改前相同。
PaddleOCR增加图像对齐约束
发布说明称,PaddleOCR现在在构图阶段要求图像与merge对齐,Qwen-VL系列此前已有这一要求。
预编译包的覆盖范围
b11972提供macOS Apple Silicon与Intel、iOS XCFramework、Linux(Ubuntu x64/arm64/s390x,含Vulkan、CUDA 12.8、CUDA 13.4、ROCm 10.0、OpenVINO、SYCL FP32/FP16、Snapdragon)、Android arm64、Windows x64/arm64的预编译包。
发布说明中,macOS的KleidiAI构建和openEuler构建标注为DISABLED。