如何在离线环境下从磁盘加载使用spacy-transformers模型
你当前的报错是两个问题叠加导致的:1. 代码中路径拼写错误;2. 导出的transformer组件目录缺少Hugging Face模型的完整文件,加载时transformers库尝试联网拉取缺失文件失败。以下是可落地的解决方法:
方案1:直接离线安装en_core_web_trf包(推荐,复杂度最低)
这是最不容易出问题的适配方案,操作步骤:
- 在有网络的环境下,下载和你spacy版本匹配的en_core_web_trf安装包,spacy 3.0.5对应版本为en_core_web_trf==3.0.0,直接下载对应的whl安装包即可
- 将安装包拷贝到离线企业环境,使用
pip install 安装包文件名.whl完成安装 - 安装完成后直接调用
spacy.load("en_core_web_trf")即可正常使用,全程不需要联网。
方案2:修复手动导出/加载流程
如果必须单独拆分transformer组件使用,你需要做以下调整:
第一步:修正路径拼写错误
你示例代码中导出组件时写的路径是transfomer_pretrained(漏写了字母r),加载时写的是transformer_pretrained,路径不匹配会直接导致文件找不到,先修正该问题。
第二步:补充完整Hugging Face模型文件
en_core_web_trf底层使用的是roberta-base模型,你需要手动下载以下所有文件,放到你导出的transformer_pretrained目录下:
config.json:模型核心配置文件pytorch_model.bin:PyTorch格式的模型权重文件vocab.json:RoBERTa分词器词汇表merges.txt:BPE分词合并规则表tokenizer_config.json:分词器配置文件tokenizer.json(可选,Fast分词器依赖文件,建议补充)
第三步:调整加载代码
加载时不需要排除vocab,修正后的代码如下:
import spacy import spacy_transformers # 有网环境执行这段导出代码,将导出目录整体拷到离线环境 # nlp_trf = spacy.load("en_core_web_trf") # transformer = nlp_trf.get_pipe("transformer") # transformer.to_disk("transformer_pretrained") # 离线环境执行加载代码 nlp = spacy.blank("en") trf = nlp.add_pipe("transformer") trf.from_disk("transformer_pretrained")
方案3:直接用本地HF模型初始化组件
如果你已经单独下载好了roberta-base的所有本地文件,也可以跳过导出步骤直接初始化:
import spacy nlp = spacy.blank("en") # 括号内替换为你本地存放roberta-base所有文件的目录绝对路径 trf = nlp.add_pipe("transformer", config={"model": {"name": "/本地/roberta-base/目录路径"}}) # 用样本文档初始化模型,不需要联网 trf.model.initialize([nlp.make_doc("hello world")])
注意:你使用的transformers版本为4.5.1,下载模型文件时需要确认和该版本兼容,不要下载过新的版本的模型配置和权重,避免出现兼容性报错。
内容的提问来源于stack exchange,提问作者lifeoffelixt
相关产品推荐
相关产品推荐

