我使用GAE已有一段时间了,没有任何问题。只是最近的更改是我添加了Spacy以及我训练的模型。
当我使用dev_appserver在本地运行时,该应用程序消耗约153 MB。部署后,出现内存超出错误。即使使用F4_1G
实例,我也超出了内存:
为总计0个请求提供服务后,超出了1228 MB的硬盘限制,而1280 MB。考虑在app.yaml中设置更大的实例类。
如果我导入Spacy并且不加载我的模型(实例大约有200MB),则部署有效,因此Spacy本身不是问题,但是当我用spacy.load()
加载我的模型时,内存超过了限制。请注意,这是在我甚至使用Spacy模型之前发生的,因此仅加载模型会导致问题。
我的Spacy模型是一个标记器和解析器,占用磁盘27 MB。我不明白为什么应用程序引擎上的内存需求会比Mac上大得多。
看起来像其他人一样能够run Spacy on app engine。知道我做错了什么吗?
答案 0 :(得分:4)
我能够找到解决方案。我将模型加载到模块级变量中,因此在导入模块时,将加载模型。
当您部署第二代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):
if nlp is None:
nlp = spacy.load('my_model')
return nlp(text)