Python使用Stanza包时遭遇pickle数据截断错误(_pickle.UnpicklingError)
Stanza加载模型时出现
_pickle.UnpicklingError: pickle data was truncated的解决办法 问题场景
在Python中使用Stanza处理文本数据,运行代码:
nlp = stanza.Pipeline(lang='en', processors='tokenize,mwt,pos,lemma', download_method=None)
触发错误:
_pickle.UnpicklingError: pickle data was truncated
完整错误栈:
File "/root/miniconda3/lib/python3.8/site-packages/stanza/pipeline/core.py", line 296, in __init__ self.processors[processor_name] = NAME_TO_PROCESSOR_CLASS[processor_name](config=curr_processor_config, File "/root/miniconda3/lib/python3.8/site-packages/stanza/pipeline/processor.py", line 193, in __init__ self._set_up_model(config, pipeline, device) File "/root/miniconda3/lib/python3.8/site-packages/stanza/pipeline/pos_processor.py", line 30, in _set_up_model self._trainer = Trainer(pretrain=self.pretrain, model_file=config['model_path'], device=device, args=args, foundation_cache=pipeline.foundation_cache) File "/root/miniconda3/lib/python3.8/site-packages/stanza/models/pos/trainer.py", line 32, in __init__ self.load(model_file, pretrain, args=args, foundation_cache=foundation_cache) File "/root/miniconda3/lib/python3.8/site-packages/stanza/models/pos/trainer.py", line 117, in load emb_matrix = pretrain.emb File "/root/miniconda3/lib/python3.8/site-packages/stanza/models/common/pretrain.py", line 50, in emb self.load() File "/root/miniconda3/lib/python3.8/site-packages/stanza/models/common/pretrain.py", line 56, in load data = torch.load(self.filename, lambda storage, loc: storage) File "/root/miniconda3/lib/python3.8/site-packages/torch/serialization.py", line 608, in load return _legacy_load(opened_file, map_location, pickle_module,** pickle_load_args) File "/root/miniconda3/lib/python3.8/site-packages/torch/serialization.py", line 787, in _legacy_load result = unpickler.load()
此前通过Hugging Face手动逐文件下载Stanza模型文件,解决文件缺失问题后遇到该错误,怀疑与Stanza调用PyTorch的pickle序列化有关,但不确定是否需要修改包内代码及位置。
问题核心原因
错误本质是手动下载的模型文件(尤其是预训练嵌入文件)不完整或损坏:
- pickle数据截断说明PyTorch加载模型时无法读取完整的序列化数据,大概率是下载过程中断、文件未完全下载,或者文件校验失败导致的损坏。
- 从错误栈可定位到问题出在加载预训练嵌入(
pretrain.emb)的步骤,对应Stanza的.pt格式预训练模型文件损坏。
解决办法
无需修改Stanza或PyTorch源码,按以下步骤处理:
1. 优先使用Stanza自动下载模型
移除download_method=None参数,让Stanza自带的下载工具自动获取对应语言和处理器的完整模型包,避免手动下载的文件缺失或损坏:
nlp = stanza.Pipeline(lang='en', processors='tokenize,mwt,pos,lemma')
2. 清理损坏的本地模型文件
删除已下载的损坏模型,路径通常为/root/.stanza/models/en/pos/(根据处理器类型调整),之后重新触发下载或放入完整的模型文件。
3. 手动下载时验证文件完整性
若必须手动下载,确保下载完整的模型压缩包(而非单个文件),解压后放入Stanza默认模型存储路径(通常是~/.stanza/models/),并对比本地文件大小与Hugging Face仓库中对应文件的大小,确认文件未截断。
4. 检查环境版本兼容性
确保Stanza与PyTorch版本兼容:Python3.8环境建议搭配Stanza 1.4.x或1.5.x版本(对应PyTorch 1.10~1.13版本),版本不兼容可能导致序列化/反序列化失败。
内容的提问来源于stack exchange,提问作者Ruoxi NING
相关产品推荐
相关产品推荐

