You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 09:52:41