预发布 / 持续构建:这是一个实验性构建,不是稳定版本。
llama : 修复 k-pool 模型中意外的图重新分配(#29958) * llama : 修复 k-pool 模型中意外的图重新分配 两个 k-pool 模型构建的图形状都依赖于 全上下文预留(full-context reserve)无法得知的状态: - qwen4exp 基于 inp->cache_safe 进行分支,而一旦 llama_memory_seq_cp 共享单元(例如 batched-bench -pps), 该值就会变为 false:QSA 层用 fill+concat 替代了 scatter+gather,并丢弃了 new_pool_rep 叶节点, 因此解码图比预留的图少 12 个节点 - glm5-next 基于 gather = n_tokens <= 16 && n_kv > n_sel 进行分支,因此 TG 解码构建了 gather 形状(7564 个节点), 而最后一次预留(即 PP 那次)却是 dense 形状(7762 个节点) 任何一种不匹配都会强制在解码时重新预留, 从而丢弃最坏情况的容量并固化当前状态, 因此下一次状态增长(n_pool、n_kv、n_new)在图大小 不变的情况下需要更多空间,并在 GGML_SCHED_DEBUG_REALLOC=1 下中止。复现方式例如: GGML_SCHED_DEBUG_REALLOC=1 ./bin/llama-batched-bench \ -hf ggml-org/GLM-5.3-Flash-GGUF:Q2_K -npp 2500 -ntg 32 -npl 1,2 \ -c 32768 -pps -kvu 总是对池化的键(pooled keys)使用 scatter+gather, 并且仅根据上下文常量来选择 gather:n_ubatch 约束每个 ubatch, top_k + kpool - 1 约束 n_sel。这样,一个上下文的所有图 共享同一种形状,预留即可覆盖该形状,而且在 2.5k 和 16k 上下文下, dense 路径的实测速度快于 gather 路径。 Assisted-by: pi:llama.cpp/MiMo-V2.6-Flash-MOPD * llama : 移除未使用的 k-pool cache_safe 图 API k-pool 图不再基于 cache_safe 进行分支,因此不再有任何代码 读取 get_kpool_cache_safe() 或条件性的 new_pool_rep:两个模型 现在总是传递 scatter 目标,而 set_input_kpool 现在要求这样做, 而不仅仅是倾向于这样做。 同时移除 kpool_build_sizes()(一个仅处理大小的辅助函数)中的 cache_safe 副本。布局和状态标志本身保留,它仍然决定 一个包含共享单元的布局必须重新池化哪些池。 Assisted-by: pi:llama.cpp/MiMo-V2.6-Flash-MOPD * tests : 添加一个共享序列(shared-seq)图预留回归测试 将一个提示词解码到 seq 0,通过 llama_memory_seq_cp (这正是 llama-batched-bench 对 -pps 所做的)将其单元与 seq 1 共享, 然后继续解码这两个序列。对于 k-pool 模型,共享会清除 cache_safe,这会改变图的拓扑结构,同时池持续增长, 因此一个用当前状态而非最坏情况状态来重新预留的调度器 会在 GGML_SCHED_DEBUG_REALLOC=1 下中止。测试注册设置了该标志, 并且在 2220411ec1 之前,该测试在两个 k-pool 模型上都会中止。 kimi-linear 和 minimax-01 被跳过:它们用 n_seqs = 1 预留最终的 pp 图(参见 llama-context.cpp 中的 [TAG_RESERVE_DIAG_DECAY]), 因此每个多序列图都有不同的布局,并且按设计会重新预留。 Assisted-by: pi:llama.cpp/MiMo-V2.6-Flash-MOPD * cont : 添加 TODO * cont : 修复注释 * cuda: 在空 ubatch 上匹配 moe 加权归约 ggml_cuda_match_moe_weighted_reduction 曾拒绝行数为零的张量。 一个没有输出的 ubatch 会通过 inp_out_ids 把最后一层缩小到零行, 因此 graph_optimize 在那里丢弃了它的分配依赖(alloc dep), 导致调度器图比预留的图少了一个节点。于是调度器以该 ubatch 的 大小重新预留,而下一个具有相同节点数但张量更大的 ubatch 在 GGML_SCHED_DEBUG_REALLOC=1 下中止。 计算循环在尝试任何融合之前已经会跳过空节点, 所以这个守卫只是让分配依赖取决于行数而已。 * tests: 仅在内部符号可链接的地方构建回滚测试 共享序列用例调用了 llm_arch_from_string,而 libllama 不会 通过 LLAMA_API 导出它,因此在 Windows 上使用共享库时, 链接 test-recurrent-state-rollback 会失败。它的构建现在被放入 NOT WIN32 OR NOT BUILD_SHARED_LIBS 代码块中,紧邻 test-llama-archs 以及它本已所属的测试注册。 * tests: 在共享序列预留测试中按名称跳过架构 对 kimi-linear 和 minimax-01 的跳过是通过 llm_arch_from_string 实现的,而 libllama 不会通过 LLAMA_API 导出它,因此在 Windows 上 使用共享库时测试无法链接。现在它直接比较 general.architecture 字符串,测试再次可以在所有平台上构建。 --------- Co-authored-by: Pascal网站: - https://llama.app
证明: - https://github.com/ggml-org/llama.cpp/attestations/52789660
macOS/iOS: - macOS Apple Silicon (arm64) - macOS Apple Silicon (arm64,启用 KleidiAI) 已禁用 - macOS Intel (x64) - iOS XCFramework
Linux: - Ubuntu x64 (CPU) - Ubuntu arm64 (CPU) - Ubuntu s390x (CPU) - Ubuntu x64 (Vulkan) - Ubuntu arm64 (Vulkan) - Ubuntu x64 (CUDA 12) - CUDA 12.8 库 - Ubuntu x64 (CUDA 13) - CUDA 13.4 库 - Ubuntu arm64 (CUDA 13) - CUDA 13.4 库 - Ubuntu x64 (ROCm 10.0) - Ubuntu x64 (OpenVINO) - Ubuntu x64 (SYCL FP32) - Ubuntu x64 (SYCL FP16) - Linux arm64 (Snapdragon:CPU、Adreno GPU、Hexagon NPU) - 设置指南
Android: - Android arm64 (CPU) - Android arm64 (Snapdragon:CPU、Adreno GPU、Hexagon NPU) - 设置指南
Windows 平台: - Windows x64(CPU 版) - Windows arm64(CPU 版) - Windows arm64(OpenCL Adreno 版) - Windows x64(CUDA 12 版) - CUDA 12.4 DLL 文件 - Windows x64(CUDA 13 版) - CUDA 13.4 DLL 文件 - Windows arm64(CUDA 13 版) - CUDA 13.4 DLL 文件 - Windows x64(Vulkan 版) - Windows arm64(Vulkan 版) - Windows x64(OpenVINO 版) - Windows x64(SYCL 版) - Windows x64(ROCm 10.0 版)
openEuler: - 已禁用 - openEuler x86 架构(310p) - openEuler x86 架构(910b,ACL Graph) - openEuler aarch64 架构(310p) - openEuler aarch64 架构(910b,ACL Graph)
UI: - UI