GAE/standard/second/Python 上的 Spacy 超出了最大实例的内存

Spacy on GAE/standard/second/Python exceeds memory of largest instance

我已经使用 GAE 一段时间了,没有任何问题。唯一的变化是我添加了 Spacy 以及我训练的模型。

当我 运行 在本地使用 dev_appserver 时,应用程序消耗了大约 153 MB。部署后,我收到内存超出错误。即使使用 F4_1G 实例,我也超出了内存:

Exceeded hard memory limit of 1228 MB with 1280 MB after servicing 0 requests total. Consider setting a larger instance class in app.yaml.

如果我导入 Spacy 并且不加载我的模型(实例有大约 200MB),部署工作正常,所以 Spacy 本身不是问题,但是当我用 spacy.load() 加载我的模型时,内存然后超过限制。请注意,这发生在我什至使用我的 Spacy 模型之前,所以仅仅加载模型就会导致问题。

我的 Spacy 模型是一个标记器和解析器,占用了 27 MB 的磁盘空间。我不明白为什么 App Engine 的内存需求会比我的 Mac.

大得多

看起来其他人已经能够 。知道我可能做错了什么吗?

我找到了解决办法。我正在将模型加载到模块级变量中,因此在导入模块时会加载模型。

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