原帖目录已有 vocab.json、merges.txt 和 tokenizer_config.json,但旧 AutoTokenizer 仍去查模型 config.json:
OSError: file distilroberta-tokenizer/config.json not found
tokenizer 文件与模型配置承担不同职责
原题本地已有 vocab、merges 和 tokenizer_config,失败发生在旧 AutoTokenizer 自动判断类时查找模型 config。不要先假设网络下载失败,更不要创建空 config.json 应付文件存在检查。应根据实际库版本选择显式类,或保存配套的真实模型配置。
这说明分词文件不一定丢失。旧版 AutoTokenizer 可能依赖模型配置判断该使用哪个 tokenizer 类,只有 tokenizer.save_pretrained 的产物还不够满足它的自动推断路径。
先检查实际目录与库版本,防止相对路径指向另一处:
from pathlib import Path
import transformers
p = Path("distilroberta-tokenizer").resolve()
print("josh050608")
print("transformers:", transformers.__version__)
print("directory:", p, p.is_dir())
print("files:", sorted(x.name for x in p.iterdir()) if p.is_dir() else [])
原题已知分词器来自 distilroberta-base。可以显式使用对应的 RobertaTokenizer,从本地词表和 merges 加载,避免自动推断类:
from transformers import RobertaTokenizer
tmp = RobertaTokenizer.from_pretrained(str(p), local_files_only=True)
如果仍要沿用该旧版 AutoTokenizer,可把原模型的配套配置通过 config.save_pretrained(p) 保存到同目录;配置应来自同一模型,不能随便创建空 config.json 或复制另一架构的文件。新的 Transformers 版本对 tokenizer 元数据的处理有所不同,应按实际版本核对。
完整离线交付时,保存 tokenizer 和模型配置/权重,记录版本与特殊 token;若新增 token,还需与模型 embedding 对齐。
验证先用 local_files_only=True 断开自动下载依赖,再比较同一文本在保存前后的 input_ids、特殊 token 和 attention_mask。只做到目录里出现一个 config.json,不代表加载结果正确。
离线重载要比较编码结果
保存后记下绝对目录与版本,显式本地加载,避免路径拼错时自动转成远端模型名。下面片段承接已经能工作的 tokenizer,不下载模型;只创建临时保存目录:
import tempfile
from pathlib import Path
from transformers import RobertaTokenizer
text = "Hello there"
before = tokenizer.encode_plus(text)
with tempfile.TemporaryDirectory() as folder:
saved = Path(folder) / "tokenizer"
tokenizer.save_pretrained(str(saved))
restored = RobertaTokenizer.from_pretrained(str(saved), local_files_only=True)
after = restored.encode_plus(text)
assert before["input_ids"] == after["input_ids"]
assert before["attention_mask"] == after["attention_mask"]
assert tokenizer.special_tokens_map == restored.special_tokens_map
print("saved files:", sorted(path.name for path in saved.iterdir()))
这个显式类适用于原题已知的 distilroberta 来源,不是任意 tokenizer 的通用替换。若原对象使用 fast 实现,还需检查 fast/slow、添加 token 和特殊 token 配置是否保持一致,不以一次普通文本相同证明所有边界都一致。
继续旧 AutoTokenizer 路线时,用同一模型的 config.save_pretrained 补齐其推断所需配置;完整离线模型交付还包括权重与 tokenizer。不要将另一个 BERT 架构配置复制来,让自动类选错却暂时不缺文件。
验收在 local_files_only 下对普通文本、特殊 token 和新增 token 进行编码比较,确认没有暗中依赖网络。若新增 token,模型 embedding 行数也要与词表对齐;“本地重载成功”只验证文件和类推断,不代表模型已适配新词表。
参考:原始求助帖;技术依据:Transformers Tokenizer(4.46)、Transformers BERT(4.46)、Transformers 2.11.0 AutoTokenizer 源码。