我正在尝试将 theano 与 cpu 多处理和神经网络库 Keras 结合使用。
I use 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 的类和方法,例如图像数据生成器。
如果工作负载受 GPU 限制,还可以使用线程库,它创建线程而不是进程,例如如果在 GPU 处理前一批数据时加载数据,则该限制不适用。由于全局解释器锁,这不是 CPU 有限环境中的解决方案。
您的情况看起来像是并行的[读取,在 GPU 上工作,写入]。这可以改造成管道,例如一些进程读取,主进程执行 GPU 工作,一些进程写入。
- 为输入/输出创建队列对象(threading.Queue 或 multiprocessing.Queue)
- 创建后台工作线程/进程,从磁盘读取数据并将其提供给输入队列
- 创建后台工作线程/进程,将数据从输出队列写入磁盘
- 主循环从输入队列获取数据,创建批次,在 GPU 上处理数据并填充输出队列
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)