2016-07-04 39 views
3

我想用cano-multiprocessing与神经网络库Keras使用theano。使用multianocessing与theano

我使用device=gpu标志并加载keras模型。然后,为了提取超过一百万图像的功能,即时通讯使用多处理池。

功能看起来是这样的:

from keras import backend as K 

f = K.function([model.layers[0].input, K.learning_phase()], [model.layers[-3].output,]) 

def feature_gen(flz): 
    im = imread(flz) 
    cPickle.dump(f([im, 0])[0][0], open(flz, 'wb'), -1) 

pool = mp.Pool(processes=10) 
results = [pool.apply_async(feature_gen, args=(f,)) for f in filelist]] 

然而,这开始创建的GPU内存池和我的代码失败,内存错误。是否有可能强制多处理在CPU内存中创建线程,然后使用特定部分进行特征提取,例如带GPU的f([im, 0])[0][0]

如果没有,是否有替代方案在python中并行执行相同的操作?

回答

0

如果其他进程不使用keras,则可以使用多个进程,据我所知,您需要将keras的使用限制为单个进程。这似乎包括所有的keras类和方法,甚至那些似乎不使用gpu的类,例如ImageDataGenerator。

如果工作负载受GPU限制,也可以使用线程库,该线程库创建线程而不是进程,例如,在GPU处理前一批时加载数据,则限制不适用。由于全局解释器锁定,这不是CPU限制环境中的解决方案。

你的情况看起来像一个平行的[阅读,在GPU上工作,写]。这可以改造成流水线,例如,一些进程读取,执行GPU工作的主要进程和一些进程写入。

  1. 创建队列对象进行输入/输出(threading.Queue或multiprocessing.Queue)
  2. 创建从磁盘读取的数据的背景工作线程/进程和其馈送到输入队列
  3. 创建背景工作线程从输出队列将数据写入磁盘/过程
  4. 主环路,它从输入队列中取出数据,创建批次,处理GPU上的数据,并填充输出队列