首页 > 解决方案 > 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。知道我做错了什么吗?

标签: google-app-enginespacygoogle-app-engine-python

解决方案


我能够找到解决方案。我正在将模型加载到模块级变量中,因此在导入模块时,将加载模型。

当您部署第二代 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)

推荐阅读