从pickle文件加载spaCy NER模型时出现校验和不兼容错误
问题
从pickle文件加载spaCy NER模型时触发错误,加载代码如下:
self.model = pickle.load(open(model_path, 'rb'))
完整报错堆栈:
Traceback (most recent call last): File "C:\Program Files\JetBrains\PyCharm Community Edition 2022.2.3\plugins\python-ce\helpers\pydev\pydevd.py", line 1496, in _exec pydev_imports.execfile(file, globals, locals) # execute the script File "C:\Program Files\JetBrains\PyCharm Community Edition 2022.2.3\plugins\python-ce\helpers\pydev\_pydev_imps\_pydev_execfile.py", line 18, in execfile exec(compile(contents+"\n", file, 'exec'), glob, loc) File "C:\Projects\pythonworkspace\invoice_processing_prototype\invoice_data_extractor_notebook.py", line 101, in <module> extractor = InvoiceDataExtractor(model_dir_path, input_file_paths[0], config_path) File "C:\Projects\pythonworkspace\invoice_processing_prototype\invoicedataextractor.py", line 27, in __init__ self.spatial_extractor = SpatialExtractor(model_dir_path, config_path) File "C:\Projects\pythonworkspace\invoice_processing_prototype\spatialextractor.py", line 54, in __init__ self.inv_date = Model(f"{self.model_dir_path}\\invoice_date_with_corrected_training_data_and_line_seperator_21_07_2022.pkl") File "C:\Projects\pythonworkspace\invoice_processing_prototype\spatialextractor.py", line 34, in __init__ self.model = pickle.load(open(model_path, 'rb')) File "stringsource", line 6, in spacy.pipeline.trainable_pipe.__pyx_unpickle_TrainablePipe _pickle.PickleError: Incompatible checksums (0x417ddeb vs (0x61fbab5, 0x27e6ee8, 0xbe56bc9) = (cfg, model, name, scorer, vocab))
错误发生在执行self.model = pickle.load(open(model_path, 'rb'))时。训练NER模型使用的是spaCy 3.1.2版本,后续将spaCy升级至3.4版本,怀疑是版本不兼容导致问题,需确认:用spaCy 3.1.2训练的NER模型能否在3.4版本中加载?
环境信息:
- 操作系统:Windows 10
- Python版本:3.10
- 训练时spaCy版本:3.1.2
- 预测时spaCy版本:3.4
回答
不能直接加载。spaCy跨小版本(如3.1.x到3.4.x)用pickle序列化的模型,大概率会出现兼容性问题,你遇到的校验和不匹配错误就是典型的版本不兼容表现。
原因在于spaCy的内部实现会在小版本迭代中更新,比如模型结构、管道组件的序列化逻辑、校验机制等,pickle序列化会直接绑定当前版本的类结构和实现,版本升级后这些结构变化会导致反序列化失败。
解决办法:
- 用spaCy官方的模型保存/加载方式替代pickle:训练完成后用
nlp.to_disk()保存模型,加载时用spacy.load(),这种方式是spaCy推荐的,跨小版本兼容性更好。 - 降级spaCy版本:把预测环境的spaCy退回到3.1.2,和训练版本一致,就能正常加载pickle保存的模型。
- 重新训练模型:在spaCy 3.4环境下重新训练NER模型,确保训练和预测版本一致。
内容的提问来源于stack exchange,提问作者Devendra Soni
相关产品推荐
相关产品推荐

