GAE/标准/秒/Python 上的 Spacy 超过了最大实例的内存

gae*_*fan 2 google-app-engine google-app-engine-python spacy

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

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

超过 1228 MB 的硬内存限制,总共为 0 个请求提供服务后为 1280 MB。考虑在 app.yaml 中设置更大的实例类。

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

我的 Spacy 模型是一个标记器和解析器,在磁盘上占用 27 MB。我不明白为什么应用引擎上的内存要求会比我的 Mac 大得多。

看起来其他人已经能够在应用引擎上运行 Spacy。知道我可能做错了什么吗?

gae*_*fan 5

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

当您部署第二代 GAE 应用程序时,会部署一堆工作线程(在我的情况下为 8 个)。我不了解工作线程的细节,但我怀疑有几个工作线程导入了模块,并且所有工作线程都对内存使用有贡献。

我更改了代码,以便模型在第一次使用时加载,而不是在模块导入时加载。进行此更改后,内存使用量为 428MB。

以下是不该做什么的示例:

import spacy

nlp = spacy.load('my_model')

def process_text(text):
    return nlp(text)
Run Code Online (Sandbox Code Playgroud)

而是这样做:

import spacy

nlp = None

def process_text(text):
    global nlp
    if nlp is None:
        nlp = spacy.load('my_model')
    return nlp(text)
Run Code Online (Sandbox Code Playgroud)