快速结论:“Misc. bug: Nemotron 3 / 3.5 GGUFs are tagged “pixtral” and get the wrong pre-tokenizer” 通常出现在用 llama.cpp 加载 Nemotron 3 / 3.5 系列 GGUF(如 Nemotron-3-Nano-4B)并做分词或推理时:GGUF 中 tokenizer.ggml.pre 被写成 pixtral,llama.cpp 进而套用 Llama 3 预分词正则,导致印地语、泰米尔语、泰卢固语、孟加拉语、泰语等文本的 token 序列与 Hugging Face 不一致,英文一般不受影响。优先检查 GGUF 的 tokenizer.ggml.pre 与 general.architecture,再尝试把预分词器改为 tekken。
适用环境:Issue 中验证的环境为 macOS、Apple M4 Pro,llama.cpp 自源码构建(b11757-20-g839a572a4 / master 839a572a4);评论中另在 master 339f324 的 CPU 构建上复现。Python、CUDA、PyTorch 版本未在讨论中给出。
最快修复方案:暂无确认的一步修复方案。讨论中被实际验证可让分词结果与 HF 对齐的做法是:把受影响 GGUF 的 tokenizer.ggml.pre 从 pixtral 改为 tekken(通过 llama-server 的 –override-kv tokenizer.ggml.pre=str:tekken,或用 gguf-py/gguf/scripts/gguf_new_metadata.py –pre-tokenizer tekken 重写元数据)。作者提出的把 pixtral 统一映射到 tekken 的加载期修改尚未合入。
注意事项:llama-tokenize 会接受 –override-kv tokenizer.ggml.pre=str:tekken 并返回 0,但实际不生效(tools/tokenize/tokenize.cpp 没有处理该覆盖),因此不能用 llama-tokenize 验证覆盖效果;llama-server 的同一覆盖有效。同一 Issue 中 ” !” 被解码为 “!” 的问题(clean_up_tokenization_spaces 被 LLAMA3 分支打开)已拆到 #30905 跟踪,不属于本 Issue 范围。修改元数据属于对已发布 GGUF 的改写,需确认目标架构确为 nemotron_h / nemotron_h_moe 后再操作。
问题场景
用户在 llama.cpp 中加载 NVIDIA 的 Nemotron-3-Nano-4B-GGUF、Nemotron-3.5-Bolt-74B-A9B-24GB-GGUF,ggml-org 的 Nemotron-3.5-Lightning-30B-A3B、Super-VL-120B-A12B,以及 Unsloth、bartowski、LM Studio 等发布的 Nemotron 3 / 3.5 GGUF,执行 llama-tokenize 或 llama-server 的 /tokenize 进行分词,或运行 test-tokenizer-0 测试词汇表时触发。表现为 llama.cpp 与 Hugging Face 对同一段非英文文本给出不同的 token 数量和 id,例如印地语 27 个 token 而非 16 个,泰米尔语 20 而非 15,泰卢固语 15 而非 11,孟加拉语 19 而非 15,泰语 18 而非 15。
报错原文
pixtral
[4894, 2063]
[44213]
operator() : failed test: 'दी हिन्दी'
operator() : failed test: 'สวัสดี'
Tests failed
原因分析
已确认的直接原因:转换器对 Nemotron tokenizer 计算的 chkhsh 与 Pixtral-12B 相同(0e9433cb…),于是 GGUF 里写入 tokenizer.ggml.pre = “pixtral”;src/llama-vocab.cpp 把 “pixtral” 映射到 LLAMA3 分支,而 Nemotron 的 tokenizer.json 实际使用 Tekken 正则,并非 Llama 3 正则,因此分词规则错误。此外 Nemotron 的 clean_up_tokenization_spaces 为 false,但 LLAMA3 分支会把 clean_spaces 打开。
讨论中进一步指出,pixtral 这个哈希来自 mistral-community/pixtral-12b 的 tokenizer.json(用 Llama 3 正则),而 Mistral 官方 mistralai/Pixtral-12B-2409 的 tekken.json 用的是 Tekken 正则;Nemotron 3 / 3.5 和 mistralai/Ministral-3-8B-Instruct-2512 共用同一哈希、但同样是 Tekken 正则。可能的根因是 pixtral 这一标签本身被关联到了错误的 Llama 3 分支。转换器的标准测试字符串在两种正则下切分结果相同,也是该问题未能被现有测试发现的原因。
环境排查
- 确认 llama.cpp 版本:Issue 复现于 b11757-20-g839a572a4(master 839a572a4)与 master 339f324,其他版本是否受影响未验证。
- 确认构建方式与平台:自源码构建,macOS / Apple M4 Pro;评论中另用 CPU 构建复现。
- 读取 GGUF 元数据,确认 general.architecture 是否为 nemotron_h / nemotron_h_moe,tokenizer.ggml.pre 是否为 pixtral。
- 确认所用 GGUF 的发布来源与版本(NVIDIA、ggml-org、Unsloth、bartowski、LM Studio 的不同发布可能存在差异,例如 Unsloth 的 Bolt BF16 已标记为 tekken)。
- 对照 Hugging Face 原模型的 tokenizer.json,判断其预分词器属于 Tekken 还是 Llama 3 正则。
- python / CUDA / PyTorch / 显卡版本:讨论中未涉及,排查时可一并记录,但不属于已确认的触发条件。
解决步骤
- 先复现基线:用 llama-tokenize 对 -p “दी” –ids –no-bos 得到 [4894, 2063],而 Hugging Face 原模型对同一文本给出 [44213],即可确认命中本问题。
- 用 llama-server 加载受影响 GGUF,启动时附加 –override-kv tokenizer.ggml.pre=str:tekken。评论中验证该覆盖在 llama-server 的 /tokenize 路径上生效,印地语、泰米尔语、泰语样例的 token 序列与 Hugging Face 一致,英文与日文、阿拉伯文、Python 样例保持不变。
- 若需要从根本上修正文件,用 gguf-py/gguf/scripts/gguf_new_metadata.py –pre-tokenizer tekken 重写 GGUF 元数据;评论中验证重写后的副本在所有样例上与 Hugging Face 一致。操作前备份原文件,并确认架构为 nemotron_h / nemotron_h_moe。
- 不要用 llama-tokenize 加 –override-kv 来验证:该工具会解析并丢弃这个选项,退出码仍是 0,但输出仍为 [4894, 2063]。验证覆盖效果请走 llama-server。
- 等待上游方案落地:作者提出的一行修改是把 src/llama-vocab.cpp 中 “pixtral” 从 llama3 分支移到 tekken 分支(计划在 #30940 合并后提交),另一选项是在转换器中修正、只影响新转换的文件;截至讨论结束该修改尚未合入。
验证方法
修正后用 llama-server 的 /tokenize 对同一批样例重新分词,与 Hugging Face 使用相同 tokenizer.json、add_special_tokens=False 的结果逐条比对:दी 应为 [44213];印地语 19、泰米尔语 15、泰语 15 个 token;英文样例 token id 不变。若使用词汇表测试,test-tokenizer-0 应 15/15 通过(Issue 作者在加载期修改方案下验证通过),”दी हिन्दी” 与 “สวัสดี” 不再报 failed test。
参考来源
相关讨论中提到的其他 Issue:#30845(同一 Tekken 正则)、#30905(clean_up_tokenization_spaces / llama_detokenize 的引号与标点空格问题)、#30940(作者先行的 PR)。
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。


