llama.cpp b11339修复全上下文解码时的显存重分配崩溃
该版本将kpool重池化边界收紧到n_pool_real,避免首次填满缓存的解码构建超出预留的图张量并触发ggml-alloc重分配(在GGML_SCHED_DEBUG_REALLOC=1 下会中止)。
AI解读:llama.cpp发布b11339,核心改动是一个边界修正:把kpool重池化的上界从原先的n_tokens/kpool + n_seqs_unq收紧到n_pool_real。
问题出在批次正好填满整个缓存时。n_ctx个token恰好组成n_ctx/kpool个池,原来的 +1 会让new_pool_idxs和new_pool_rep多出一项,越过n_pool_real。
而图预留只覆盖n_pool_real项,所以第一次全上下文解码会构建比预留更大的张量,ggml-alloc要求重新分配图;在GGML_SCHED_DEBUG_REALLOC=1 下这会直接中止。
修复依据是:一个ubatch标记的池数不可能超过缓存容纳的池数,预留里的n_pool_max已经覆盖了这个范围。受影响的是触发全上下文解码并开启该调试开关的用户,普通用户不一定要立即升级。
同一版本照例提供macOS、iOS、Linux、Android、Windows多后端预编译包,覆盖CUDA 12/13、Vulkan、ROCm 10.0、OpenVINO、SYCL等。
llama.cpp发布b11339版本,其中一项改动为:llama : clamp kpool re-pool bound to existing pools(#29805)。
改动说明称,对n_new_g施加的n_tokens/kpool + n_seqs_unq上界,在批次填满整个缓存时会越界:n_ctx个token恰好组成n_ctx/kpool个池,因此原来的 +1 会把new_pool_idxs/new_pool_rep多填充一项,越过n_pool_real。
由于图预留只覆盖n_pool_real项,第一次全上下文解码会构建比预留更大的张量,ggml-alloc因此要求重新分配图;在GGML_SCHED_DEBUG_REALLOC=1 下会中止。
修复方式是把上界收紧到n_pool_real:一个ubatch标记的池数不可能超过缓存持有的池数,而预留的n_pool_max已经覆盖该范围。同一提交还包含将上界限制到n_pool_max的延续改动。
提交信息标注Assisted-by: pi:llama.cpp/MiMo-V2.6-Flash-MOPD,并包含一项测试函数签名简化。
b11339提供的预编译产物
该release页面同时列出各平台预编译包链接。
- macOS/iOS:macOS Apple Silicon (arm64)、macOS Intel (x64)、iOS XCFramework;其中开启KleidiAI的macOS Apple Silicon标记为DISABLED。
- Linux:Ubuntu x64/arm64/s390x (CPU)、Ubuntu x64/arm64 (Vulkan)、Ubuntu x64 (CUDA 12) 及CUDA 12.8库、Ubuntu x64/arm64 (CUDA 13) 及CUDA 13.4库、Ubuntu x64 (ROCm 10.0)、Ubuntu x64 (OpenVINO 2026.4)、Ubuntu x64 (SYCL FP32/FP16)、Linux arm64 (Snapdragon:CPU、Adreno GPU、Hexagon NPU)。
- Android:Android arm64 (CPU)、Android arm64 (Snapdragon:CPU、Adreno GPU、Hexagon NPU)。
- Windows:Windows x64/arm64 (CPU)、Windows arm64 (OpenCL Adreno)、Windows x64 (CUDA 12) 及CUDA 12.4 DLL、Windows x64/arm64 (CUDA 13) 及CUDA 13.4 DLL、Windows x64 (Vulkan)、Windows x64 (OpenVINO 2026.4)、Windows x64 (SYCL)、Windows x64 (ROCm 10.0)。
- openEuler:标记为DISABLED,列出openEuler x86 (310p)、openEuler x86 (910b, ACL Graph)、openEuler aarch64 (310p)、openEuler aarch64 (910b, ACL Graph)。
- 另有UI打包文件。