【问题标题】:How to use TensorFlow with Flask如何在 Flask 中使用 TensorFlow
【发布时间】:2018-08-18 18:36:46
【问题描述】:

我正在使用 flask、tensorflow 和 keras 模型构建一个多线程的 rest api。在收到this 错误后,我做了一些研究并提出了以下解决方案:

executor = ThreadPoolExecutor(10)

@app.route('/createLearningTask', methods=['POST'])
def createLearningTask():
    request_data = request.get_json(force=True)
    executor.submit(LearningTask().processData)
    return ('', 200) 

基本上,我将每个新的帖子请求提交给执行者。在每个请求中,我使用给定的参数构建模型,生成模型,预测并存储另一个 GET 请求的结果。

class LearningTask:

    resultDict = {} # access to this map is protected by locks, which I omitted in here

    def processData(self, **kwargs):
        graph = tf.Graph() # tf = tensorflow
        with graph.as_default():
            with tf.Session().as_default():
                model = Sequential() # keras model
                model.add(..)
                model.add(..)
                model.add(..)
                model.compile(..)
                model.fit(..)
                model.predict(..)

我省略了代码中不相关的部分。它工作得很好,在处理数据并获得结果后,我将它保存到字典中。我为每个发布请求创建新图表和新会话。

在阅读了thisthis github 的讨论后,我提出了我的解决方案。

我的问题是,该解决方案是否安全且正确地使用 tensorflow?在documentation 中,它说图形不是线程安全的,但我做了一些负载测试,它可以毫无问题地处理同时请求。

【问题讨论】:

  • 您在问两个不同的问题。我认为。一是关于Web并发架构。为什么在使用 Keras 时需要tf.Graph()? Keras 不是thread-safe 吗?如果您担心在 TF 中排队,请考虑使用线程安全队列,例如 PriorityQueue。

标签: python tensorflow flask keras deep-learning


【解决方案1】:

一般来说(不管是 tensorflow)这是不好的做法。如果在 .process() stmt 完成之前执行了超过 10 个请求,会发生什么?当10个executor都被占用时

如果工人突然死亡会发生什么?任务丢失

更好的模型是持久化任务队列,每个请求都会被添加到队列中,并在工作进程可用时执行

Celery 可能会为您解决问题

【讨论】:

  • 我正在 Windows 机器上开发并尝试了 Celery。不幸的是,它不适用于 Windows,但我将来肯定会在 linux 环境中使用它。我主要关心的是,这种用法是否会导致 tensorflow 会话出现问题?例如,在这种用法中是否会导致两个不同会话和线程之间的数据丢失或数据干扰?(假设低负载并且没有worker突然死亡)
  • 我不了解 TF,但我可以建议一些可以让您的生活轻松的事情。您可以使用 docker 在 windows 机器上运行 linux python 容器。如果性能是一个问题,您可以阅读有关 python GIL 的信息 - 这可能会让您转向单线程模型,这可以确保没有数据/锁定/丢失/会话问题
猜你喜欢
  • 2014-09-09
  • 1970-01-01
  • 1970-01-01
  • 2013-01-15
  • 2021-09-29
  • 2021-08-10
  • 2014-05-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多