请教一下,能不能在单GPU上让多个神经网络实现并行推理?

现在已经训练好了不同的神经网络,包括用于物体检测的SSD以及用于语义分割FCN。正常情况下,如果是单进程的话,两个网络先后分别对图片进行推理,然后输出结果,这并没有什么问题。
可是现在我想这两个网络能不能通过多进程进行并行推理,然后两个网络的结果一起输出,因为并行推理的话,总耗时会比单进程耗时要短些。我首先尝试了把网络加载CPU上,通过Python的multiprocessing多进程模块,已经能够让两个网络进行并行推理了,总耗时也确实短了。但是,CPU的推理速度毕竟还是太慢,所以我又尝试网络加载到GPU上,再通过multiprocessing来并行,但是报错了,出现Check failed: e == cudaSuccess CUDA: initialization error这样的错误(当然了,两个网络加载到GPU,单进程进行推理是没问题的)。
后来,我仔细想了一下,multiprocessing应该针对的是CPU上的多进程,要想在GPU上并行可能没那么简单,也不知道可不可行,好像网上也找不到类似问题的解决思路。所以,在这里想请教一下大神们,在单GPU上开多进程让多个神经网络并行推理可行不,可行的话,代码上怎么实现。

以下是我用multiprocessing实现多进程的很简单的伪代码(代码不完整,主要是为了说明一下思路)。神经网络加载到CPU上可以运行,但是加载到GPU上运行就会报错。求大神指点。

import multiprocessing as mp

ssd = load_ssd()
fcn = load_fcn()
data = load_data()

def infer(net, data, queue):
    pred = net(data)
    queue.put(pred)

queue = mp.Queue()
p1 = Process(name='ssd', target=infer, args=(ssd, data, queue))
p2 = Process(name='fcn', target=infer, args=(fcn, data, queue))

p1.start()
p2.start()
p1.join()
p2.join()

pred_ssd = queue.get()
pred_fcn = queue.get()

话说是不是可以尝试将推理部分做成接口进行调用呢?例如使用Flask等将SSD和FCN做成接口的形式,然后再使用multiprocessing同事进行调用?

我试过用tornado,貌似不行。

你是在一个python脚本里面提供两个不同的接口还是运行两个脚本提供两个接口呢?后者也不行吗?

我就是写了两个简单的函数先后加载了两个模型,然后再用multiprocessing试着开多进程跑,然后发现不行。如果你有什么方法试验可行的话,就告知我一下呗

除了多进程并行之外,我想知道,将两个模型进一步封装,然后定义一个新网络,输入是x,输出是子网络ssd(x)和子网络fcn(x)的结果,是不是预测的时候,mxnet自动分析计算图,发现这两个子网络之间除了输入一样,别的地方没有数据依赖性,就自动并行了呢?

诶,这方法有可能可以。

试过CUDA MPS (Multi-Process Service)么

我没有试过呢。请问具体怎么实现呢,有demo么

题主您好~我现在遇到了和您一模一样的问题:在单GPU上实现多个神经网络的并行运算。请问您现在解决了吗?能不能分享一下呢~