欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Keras多线程机制与flask多线程冲突的解决方案

程序员文章站 2022-06-16 10:34:33
在使用flask部署keras,tensorflow等框架时候,经常出现failedpreconditionerror: attempting to use uninitialized value b...

在使用flask部署keras,tensorflow等框架时候,经常出现

failedpreconditionerror: attempting to use uninitialized value batchnormalization_

或者

tensor tensor("crf_1/cond/merge:0", shape=(?, ?, 260), dtype=float32) is not an element of this graph.

使用keras.backend.clear_session()可能会导致前后两处预测结果不一样,因为图发生了变化。以下是解决方案。

graph = tf.get_default_graph()
sess = tf.session(graph=graph) 
 
def modelpredict(content):
    #keras.backend.clear_session()
    global graph
    global sess
    with sess.as_default():
        with graph.as_default():
            keras.model.predict()

补充:flask与keras结合的几个常见错误

1、 valueerror: tensor tensor(“dense_1/sigmoid:0”, shape=(?, 1), dtype=float32) is not an element of this graph.

在flask中使用tensorflow的model,一在界面中调用 model.predict() 就报下面这个错误,不过在单独的 .py 文件中使用却不报错。

valueerror: tensor tensor("dense_1/sigmoid:0", shape=(?, 1), dtype=float32) is not an element of this graph.

添加如下代码可以解决:

import tensorflow as tf
graph = tf.get_default_graph()
model = models.load_model(…………)

# 使用处添加:
global graph
global model
with graph.as_default():
    model.predict()
    # 执行预测函数

但是我当时测试时又报了另一个bug,但是这个bug也不好解决,试了很多方法也没解决,当然最终还是可以解决的,具体解决方式参考第三点。

tensorflow.python.framework.errors_impl.failedpreconditionerror: error while reading resource variable dense_1/bias from container: localhost. this could mean that the variable was uninitialized. not found: resource localhost/dense_1/bias/class tensorflow::var does not exist.
[[{{node dense_1/biasadd/readvariableop}}]]

后来经过n遍测试后找到了以下两种解决方式,仅供参考:

方法一:

在调用前加载model和graph,但是这样会导致程序每次调用都需要重新加载model,然后运行速度就会很慢,不过这种修改方式是最简单的。

graph = tf.get_default_graph()
    model = models.load_model('./static/my_model2.h5')
    with graph.as_default():
        result = model.predict(tokens_pad)

方法二:

在创建model后,先使用一遍 model.predict(),参数的大小和真实大小一致,这个是真正解决之道,同时不影响使用速率。

# 使用前:
model = models.load_model('./static/my_model2.h5')
# a 矩阵大小和 tokens_pad 一致
a = np.ones((1, 220))
model.predict(a)

# 使用时:
global model
result = model.predict(tokens_pad)

但是在使用后又遇到了 the session graph is empty…… 的错误即第二点,不过估摸着这个是个例,应该是程序问题。

2、runtimeerror: the session graph is empty. add operations to the graph before calling run().

graph = tf.get_default_graph()
    with graph.as_default():
        # 相关代码
        # 本次测试中是需要把调用包含model.predict()方法的方法的代码放到这里

3、tensorflow.python.framework.errors_impl.failedpreconditionerror: error while reading resource variable dense_1/bias from container: localhost. this could mean that the variable was uninitialized. not found: resource localhost/dense_1/bias/class tensorflow::var does not exist.[[{{node dense_1/biasadd/readvariableop}}]]

这个错误呢,也是tensorflow和flask结合使用时的常见错误,解决方式如下:

from tensorflow.python.keras.backend import set_session
# 程序开始时声明
sess = tf.session()
graph = tf.get_default_graph()

# 在model加载前添加set_session
set_session(sess)
model = models.load_model(…………)

# 每次使用有关tensorflow的请求时
# in each request (i.e. in each thread):
global sess
global graph
with graph.as_default():
    set_session(sess)
    model.predict(...)
————————————————

4、 can't find libdevice directory ${cuda_dir}/nvvm/libdevice. this may result in compilation or runtime failures, if the program we try to run uses routines from libdevice

设置一下xla_flags指向你的cuda安装目录即可

os.environ["xla_flags"]="--xla_gpu_cuda_data_dir=/usr/local/cuda-10.0"

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。