我正在一个项目中,需要同时加载和运行不同的神经网络。
我用来测试代码的模型取自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,一切都将正常工作。
我还徘徊了为什么先加载模型然后将其传递给流程(每个流程一个)会导致代码挂起。
谢谢。