开源llama.cpp Releases·原文 2026年9月7日

llama.cpp b10829发布:修复GDN归一化,从max改为rsqrt,对齐参考实现

此修复改变了GDN q/k归一化的epsilon处理方式,影响Qwen3-Next等模型的数值行为,cuda、vulkan等预编译二进制已同步更新。

AI解读:llama.cpp在b10829中修正了GDN(Gated DeltaNet)的q/k归一化:此前用ggml_l2_norm(x / max(sqrt(sum(x*x)), eps)),与参考实现flash-linear-attention的l2norm(x * rsqrt(sum(x*x) + eps),eps在根号内)不一致,实际归一化时epsilon完全不生效。修复改为rms_norm方式计算后,与参考对齐。这直接影响加载了Qwen3-Next等GDN结构检查点的本地推理用户——此前可能因归一化数值偏差影响模型输出或精度,更新b10829后数值行为更接近原版实现。如果你目前在用旧版llama.cpp跑Qwen3-Next,建议重新构建或下载新二进制后重测一次输出;普通用户如果只跑常规模型,无需特别处理,因为改动不涉及这些结构。修复未新增ggml算子,兼容性不受影响。

llama.cpp发布b10829版本。本次改动的核心是修复GDN(Gated DeltaNet)中q/k归一化的实现,将其从基于max的ggml_l2_norm改为与flash-linear-attention参考实现一致的rsqrt形式,使epsilon的处理与模型设计对齐。

修复内容:GDN归一化对齐参考实现

提交说明指出,flash-linear-attention将GDN的q/k归一化定义为l2norm(x) = x * rsqrt(sum(x*x) + eps),其中epsilon位于根号内部。而llama.cpp中所有GDN调用点使用的ggml_l2_norm实现为x / max(sqrt(sum(x*x)), eps),这等价于PyTorch的torch.nn.functional.normalize(其CUDA内核引用了该公式)。由于clamp操作在这些数值量级下从不生效,实际上llama.cpp之前在归一化时完全不使用epsilon,而参考实现则是在根号内包含epsilon。

这一差值此前也影响了transformers:当它最初加入Qwen3-Next时做出了相同的替换,并在三天后通过huggingface/transformers#40842 修正,提交说明为 'Fix the misalignment between the l2norm in GDN of Qwen3-Next and the implementation in the FLA library'。相比之下,vLLM和SGLang直接集成了FLA库,因此从未出现这个clamp问题。

  • 修复未引入新的ggml算子:利用rms_norm已支持根号内epsilon的特性,通过rms_norm(x, eps/n) * (1/sqrt(n)) 精确实现x * rsqrt(sum(x*x) + eps)。
  • ggml_l2_norm函数本身保持不变,其原有调用者rwkv7-base继续使用normalize的默认epsilon 1e-12,不受此次修改影响。
  • 参考实现中对GDN归一化硬编码epsilon为 1e-6,但提交说明认为这是单独的问题,目前对现存所有GDN检查点而言两种方式结果一致。
  • epsilon值始终来自检查点(checkpoint),与之前的调用方式相同。

信息来源

llama.cpp Releases原始来源