在 Flask 应用程序中使用 uwsgi 部署时,keras 预测会卡住

keras prediction gets stuck when deployed using uwsgi in a flask app

我有一个 keras 模型,它在单元测试和本地 flask 应用程序 (flask 运行) 中完美运行。然而,当我在 uwsgi 中启动 flask 应用程序时,它从第二个请求开始就卡住了,杀死了整个应用程序。这是因为 uwsgi 产生了多个进程吗?我该如何解决这个问题?谢谢。

我遇到了同样的问题,这可能不是理想的解决方法。 但我相信这是多个进程中的 Keras 问题 运行。

我是 运行 uWSGI,lazy-apps = true。

uwsgi --http 0.0.0.0:5000 --wsgi-file your_flask_server.py --callable app --processes 2 --threads 2 --stats 127.0.0.1:9191 --lazy-apps

注意:通过延迟加载应用程序,这将消耗更多的内存,例如内存的两倍,因为它会在每个 thread/process

中再次加载整个应用程序

这里有一些完整的使用链接: Similar Issue, Similar Issue

Example deployment guide

我有一个类似的问题:在 docker 环境中的烧瓶应用程序中,我们会发现神经网络会在第一次预测后挂起预测。为了解决这个问题,我创建了一个神经网络 class,它有

def __init__(self):
    self.session = tf.Session()
    self.graph = tf.get_default_graph()
    self.model = self.__load_model()
    with self.graph.as_default():
        with self.session.as_default():
            logging.info("neural network initialised")

最后 3 行似乎正确地初始化了图形和会话,但由于某种原因没有在正确的位置发生。我的预测功能很简单:

def predict(self, x):
    with self.graph.as_default():
        with self.session.as_default():
            y = self.model.predict(x)
    return y

这似乎已经停止了挂起(我不知道为什么我需要一个会话和一个图表,但我在调试时添加了这两个,现在我不敢删除任何一个)

在 multiprocessing.lock

的帮助下,我能够让我的模型进行预测
from multiprocessing import Lock

class LockedPredictor:
    def __init__(self):
        self.mutex = Lock()
        self.model = load_model()

    def predict(self, input):
        with self.mutex: 
          return self.model.predict(input)

灵感来自这里:https://dref360.github.io/keras-web/。 但是,当我有两个竞争模型时,解决方案失败了。我尝试应用此处描述的管理器解决方案但失败了。

一个合适的解决方案是基于建议的 redis 队列here, which is recommended on the Keras website