ASR example doesn’t save tokenizer settings

这个报错通常出现在用 run_speech_recognition_ctc.py 训练 ASR 模型并推送到 Hub 之后,下载回训练好的模型做推理时,发现仓库里缺少 tokenizer 相关文件(如 tokenizer_config.json 、 vocab.json 等)。优先排查脚本里传给 T

快速结论:这个报错通常出现在用 run_speech_recognition_ctc.py 训练 ASR 模型并推送到 Hub 之后,下载回训练好的模型做推理时,发现仓库里缺少 tokenizer 相关文件(如 tokenizer_config.json、vocab.json 等)。优先排查脚本里传给 Trainer 的是 processor.feature_extractor 还是完整的 processor。

适用环境:Issue 中确认的环境为 transformers 4.28.1、Windows-10-10.0.22621-SP0、Python 3.11.2、huggingface_hub 0.14.1、PyTorch 2.0.1+cu117(GPU 可用但脚本中未使用 GPU)、未安装 safetensors、TensorFlow、Flax、Jax。脚本未使用分布式或并行设置。

最快修复方案:把训练脚本中传给 Trainer 的 tokenizer=processor.feature_extractor 改为 tokenizer=processor。Issue 中有用户明确确认此改法有效(“Can confirm, setting tokenizer=processor in run_speech_recognition_ctc.py works.”)。

注意事项:Trainer 的 tokenizer 参数名具有误导性,它实际负责保存非模型文件。官方后来在 #23243 中修复了该示例,并让 Trainer 通过 processing_class 接收完整 processor。如果你的 transformers 版本较旧,上述手动改动属于“可优先尝试”;若版本较新,直接更新脚本或 transformers 即可。

问题场景

用户使用官方示例脚本 examples/pytorch/speech-recognition/run_speech_recognition_ctc.py 训练 ASR 模型(wav2vec2 CTC 场景),并把模型推送到 Hugging Face Hub。之后在推理端用 pipeline("automatic-speech-recognition", model="...") 加载该模型时,发现训练产物中没有保存 tokenizer 设置,模型仓库缺少 tokenizer 相关文件,导致推理时无法正确加载 tokenizer。

报错原文

ASR example doesn't save tokenizer settings

Issue 标题原文即为核心报错/问题描述。推理脚本方面,Issue 中给出的是加载训练模型做推理的代码片段,并未贴出完整异常栈;问题本质是保存环节缺少 tokenizer 文件,而非推理时的单一报错行。

原因分析

在 run_speech_recognition_ctc.py 初始化时,tokenizer 被设置成了 processor.feature_extractor:

trainer = Trainer(
    ...
    tokenizer=processor.feature_extractor,
    ...
)

processor 类同时组合了 feature extractor 与 tokenizer,但因为只把 feature extractor 传给了 Trainer,Trainer 在 push_to_hub 或保存时调用的是 Wav2Vec2FeatureExtractor.save_pretrained,它不会保存 tokenizer 设置。评论中明确指出这是官方脚本侧的失误:“because we only pass the feature extractor to the Trainer, the tokenizer doesn’t get saved. So that’s clearly a mistake on our end.”

另一个可能原因是文档示例也沿用同样写法,用户照抄 ASR 指南后会复现同样问题。

环境排查

  • 确认 transformers 版本:Issue 报告为 4.28.1;后续修复在 #23243,需确认是否已包含该修复。
  • 确认 Python 版本:Issue 为 3.11.2。
  • 确认 PyTorch 版本:Issue 为 2.0.1+cu117。
  • 确认 huggingface_hub 版本:Issue 为 0.14.1。
  • 确认运行的确实是官方 run_speech_recognition_ctc.py,而非自行改过的脚本。
  • 确认训练脚本中传给 Trainer 的参数是 tokenizer=processor.feature_extractor 还是 tokenizer=processor,或较新版本中的 processing_class=processor。
  • 确认推送到 Hub 的模型仓库里是否缺少 tokenizer_config.json、vocab.json、added_tokens.json 等 tokenizer 文件。
  • 确认显卡/分布式设置:Issue 中脚本未使用 GPU、未使用分布式,此项非本问题直接因素。

解决步骤

  1. 打开 run_speech_recognition_ctc.py,定位 Trainer(...) 初始化处。
  2. 把 tokenizer=processor.feature_extractor 改为 tokenizer=processor。Issue 中有用户确认该改法可行。
  3. 另一种思路(评论中提出,作为保存环节的补充):在脚本末尾先显式保存 tokenizer,再创建 model card 并按需推送:
    tokenizer.save_pretrained(training_args.output_dir)
    trainer.create_model_card(**kwargs)
    if training_args.push_to_hub:
        trainer.push_to_hub(**kwargs)

    其中 tokenizer 需指向真正的 tokenizer 对象,而非 feature extractor。

  4. 使用更新后的脚本重新训练并推送,或在已有模型目录中补上 tokenizer 文件后重新推送。
  5. 对于较新版本的 transformers:Trainer 已改为通过 processing_class 接收完整 processor(修复见 #23243),脚本会传入完整 processor,tokenizer 文件会随模型一起保存和推送。可优先升级到包含该修复的版本。

验证方法

训练结束后检查输出目录或 Hub 仓库,确认存在 tokenizer 相关文件(如 tokenizer_config.json、vocab.json)。再用 pipeline("automatic-speech-recognition", model="你的模型") 加载并推理,若不再出现 tokenizer 设置缺失、能正常完成转写,即说明问题已解决。也可直接查看 Hub 模型页面的 Files 标签页确认 tokenizer 文件已被推送。

参考来源

huggingface/transformers #23222

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 25416

发表回复

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