快速结论:这通常不是运行时报错,而是 llama.cpp / ggml 库的 C/C++ 头文件和内核在重构期间出现的编译错误或弃用警告;最可能的原因是代码里仍直接调用 ggml_diag_mask_* 系列函数或使用 DIAG_MASK_* 算子。这个重构的源起是 Refactor: Deprecate DIAG_MASK_* operators, migrate kernels to TRI 所描述的迁移,因此先排查并替换这些旧接口。
适用环境:Issue 讨论中未明确确认操作系统、Python、CUDA、显卡型号或具体依赖版本;仅涉及 llama.cpp / ggml 的 C/C++ 代码(头文件、算子定义和张量内核)。
最快修复方案:暂无确认的一步修复方案。讨论中给出的方向是:将 ggml_diag_mask_* 的调用迁移到 ggml_tri(配合 ggml_fill),并按讨论中的 n_past 映射处理;后续方案是在 v1.0.0 中直接移除旧算子。
注意事项:讨论中 n_past 的映射为 LOWER 支持 0/-1、UPPER 支持 0/1,其他值报错,这一结论只在当前讨论链中形成,最终实现以合入的 PR 为准。若代码是在某个旧版 v0.x 上运行,直接照搬移除后的写法可能与旧版本不兼容;inplace 方式在 TRI 路径下不再支持,也是需要改动调用方的地方。
问题场景
你在编译 llama.cpp / ggml 相关代码,或在基于它构建推理程序时,代码中仍包含旧的 ggml_diag_mask_inf、ggml_diag_mask_zero 等 DIAG_MASK_* 算子调用,触发了弃用告警,或与重构后的头文件、内核签名不匹配而编译失败。该 Issue 正是围绕“弃用 DIAG_MASK_* 算子,并把内核迁移到 TRI”展开。
报错原文
Refactor: Deprecate DIAG_MASK_* operators, migrate kernels to TRI
原因分析
可能原因:旧实现中的 ggml_diag_mask_inf_impl 和 ggml_diag_mask_zero_impl 不再作为独立内核存在,重构方向是让 ggml_diag_mask_* 内部调用 ggml_tri,遇到不支持的情况直接抛错。评论链中确认的映射思路为:ggml_diag_mask_zero 对应 GGML_TRI_TYPE_LOWER_DIAG(n_past == 0)或 GGML_TRI_TYPE_LOWER(n_past == -1);ggml_diag_mask_inf 对应 GGML_TRI_TYPE_UPPER_DIAG(n_past == 0)或 GGML_TRI_TYPE_UPPER(n_past == 1)。此外,TRI 路径总是创建新张量,传入 inplace == true 会失败;ggml_diag_mask_inf 用 -FLT_MAX 参与加法掩码构造,是因为用 -INF 做乘法类内核会产生 NaN。对于 v1.0.0,讨论倾向于跳过弃用阶段直接移除旧算子。
环境排查
- 确认当前 llama.cpp / ggml 是旧版
v0.x,还是已包含 TRI 迁移或已移除旧算子的版本。 - 检查项目中是否直接调用
ggml_diag_mask_inf、ggml_diag_mask_zero或引用DIAG_MASK_*算子。 - 检查调用处传入的
n_past值,以及是否使用inplace = true。 - 检查目标后端(如 CPU、Metal)以及
ggml_tri对应内核是否在该版本中可用。 - Issue 中未给出可核对的 Python、CUDA、PyTorch、显卡驱动或 WebUI 节点版本,不要据此补充猜测。
解决步骤
- 在代码库中搜索
DIAG_MASK_和ggml_diag_mask_,找出所有直接调用点。 - 按讨论中的映射改写为零掩码或无穷掩码的 TRI/FILL 组合:LOWER 侧使用
ggml_tri(ctx, a, GGML_TRI_TYPE_LOWER_DIAG)(n_past == 0)或GGML_TRI_TYPE_LOWER(n_past == -1);UPPER 侧使用GGML_TRI_TYPE_UPPER_DIAG(n_past == 0)或GGML_TRI_TYPE_UPPER(n_past == 1)。这些函数名和常量以你所用版本的实际头文件为准。 - 去掉
inplace = true的使用,改为接收 TRI 返回的新张量;TRI 路径不支持原地写入。 - 对
n_past超出上述取值范围的旧调用做显式判断,按讨论允许的方式抛出错误,而不是继续走掩码构造。 - 如果准备升级到讨论中提到的 v1.0.0 或移除分支,以合入后的版本为准处理旧算子的删除,不要在旧
v0.x上直接套用。
验证方法
重新编译目标项目,确认不再出现 DIAG_MASK_* 弃用提示或相关符号/签名错误;运行原先依赖掩码的推理或训练路径,检查输出是否出现 NaN,并确认 n_past 为非常规值时按预期报错。讨论中提到 n_past = 0 的掩码在 CPU 上应与旧内核逐位一致,可作为对照验证点。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。

![[RFC]: Explicit row layouts for routed-expert capture](https://www.chat-gpts.plus/wp-content/uploads/2026/11/61539-7c3b399e-768x403.jpg)
![[Bug]: MiMo-V2.6 video timestamps ignore real frame times (every clip is labelled 00:00–00:30)](https://www.chat-gpts.plus/wp-content/uploads/2026/11/65523-beeb4aaf-768x403.jpg)