【问题标题】:using multiprocessing with theano在 theano 中使用多处理
【发布时间】:2016-07-04 04:08:58
【问题描述】:

我正在尝试将 theano 与带有神经网络库 Keras 的 cpu-multiprocessing 一起使用。

我使用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 中并行执行相同的操作?

【问题讨论】:

    标签: python multithreading multiprocessing theano keras


    【解决方案1】:

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

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

    您的情况看起来像一个并行的[读取,在 GPU 上工作,写入]。这可以改造成管道,例如一些进程读取,主进程执行 GPU 工作,一些进程写入。

    1. 为输入/输出创建队列对象(threading.Queue 或 multiprocessing.Queue)
    2. 创建后台工作线程/进程,从磁盘读取数据并将其提供给输入队列
    3. 创建后台工作线程/进程,将数据从输出队列写入磁盘
    4. 主循环从输入队列中获取数据、创建批次、处理 gpu 上的数据并填充输出队列

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-12
      • 1970-01-01
      相关资源
      最近更新 更多