PyInstaller打包transformers项目报错TypeError: unhashable type: 'AddedToken'求助
问题复现
直接运行test.py正常,但通过PyInstaller打包为exe后运行出现以下错误:
None of PyTorch, TensorFlow >= 2.0, or Flax have been found. Models won't be available and only tokenizers, configuration and file/data utilities can be used.
Traceback (most recent call last):
File "test.py", line 25, in
File "transformers\tokenization_utils_base.py", line 2024, in from_pretrained
File "transformers\tokenization_utils_base.py", line 2256, in _from_pretrained
File "transformers\models\bert\tokenization_bert.py", line 217, in init
File "transformers\tokenization_utils.py", line 367, in init
File "transformers\tokenization_utils.py", line 507, in _add_tokens
File "transformers\tokenization_utils.py", line 512, in _update_trie
TypeError: unhashable type: 'AddedToken'
[3492] Failed to execute script 'test' due to unhandled exception!
解决方案
1. 给AddedToken类添加哈希方法
PyInstaller打包后,AddedToken实例因缺少__hash__方法导致不可哈希,在更新trie结构时抛出错误。在test.py开头添加以下补丁代码:
from transformers import AddedToken # 为AddedToken添加哈希方法,解决打包后的不可哈希问题 if not hasattr(AddedToken, '__hash__'): def added_token_hash(self): # 基于AddedToken的核心属性生成哈希值 return hash((self.content, self.single_word, self.lstrip, self.rstrip, self.normalized)) AddedToken.__hash__ = added_token_hash
2. 完善PyTorch的打包配置
错误提示未找到PyTorch,说明打包时未正确包含PyTorch依赖。修改test.spec的hiddenimports字段,添加PyTorch相关模块:
hiddenimports=['transformers', 'torch', 'torch._C', 'torch.nn.functional'],
如果使用GPU版本PyTorch,需确保CUDA相关动态链接库被自动收集(PyInstaller通常会处理,但如果仍有问题,可手动将CUDA的dll路径添加到binaries列表)。
3. 补充transformers的元数据与本地资源
- 在
test.spec的datas中添加transformers的元数据:datas += copy_metadata('transformers') - 若你的项目从本地加载tokenizer或模型文件,需将这些文件添加到
datas中,例如:datas = [('./data/sb.csv', 'data'), ('./path/to/your/model', 'path/to/your/model')]
4. 重新打包测试
保存修改后的文件,执行打包命令:
pyinstaller test.spec
运行生成的exe文件,验证问题是否解决。
内容的提问来源于stack exchange,提问作者chenhao

