google-app-engine - GAE/standard/second/Python 上的 Spacy 超过了最大实例的内存
问题描述
我已经使用 GAE 一段时间了,没有任何问题。最近唯一的变化是我添加了 Spacy 以及我训练的模型。
当我使用 dev_appserver 在本地运行时,该应用程序消耗了大约 153 MB。部署后,出现内存超出错误。即使使用F4_1G
实例,我也超出了内存:
在服务 0 个请求后,超过了 1280 MB 的硬内存限制 1228 MB。考虑在 app.yaml 中设置一个更大的实例类。
如果我导入 Spacy 并且不加载我的模型(实例大约有 200MB),那么部署就可以工作,所以 Spacy 本身不是问题,但是当我用spacy.load()
内存加载我的模型时,就会超过限制。请注意,这发生在我什至使用我的 Spacy 模型之前,因此仅加载模型会导致问题。
我的 Spacy 模型是一个标记器和解析器,占用 27 MB 磁盘空间。我不明白为什么应用引擎上的内存需求会比我的 Mac 上的大得多。
看起来其他人已经能够在 app engine 上运行 Spacy。知道我做错了什么吗?
解决方案
我能够找到解决方案。我正在将模型加载到模块级变量中,因此在导入模块时,将加载模型。
当您部署第二代 GAE 应用程序时,会部署一堆工作线程(在我的例子中是 8 个)。我不了解工作线程的详细信息,但我怀疑有几个工作线程导入了模块,并且所有工作线程都有助于内存使用。
我更改了代码,以便模型在首次使用时加载,而不是在模块导入时加载。通过此更改,内存使用量为 428MB。
下面是一个不该做什么的例子:
import spacy
nlp = spacy.load('my_model')
def process_text(text):
return nlp(text)
而是这样做:
import spacy
nlp = None
def process_text(text):
global nlp
if nlp is None:
nlp = spacy.load('my_model')
return nlp(text)
推荐阅读
- alert - Nagios - 如何设置警报频率?
- r - 在现有函数对象的正文中添加一行
- java - 为什么我们必须在 while-true 循环中填充缓冲区?
- django - (djstripe.C001) 找不到 Stripe API 密钥。提示:将 STRIPE_TEST_SECRET_KEY 和 STRIPE_LIVE_SECRET_KEY 添加到您的设置中
- amazon-web-services - 如何在 StepFunction 状态机执行事件历史记录中获取胶水作业的资源链接?
- intellij-idea - IntelliJ CodeStyle Java - 换行 if 语句
- arrays - 修改工作公式以忽略空白单元格和指定字符(“-”)
- reactjs - React JS 在 IIS 上托管后无法正常工作
- django - 我如何使 django 模型字段唯一但仅适用于个人用户?
- excel - 基于小数值的四舍五入excel