使用THAN的多处理

2024-10-01 13:43:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着用一个神经网络库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中并行执行相同的操作?在


Tags: 内存modelgpudevicelayers神经网络theanocpu
1条回答
网友
1楼 · 发布于 2024-10-01 13:43:30

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

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

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

  1. 为输入/输出创建队列对象(线程。队列或者多处理队列)在
  2. 创建从磁盘读取数据并将其馈送到输入队列的后台工作线程/进程
  3. 创建将数据从输出队列写入磁盘的后台工作线程/进程
  4. 主循环从输入队列获取数据,创建批处理,处理gpu上的数据并填充输出队列

相关问题 更多 >