代码之家  ›  专栏  ›  技术社区  ›  sarah

如何使用TensorFlow和烧瓶

  •  0
  • sarah  · 技术社区  · 8 年前

    我正在使用flask、tensorflow和keras模型构建一个多线程restapi。得到之后 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(..)
    

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

    读后 this 和 this 在讨论中,我提出了我的解决方案。

    我的问题是,这个解决方案是安全的和正确的使用张量流?在 documentation ,它说graph不是线程安全的,但是我做了一些负载测试,它可以毫无问题地处理并发请求。

    1 回复  |  直到 8 年前
        1
  •  0
  •   gCoh    8 年前

    一般来说(不管是张量流),这是不好的做法。如果在.process()stmt完成之前执行了10个以上的请求,会发生什么?当所有10个执行人都被占用时

    如果工人突然死亡怎么办?任务丢失

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

    芹菜可能对你有用

    推荐文章