llama.cpp b11279加入GLM-5.3-Flash(GLM5-Next)支持
合并请求 #27773 为llama.cpp引入GLM-5.3-Flash架构支持,包含多流预取、k-pool缓存复用与混合状态回滚修复,同时发布覆盖macOS、Linux、Windows、Android的新版二进制。
AI解读:这次改动不只是加一个模型名。提交记录显示工作包括把GLM-Next支持迁移到llama-memory-hybrid-idx、引入MTP(多token预测)支持、降低分配的计算缓冲区大小、加快长上下文解码,并针对GLM5-Next的k-pool缓存做了按ubatch增量更新的重构。
对跑本地模型的人来说,真正的门槛往往不是权重量化,而是KV缓存和状态回滚这类工程细节。这次提交修了一串具体缺陷:跨ubatch的k-pool布局在编辑序列后可能指向错误单元,导致CPU端logit大幅漂移、CUDA端出现NaN;GPU ROCm图重分配时因节点数固定而中止测试的问题也一并处理。
还有一处影响面被明确写出:build_attn_mha的非连续q步长问题,会让Split-KV多流预填充中第一个以外的流读错查询头。统一KV和解码路径不受影响。换句话说,只有开 -np且没有 --kv-unified的多流预填充用户会踩到,修复后这条路径才正确。
普通用户不需要为这次更新做任何事。如果你在用llama.cpp跑GLM-5.3-Flash,或者用Split-KV多流预填充服务多请求,b11279值得替换;否则它只是一个常规版本迭代,附带一套覆盖macOS、Linux、Windows、Android的预编译包。
llama.cpp发布b11279版本,主要变更是合并PR #27773,加入GLM-5.3-Flash(GLM5-Next)支持。
提交记录显示,这次工作包括把GLM-Next支持迁移到llama-memory-hybrid-idx、添加初步MTP(多token预测)支持、合并分支优化以降低分配的计算缓冲区大小、加快长上下文解码与fla,并带来少量MTP改进。
GLM5-Next的k-pool缓存按ubatch增量更新
提交说明指出,此前k-pool布局在每个ubatch都会从完整的cell扫描重建。由于池由相对序列首个位置的偏移固定,现在布局存于memory上,ubatch只做追加。
序列编辑不再让所有池化key失效,只影响编辑位置及之后的key,因此尾部seq_rm变成免费操作。池化子图改为无条件构建,图形状不再每kpool个token变化一次;池轴在soft_max之前折叠进行,否则在n_kv超过 262144 时会超出CUDA gridDim.y限制。
后续修复提到跨ubatch k-pool布局的两个缺陷:一是编辑后的序列只有cell数量变化时才重建布局,若编辑后第一个ubatch加回的cell数量恰好等于移除数量,陈旧的位置到cell映射会保留;在统一缓存且多序列、其他序列占用释放cell的情况下,复用布局指向错误cell,表现为CPU端logit大幅漂移、CUDA端NaN。修复方式是在序列stale时重建,而非仅在大小不匹配时。
二是“shared”模式此前被假定只会因触发重建的编辑而结束,但共享也会在其他序列被移除时结束。幸存序列保持shared = true会锁住cache_safe,导致每个ubatch重新池化每个池(服务器触发条件:n>1 补全配合 -kvu,经copy_state_to中的seq_cp)。在seq_rm中,若布局含共享cell,则将所有序列标为stale,让一次重建重新推导共享关系,cache_safe恢复为 1。
- 布局存于memory,ubatch只追加,不再每次从完整cell扫描重建。
- 序列编辑只使编辑位置及之后的池化key失效。
- 池化子图无条件构建,图形状不再每kpool个token变化。
- 池轴在soft_max前折叠进行,避免n_kv超过 262144 时超出CUDA gridDim.y限制。
非连续q的流步长修复影响Split-KV多流预填充
build_attn_mha此前用q->nb[3]/n_stream作为流步长拆分批次。提交说明指出,该值只有q连续时才等于单个流的跨度 (ne[2]/n_stream)*nb[2]。GLM5-Next是nope-only,不拼接rope部分,直接把置换后的q_absorbed传入,此时nb[3] != ne[2]*nb[2],步长会大n_head倍,导致每个s >= 1 的流读到另一个头的查询。
修复方式是从token维度计算步长,对连续q来说结果相同。影响范围被明确限定:Split-KV(-np N且没有 --kv-unified)的多流预填充中,第一个以外的每个流此前结果错误;统一KV和解码路径不受影响,因为n_stream == 1,且解码走gather路径;其他MLA模型拼接rope,q连续,计算值不变。
- 影响条件:-np N且没有 --kv-unified的Split-KV多流预填充。
- 统一KV与解码不受影响:n_stream == 1,解码走gather路径。
- 其他MLA模型拼接rope,q连续,计算结果不变。
混合状态回滚与ROCm图重分配修复
提交说明称,GLM5-Next的conv状态和delta net状态此前只写入活动行,回滚会恢复检查点行恰好持有的内容。修复参照kimi-k3的做法:用build_recurrent_attn构建状态,并写入所有K_rs conv组,同时去掉一个假定行连续的state视图。该架构被加入test-recurrent-state-rollback测试,在垃圾填充缓存遍历中能捕获此问题。
另一处修复针对PR #27773 的test-save-load-state恢复失败:混合状态恢复失败后清除attention和indexer缓存数据,避免恢复出的NaN影响后续序列。
gpu-rocm图重分配问题也有专门修复:预留完整的GLM5-Next池容量和dirty池计数。提交说明称,当n_new增长而图节点数固定时,gpu-rocm测试步骤会中止,CUDA、Vulkan、Metal和WebGPU检查报告相同错误。
state_read和state_drop路径补上了与seq_rm相同的共享cell重新推导:此前只将单个序列标为stale,现在同样重新推导;此前声称共享仅通过编辑或seq_rm结束的注释也被修正。
- conv状态和delta net状态此前只写入活动行,回滚会恢复到检查点行内容。
- 修复参照kimi-k3:build_recurrent_attn构建状态,写入所有K_rs conv组。
- 混合状态恢复失败后清除attention与indexer缓存数据,防止NaN影响后续序列。
- 预留完整GLM5-Next池容量与dirty池计数,解决n_new增长而图节点数固定时gpu-rocm测试中止。
其他改动与发布产物
其他被记录的改动包括:移除环境变量并保护张量;修复tokenizer ignore merges;改进量化保护选择;重构mhc辅助函数与图基类;修复lint。在model saver中跳过glm5-next并修正CRLF,在sweep中跳过glm5-next,移除T4回退。
gguf-py合并了HC张量的tensor map条目;GLM5_NEXT实现改用build_gdn_l2_norm和新的OP精度设置API;GLM5V使用ggml_swiglu_clamp并应用图像token限制,此前GLM5V从未调用set_limit_image_tokens(),导致 --image-max-tokens无效。量化保护块中重复的hc_名称过滤器被删除。
b11279提供的预编译包覆盖macOS Apple Silicon(arm64)、macOS Intel(x64)、iOS XCFramework、Ubuntu x64/arm64/s390x(CPU)、Ubuntu Vulkan、Ubuntu CUDA 12.8、CUDA 13.4、ROCm 10.0、OpenVINO、SYCL FP32/FP16、Linux arm64 Snapdragon、Android arm64,以及Windows x64/arm64的CPU、CUDA 12.4/13.4、Vulkan、OpenVINO、SYCL、ROCm 10.0版本,另附UI包。openEuler产物标注为DISABLED。
- macOS Apple Silicon arm64 KleidiAI版本标注为DISABLED。
- 移除T4回退,model saver与sweep跳过glm5-next。
- GLM5V此前从未调用set_limit_image_tokens(),--image-max-tokens无效。
- openEuler产物标注为DISABLED(关联PR #23705)。