在 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
我有一个类似的问题:在 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。
我有一个 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
我有一个类似的问题:在 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。