【问题标题】:Spacy on GAE/standard/second/Python exceeds memory of largest instanceGAE/standard/second/Python 上的 Spacy 超过了最大实例的内存
【发布时间】:2019-03-18 19:09:18
【问题描述】:

我已经使用 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 上大得多。

看起来其他人已经能够run Spacy on app engine。知道我做错了什么吗?

【问题讨论】:

  • 如果这是在使用您的模型之前发生的,它是什么时候发生的?当你加载模型?何时导入 Spacy?
  • @DustinIngram,好问题。我更新了我的问题以说明导入 spacy 很好,但是加载模型会导致大量内存使用。

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


【解决方案1】:

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

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

【讨论】:

  • 不错的收获!很高兴知道。
  • 您介意在您的答案中添加一些伪代码来展示未来访问者的变化吗?
  • 对于任何来到这里遇到同样问题的人,请注意,为了修改函数内的全局变量,请在if nlp is None上方添加global nlp
猜你喜欢
  • 2020-09-03
  • 2012-08-30
  • 1970-01-01
  • 1970-01-01
  • 2020-12-03
  • 2021-12-10
  • 2013-02-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多