TypeError: argument ‘vocab’: ‘dict’ object is not an instance of ‘Sequence’

该报错通常发生在从 Transformers v4 升级到 v5 后加载 BarthezTokenizer 时,原因是 BPE 词汇表被硬编码的 Unigram 初始化逻辑拒绝。优先检查你使用的模型是否为 moussaKam/barthez (BPE)而非 moussaKam/mbarthez (U

快速结论:该报错通常发生在从 Transformers v4 升级到 v5 后加载 BarthezTokenizer 时,原因是 BPE 词汇表被硬编码的 Unigram 初始化逻辑拒绝。优先检查你使用的模型是否为 moussaKam/barthez(BPE)而非 moussaKam/mbarthez(UNIGRAM),并考虑改用 TokenizersBackend 直接加载 tokenizer.json。

适用环境:Transformers v5.17.0.dev0(main 分支),Python 3.10.20,PyTorch 2.12.0+cu130(CUDA),tokenizers 0.23.1,Linux 系统,CPU only 加载 tokenizer 时触发。

最快修复方案:Issue 中暂无经过确认的“一键修复”代码方案。维护者建议可以尝试使用 TokenizersBackend.from_pretrained 直接加载 tokenizer.json 文件绕过该问题,但此方案未在 Issue 中被实际验证为完整替代方案。

注意事项:该问题归属于 Transformers v5 的回归缺陷,官方尚未合并修复补丁。仅将 model = Unigram 写入类中不可行,会导致 BPE 词汇被错误切分(如 '▁B', 'on', 'jour' 而非 '▁Bonjour')。

问题场景

用户在加载 moussaKam/barthez 模型时触发此问题,调用 AutoTokenizer.from_pretrained("moussaKam/barthez") 即抛出 TypeError。该模型在 Transformers v4.57.1 中可以正常加载并返回标记 ID [0, 17678, 36, 715, 2],但在 v5 主分支上完全不可用。此回归影响自定义加载脚本以及官方文档示例。

报错原文

TypeError: argument 'vocab': 'dict' object is not an instance of 'Sequence'
File ".../models/barthez/tokenization_barthez.py", line 118, in __init__
    self._tokenizer = Tokenizer(Unigram(self._vocab, unk_id=3, byte_fallback=False))

原因分析

可能原因:moussaKam/barthezmoussaKam/mbarthez 两个检查点使用不同的 sentencepiece 算法(前者为 BPE,后者为 UNIGRAM),而 BarthezTokenizer 在 v5 的 __init__ 中硬编码为始终构建 Tokenizer(Unigram(...))。当传入 BPE 模型的词汇表时(tokenizer.json 中 vocab 为 dict + 114917 merges),Unigram 构造函数拒绝 dict 类型的 vocab,从而抛出此 TypeError。

进一步的回归根源是 #42563 引入的 convert_to_native_format 将检查点自身的 vocab 直接送入硬编码的 Unigram 路径;此前在 v4 中该类型不匹配未被执行检查,所以可以“侥幸”加载。

环境排查

  • 确认 transformers 版本:v5 系列受影响(如 5.17.0.dev0),v4.57.1 正常。
  • 确认目标模型:moussaKam/barthez(BPE)会报错;moussaKam/mbarthez(UNIGRAM)正常。
  • 检查 tokenizer.json 中 vocab 的结构:dict + merges 表示 BPE;list of [piece, score] 对表示 UNIGRAM。
  • 确认加载路径:无论从 spm 文件还是 tokenizer.json 加载,最终都会走到构造 Unigram 的代码行并失败。
  • 无需 GPU;纯 CPU 加载 tokenizer 即可复现。

解决步骤

  1. 确认是否必须使用 v5:如果生产环境仍依赖 Transformers v4,可先固定 transformers==4.57.1,该版本下 moussaKam/barthez 正常返回预期 ID。
  2. 可优先尝试的绕行方案:使用 TokenizersBackend.from_pretrained("moussaKam/barthez") 直接加载该检查点的 tokenizer.json 文件,绕过 BarthezTokenizer 的 Unigram 硬编码构造逻辑。此方案来自维护者建议,尚未在原始 Issue 中得到完整代码验证。
  3. 检查测试是否被误导:若你在维护依赖该模型的测试套件,注意 tests/models/barthez/test_tokenization_barthez.py 固定使用的是 moussaKam/mbarthez(UNIGRAM),因此不会暴露此回归。不要把测试通过当作该模型可用的证据。
  4. 追踪官方修复:关注 huggingface/transformers 中针对该 Issue 的 Pull Request。修复方向是在 __init__ 中按照 vocab 形状分派后端(dict + merges → BPE,list of pairs → Unigram),并连通 merges 数据。

验证方法

运行与 Issue 中完全一致的代码,确认不再抛 TypeError:

from transformers import AutoTokenizer
AutoTokenizer.from_pretrained("moussaKam/barthez")

预期输出:[0, 17678, 36, 715, 2](v4.57.1 ID)。若使用 tokenizer.json 直接加载,可对照 Tokenizer.from_file(...).encode("Bonjour le monde") 的结果,正确的分段应为 ['▁Bonjour', '▁le', '▁monde']

参考来源

huggingface/transformers #48567

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 22297

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注