我正在尝试使用神经网络库Keras的cpu多处理。
我使用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内存中创建线程,然后使用特定部分的特征提取,如f([im, 0])[0][0]
与GPU?
如果没有,是否有其他方法可以在python中并行执行相同的操作?
如果其他进程不使用keras,则可以使用多个进程,据我所知,您需要将keras的使用限制在单个进程中。这似乎包括所有的keras类和方法,甚至那些似乎不使用gpu,例如ImageDataGenerator。
如果工作负载是GPU限制的,也可以使用线程库,它创建线程而不是进程,例如,在GPU处理前一批时加载数据,那么限制不适用。由于全局解释器锁,这在CPU有限的环境中不是一个解决方案。
你的情况看起来像一个并行[读,在GPU上做工作,写]。这可以被改造成一个管道,例如,一些进程读取,执行GPU工作的主进程和一些进程写入。
- 为输入/输出(线程)创建队列对象。队列或多进程。Queue)
- 创建从磁盘读取数据并将其提供给输入队列的后台工作线程/进程
- 创建后台工作线程/进程,将数据从输出队列写入磁盘
- 主循环,从输入队列中获取数据,创建批量,在gpu上处理数据并填充输出队列