无法从多个线程运行Tensorflow模型

时间:2019-04-11 16:30:58

标签: python tensorflow multiprocessing jupyter-notebook

我正在一个项目中,需要同时加载和运行不同的神经网络。

我用来测试代码的模型取自DeepLab Demo,我基本上将其代码封装在一个类(称为DeepLabModel)中,并针对他们提出的每个不同模型实例化一次。

到目前为止,我编写了一个代码版本,其中从同一过程按顺序加载(并使用)模型,并且一切正常

由于我对结果进行了一些处理,并且需要模拟分布式环境,因此需要并行化包含模型的每个类。

我的第一个版本是类Agent,该类具有以前加载的DeepLabModel实例作为参数。每个代理都有一个“预测”功能,该功能在不同的Process中执行,但是我注意到代理挂在session.run()函数(在DeepLabModel.run()函数内部)上,没有任何输出。

由于找不到原因,因此尝试重写代码,使得每个Agent仅获得每个模型的文件名,并编写了一个函数run_agent(),在其中加载模型,等待队列中的输入图像,然后在收到的输入上运行模型。

这是上一个版本的一些代码(仅相关部分,DeepLabModel只是上面提供的链接中代码的包装):

import DeepLabModel

class Master():
    def __init__(self, agents, timeout=10):
        self.agents = agents # Reference to agents
        # Message queues to communicate with the agents
        self.output_queues = [Queue() for a in agents]
        self.input_queues =  [Queue() for a in agents]
        # Processes simulating remote agents    
        self.agentpool = [Process(target=a.run_agent, 
                                  args=(self.output_queues[a_id], self.input_queues[a_id])) for a_id, a in enumerate(self.agents)]
        for a in self.agentpool:
            a.start()
        print("Agents spawned")



class Agent():
    def __init__(self, agentname, model_name):
        self.agentname=agentname
        self.model_name = model_name
        self.model = None

    def load_model(self):
        # .... basically the same code contained in DeepLab notebook
        # ...here i use self.model_name and download the model...
        self.model = DeepLabModel.DeepLabModel(download_path)


    def run_agent(self, inqueue, outqueue):
        self.inqueue = inqueue
        self.outqueue = outqueue
        self.load_model()
        # The first element we expect is the task
        image = self.inqueue.get()
        result = self.model.run(image) # Here the program hangs/crashes
        # Asnwer back
        self.outqueue.put(result)
        # ...

问题在于,当进程尝试执行tf.run()时,每个进程都会失败并显示以下错误: tensorflow.python.framework.errors_impl.UnknownError: Failed to get convolution algorithm. This is probably because cuDNN failed to initialize, so try looking to see if a warning log message was printed above.

但是没有其他警告打印出来。我尝试在gpu和cpu上都运行它。我正在运行docker映像(nvidia-docker)TF 1.12,如果我不尝试从不同进程运行tensorflow,一切都将正常工作。

我还徘徊了为什么先加载模型然后将其传递给流程(每个流程一个)会导致代码挂起。

谢谢。

0 个答案:

没有答案