在烧瓶应用中使用uwsgi部署时,keras预测会陷入困境

时间:2018-08-08 02:59:15

标签: python tensorflow flask keras uwsgi

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

3 个答案:

答案 0 :(得分:2)

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

我正在使用uzy-apps = true运行uWSGI。

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

注意:通过延迟加载应用程序,这将消耗更多的内存,例如将内存增加一倍,因为它会在每个线程/进程中再次加载整个应用程序

以下是一些使用完整链接: Similar IssueSimilar Issue

Example deployment guide

答案 1 :(得分:2)

在 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/。 然而,当我有两个竞争模型时,解决方案失败了。我尝试应用此处描述的 Manager 解决方案,但失败了。

适当的解决方案是基于建议的 redis 队列 here,这是在 Keras website 上推荐的。

答案 2 :(得分:1)

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

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

这似乎已经停止了挂起(我不知道为什么我需要一个会话和一个图形,但是我在调​​试它的同时添加了两者,现在我害怕删除其中一个)