在Google Cloud Functions中加载spaCy模型失败,本地运行正常
问题概述
本地运行正常的spaCy实体识别代码,部署到Google Cloud Functions后出现以下错误:
OSError: [E050] Can't find model 'en_core_web_sm'. It doesn't seem to be a Python package or a valid path to a data directory.
核心原因是Google Cloud Functions的运行环境中,spaCy模型的安装路径或加载逻辑与本地环境存在差异。
Google Cloud Functions中spaCy模型的存储路径
当通过pip安装官方spaCy模型(如en_core_web_sm)时,模型会被部署到函数的虚拟环境site-packages目录下,具体路径格式为:
/env/lib/python<版本号>/site-packages/en_core_web_sm
例如,若函数使用Python 3.9,路径即为/env/lib/python3.9/site-packages/en_core_web_sm。spaCy默认会扫描该目录查找模型,但如果模型未正确安装,就会触发找不到路径的错误。
具体解决方法
方法1:通过requirements.txt安装模型包
这是最简便的标准方案,直接在函数项目的requirements.txt中添加spaCy和模型的依赖:
spacy>=3.0.0 en_core_web_sm==3.6.0
注意:模型版本需与spaCy版本兼容,可确认两者版本匹配关系后调整。
部署时,Google Cloud Functions会自动将模型安装到上述site-packages路径,代码中保持原有spacy.load("en_core_web_sm")即可正常加载。
方法2:手动指定模型绝对路径
如果方法1出现异常,可在代码中直接指定模型的绝对路径(需匹配函数使用的Python版本):
import spacy def entities(): # 替换为函数对应的Python版本路径 NER = spacy.load("/env/lib/python3.9/site-packages/en_core_web_sm") text='Looking for a Recruiting Data Analyst who can follow written instructions to correctly identify qualifying attributes from a candidates profile, load and properly code candidates in our recruiting database/CRM' text_entities= NER(text) entity_vector=[[word.text,word.label_] for word in text_entities.ents] print('Function finished') entities()
方法3:打包模型到部署包
若无法通过pip安装模型(如自定义模型),可将模型文件夹直接放入项目根目录,部署时随代码一同上传,代码中使用相对路径加载:
import spacy def entities(): # 模型文件夹位于项目根目录 NER = spacy.load("./en_core_web_sm") # 后续代码不变
替代方案:直接导入模型包
若尝试过直接导入en_core_web_sm,需确保requirements.txt已包含该包,然后改用以下加载方式:
import en_core_web_sm def entities(): NER = en_core_web_sm.load() # 后续代码不变
内容的提问来源于stack exchange,提问作者Ivan Cereghetti

