我试着用一个神经网络库Keras用带cpu多处理的theano。在
我使用device=gpu
标志并加载keras模型。然后为了提取超过一百万个图像的特征,im使用多处理池。在
函数如下所示:
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中并行执行相同的操作?在
如果其他进程不使用keras,则可以使用多个进程,据我所知,您需要将keras的使用限制在一个进程内。这似乎包括所有的keras类和方法,甚至那些似乎不使用gpu的类和方法,例如ImageDataGenerator。在
如果工作负载受GPU限制,也可以使用线程库,该库创建线程而不是进程,例如,在GPU处理前一批时加载数据,则该限制不适用。由于全局解释器锁定,这不是CPU有限环境中的解决方案。在
你的情况看起来很相似[读,在GPU上工作,写]。这可以被改造成一个流水线,例如一些进程的读取,执行GPU工作的主进程和一些进程的写入。在
相关问题 更多 >
编程相关推荐