
ImportError: pass # Fall back to slow if fast not available
快速结论:该报错出现在 HuggingFace Transformers v5 的 AutoTokenizer.from_pretrained() 中,加载某些模型(如 OLMo2、HyperClovaX、DeepSeek-R1-Distill-Llama 等)时错误地使用了慢速 tokenizer,导致 token ID 与模型训练时使用的 fast tokenizer 不匹配。优先检查 tokenizer_config.json 中的 tokenizer_class 字段,并确保代码中未强制指定 use_fast=False。
问题场景
用户在 Transformers v5 (v5.8.0, v5.0.0 ~ v5.7.0) 中使用 AutoTokenizer.from_pretrained() 加载以下模型家族时触发:
– OLMo2 (GPT2Tokenizer)
– HyperClovaX (GPT2Tokenizer)
– Granite / GraniteMoEHybrid (GPT2Tokenizer)
– DeepSeek-R1-Distill-Llama (LlamaTokenizer)
– Yi (LlamaTokenizer)
– ERNIE (LlamaTokenizer)
共发现约 62 个受影响模型,合计下载量超过 3M。
报错原文
# 典型复现代码输出(非崩溃,但 token ID 错误)
# AutoTokenizer 产生的错误 token ID:
[508, 1419] # tok_v5.encode("2023", add_special_tokens=False)
# 正确 token ID(使用 PreTrainedTokenizerFast):
[2366, 18] # tok_correct.encode("2023", add_special_tokens=False)
# 底层对应文件位置:src/transformers/models/auto/tokenization_auto.py
# 关键代码行(注释原文):
pass # Fall back to slow if fast not available
原因分析
根本原因:这是 Transformers v5 的回归问题(与 #45812 Granite 模型同根同源)。
AutoTokenizer.from_pretrained() 在 tokenization_auto.py 中的分支逻辑:
- 从模型的
tokenizer_config.json读取tokenizer_class字段(例如"GPT2Tokenizer") - 直接实例化该(慢速)tokenizer 类,不检查是否存在 fast 变体
- 慢速 tokenizer 的预分词算法与训练时使用的 fast tokenizer 不同,导致 token ID 完全错误
影响范围:仅 GPT2Tokenizer 和 LlamaTokenizer 类被发现受影响,但所有具有自定义 __init__ 的 tokenizer 类理论上都可能受影响。
环境排查
- Transformers 版本:确认版本 ≥5.0.0(v5.8.0 仍未修复)
- Python 版本:3.12.13(已验证)
- Tokenizers 版本:0.22.2
- Huggingface_hub 版本:1.14.0
- 受影响模型示例:
allenai/OLMo-2-0425-1B、deepseek-ai/DeepSeek-R1-Distill-Llama-8B、naver-hyperclovax/HyperCLOVAX-SEED-Think-14B、ibm-granite/granite-4.1-8b、01-ai/Yi-34B-Chat、baidu/ERNIE-4.5-21B-A3B-Thinking
解决步骤
- 临时方案(可优先尝试):改用
PreTrainedTokenizerFast.from_pretrained(model_id)替代AutoTokenizer.from_pretrained(model_id),确保加载 fast tokenizer。 - 检查手动修复:通过
AutoTokenizer.from_pretrained(model_id, use_fast=True)显式请求 fast tokenizer(尽管 Issue 指出 v5 的use_fast参数可能被忽略)。 - 等待官方修复(Issue 中提出的修复方案:在
tokenization_auto.py中添加SLOW_TO_FAST_TOKENIZER_MAP映射,或在from_pretrained中优先检查 fast 变体)。 - 验证受影响范围:如果使用
GPT2Tokenizer或LlamaTokenizer类的模型,建议先用PreTrainedTokenizerFast验证 token ID 是否正确。
验证方法
运行以下回归测试脚本,确认 AutoTokenizer 是否加载了 fast tokenizer 且 token ID 一致:
import pytest
from transformers import AutoTokenizer, PreTrainedTokenizerFast
test_cases = [
("allenai/OLMo-2-0425-1B", "GPT2Tokenizer"),
("deepseek-ai/DeepSeek-R1-Distill-Llama-8B", "LlamaTokenizer"),
("naver-hyperclovax/HyperCLOVAX-SEED-Think-14B", "GPT2Tokenizer"),
]
for model_id, expected_class in test_cases:
tok = AutoTokenizer.from_pretrained(model_id)
assert "Fast" in type(tok).__name__, (
f"Loaded slow tokenizer: {type(tok).__name__}"
)
tok_fast = PreTrainedTokenizerFast.from_pretrained(model_id)
assert tok.encode("2023", add_special_tokens=False) == tok_fast.encode("2023", add_special_tokens=False), (
f"Token ID mismatch for {model_id}"
)
print("All tests passed: AutoTokenizer correctly uses fast tokenizer.")



