나는 tensorflow 1.3.0 백엔드가있는 keras 2.0.8을 사용하고 있습니다.Keras Tensorflow - 여러 스레드에서 예측하는 동안 예외가 발생했습니다
모델을 init 클래스에로드하고이를 사용하여 다중 스레드를 예측합니다.
import tensorflow as tf
from keras import backend as K
from keras.models import load_model
class CNN:
def __init__(self, model_path):
self.cnn_model = load_model(model_path)
self.session = K.get_session()
self.graph = tf.get_default_graph()
def query_cnn(self, data):
X = self.preproccesing(data)
with self.session.as_default():
with self.graph.as_default():
return self.cnn_model.predict(X)
나는 한 번 CNN을 초기화하고 query_cnn 방법은 여러 스레드에서 발생합니다.
난 내 로그에 수는 예외입니다 :
File "/home/*/Similarity/CNN.py", line 43, in query_cnn
return self.cnn_model.predict(X)
File "/usr/local/lib/python3.5/dist-packages/keras/models.py", line 913, in predict
return self.model.predict(x, batch_size=batch_size, verbose=verbose)
File "/usr/local/lib/python3.5/dist-packages/keras/engine/training.py", line 1713, in predict
verbose=verbose, steps=steps)
File "/usr/local/lib/python3.5/dist-packages/keras/engine/training.py", line 1269, in _predict_loop
batch_outs = f(ins_batch)
File "/usr/local/lib/python3.5/dist-packages/keras/backend/tensorflow_backend.py", line 2273, in __call__
**self.session_kwargs)
File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/client/session.py", line 895, in run
run_metadata_ptr)
File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/client/session.py", line 1124, in _run
feed_dict_tensor, options, run_metadata)
File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/client/session.py", line 1321, in _do_run
options, run_metadata)
File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/client/session.py", line 1340, in _do_call
raise type(e)(node_def, op, message)
tensorflow.python.framework.errors_impl.NotFoundError: PruneForTargets: Some target nodes not found: group_deps
코드는 대부분의 시간을 잘 작동, 멀티 스레딩과의 아마 문제는.
어떻게 해결할 수 있습니까?
그래프 변수를 저장 한 후 마무리해야합니까? –
문제는 그래프 생성이 스레드로부터 안전하지 않다는 것입니다 (https://www.tensorflow.org/versions/r0.12/api_docs/python/framework/core_graph_data_structures). 그래서 그래프 생성을 다음과 같이 완료해야합니다. 하나의 스레드로 시작한 다음 다른 스레드를 시작하십시오. 'finalize()'는 그래프를 읽기 전용으로 만듭니다. –
당신에게 효과가 있습니까? –