PyInstaller打包后运行报错:无法导入GenerationMixin,求解决方案
解决PyInstaller打包mT5摘要程序的ImportError问题
问题根源
这个错误要么是transformers版本更新后,GenerationMixin的导入路径发生了变化,要么是PyInstaller打包时没把相关模块完整收集,还有可能是模型加载方式存在兼容性问题。
具体解决办法
1. 修正导入路径(针对版本变动)
先确认你使用的transformers版本:
- 新版本的transformers中,
GenerationMixin已经迁移到transformers.generation.utils路径下。如果代码里直接写了from transformers.generation import GenerationMixin,改成:from transformers.generation.utils import GenerationMixin - 要是你通过模型类间接用到这个类,确认mT5模型是否用官方指定的
MT5ForConditionalGeneration类加载,这个类的兼容性更强。
2. 让PyInstaller完整打包transformers模块
PyInstaller经常无法自动识别transformers的动态导入模块,需要手动指定:
- 在打包命令中添加
--hidden-import参数,明确补充缺失的模块:pyinstaller --hidden-import=transformers.generation.utils --hidden-import=transformers.models.mt5 --hidden-import=transformers.models.mt5.modeling_mt5 --hidden-import=transformers.models.mt5.tokenization_mt5 你的脚本名.py - 或者创建一个
hook-transformers.py文件,内容如下:
然后打包时指定这个hook文件所在的目录:from PyInstaller.utils.hooks import collect_submodules hiddenimports = collect_submodules('transformers')pyinstaller --additional-hooks-dir=. 你的脚本名.py
3. 更换更兼容的模型加载方式
用torch.load直接加载t5_summary.pt容易出现版本兼容问题,建议改用transformers官方的保存和加载方法:
- 微调完成后,用
save_pretrained保存模型和分词器:model.save_pretrained("./fine_tuned_mt5") tokenizer.save_pretrained("./fine_tuned_mt5") - 加载时用
from_pretrained方法:
这种方式能适配不同版本的transformers,还能避免模型格式不兼容的问题。from transformers import MT5ForConditionalGeneration, MT5Tokenizer tokenizer = MT5Tokenizer.from_pretrained("./fine_tuned_mt5") model = MT5ForConditionalGeneration.from_pretrained("./fine_tuned_mt5")
4. 锁定transformers版本
如果是版本不匹配导致的问题,把transformers版本固定为你微调模型时使用的版本,比如:
pip install transformers==4.30.2 # 替换成你训练时的具体版本号
然后重新打包,确保打包环境和训练环境的依赖版本完全一致。
内容的提问来源于stack exchange,提问作者Emir-Liu
相关产品推荐
相关产品推荐

