我有一个keras模型,可以在单元测试和本地烧瓶应用程序(烧瓶运行)中完美运行。但是,当我在uwsgi中启动flask应用程序时,它因第二个请求而卡住,从而杀死了整个应用程序。这是因为uwsgi产生了多个进程吗?我该如何解决这个问题?谢谢。
答案 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 Issue, Similar Issue
答案 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
这似乎已经停止了挂起(我不知道为什么我需要一个会话和一个图形,但是我在调试它的同时添加了两者,现在我害怕删除其中一个)