
Assertion ‘__n size()’ failed.
快速结论:该报错在 llama-server 中使用 --spec-type ngram-map-k 等推测解码(speculative decoding)参数时触发,优先排查推测解码功能下的 ngram-map 索引越界问题。
问题场景
用户在 AMD RYZEN AI MAX+ PRO 395 平台(Linux)上运行 llama-server,配置了推测解码(speculative decoding)参数(如 --spec-draft-n-max、--spec-type ngram-map-k),并加载了 Qwen3.6-35B-A3B-MTP-GGUF_Q8_K_XL 模型。服务器在使用 --models-max 1 和 --cache-prompt 等参数运行时,偶发崩溃,通常需要运行 20-30 分钟才复现。
报错原文
Assertion '__n < this->size()' failed.
/usr/include/c++/16.1.1/bits/stl_vector.h:1272:
constexpr std::vector<_Tp, _Alloc>::const_reference
std::vector<_Tp, _Alloc>::operator[](size_type) const
[with _Tp = int; _Alloc = std::allocator<int>;
const_reference = const int&; size_type = long unsigned int]:
Assertion '__n < this->size()' failed.
原因分析
该断言失败表明使用 std::vector::operator[] 访问了越界索引(索引值 __n 大于等于向量大小)。根据 Issue 讨论中的堆栈回溯,崩溃发生在 common/ngram-map.cpp 的 L346 行附近,访问 inp[map.keys[i].key_idx + j] 时索引超出 inp 向量的边界。这与推测解码中的 ngram-map 刷新操作(common_ngram_map_begin: refresh map)密切相关。当禁用推测解码(--spec-draft-n-max 等参数)后,用户确认不再复现。
环境排查
- 工具版本:llama-server version 9413 (基于 commit 24d6d7c)
- 操作系统:Linux (x86_64)
- GGML 后端:HIP(AMD GPU 支持)
- 硬件:AMD RYZEN AI MAX+ PRO 395 w/ Radeon 8060S
- 编译器:GNU 16.1.1
- 推测解码参数:启用
--spec-draft-n-max 3、--spec-draft-n-min 1、--spec-type ngram-map-k等 - 模型:Qwen3.6-35B-A3B-MTP-GGUF_Q8_K_XL
解决步骤
- 确认是否为推测解码相关:如果当前使用了
--spec-type ngram-map-k等推测解码参数,可先尝试临时移除所有推测解码相关参数(如--spec-draft-n-max、--spec-draft-n-min、--spec-type等),确认问题是否消失。 - 应用补丁(可优先尝试):Issue 中已提交 PR #23936 修复该问题,修复位置在
common/ngram-map.cpp的 L346 行附近。建议更新到包含此修复的版本(如 >= commit 6ed481eea4cf4ed40777db2fa29e8d08eb712b3b 之后的修复分支),或者手动应用该 PR 的补丁。 - 构建含调试符号的版本:如果希望自行定位,可使用
-g或CMAKE_BUILD_TYPE=Debug重新构建,以获取更详细的堆栈信息。
验证方法
应用补丁或升级版本后,在相同的模型和参数配置下(保持推测解码相关参数),长时间运行(如 30 分钟以上)llama-server,确认不再触发 Assertion '__n < this->size()' failed. 崩溃。建议同时观察日志中不再出现 common_ngram_map_begin: refresh map 后的索引异常。



