【问题标题】:Python: multithreaded learning neural networks using PyBrain and MultiprocessingPython:使用 PyBrain 和 Multiprocessing 的多线程学习神经网络
【发布时间】:2016-10-08 23:19:57
【问题描述】:

我正在尝试使用 PyBrain 和 Python 的 multiprocessing 包在 Python 中训练神经网络。

这是我的代码(它训练一个简单的神经网络来学习 XOR 逻辑)。

import pybrain.tools.shortcuts as pybrain_tools
import pybrain.datasets
import pybrain.supervised.trainers.rprop as pybrain_rprop
import multiprocessing
import timeit


def init_XOR_dataset():
    dataset = pybrain.datasets.SupervisedDataSet(2, 1)
    dataset.addSample([0, 0], [0])
    dataset.addSample([0, 1], [1])
    dataset.addSample([1, 0], [1])
    dataset.addSample([1, 1], [0])
    return dataset


def standard_train():
    net = pybrain_tools.buildNetwork(2, 2, 1)
    net.randomize()
    trainer = pybrain_rprop.RPropMinusTrainer(net, dataset=init_XOR_dataset())
    trainer.trainEpochs(50)


def multithreaded_train(threads=8):
    nets = []
    trainers = []
    processes = []
    data = init_XOR_dataset()

    for n in range(threads):
        nets.append(pybrain_tools.buildNetwork(2, 2, 1))
        nets[n].randomize()
        trainers.append(pybrain_rprop.RPropMinusTrainer(nets[n], dataset=data))
        processes.append(multiprocessing.Process(target=trainers[n].trainEpochs(50)))
        processes[n].start()

    # Wait for all processes to finish
    for p in processes:
        p.join()


if __name__ == '__main__':
    threads = 4
    iterations = 16

    t1 = timeit.timeit("standard_train()",
                       setup="from __main__ import standard_train",
                       number=iterations)
    tn = timeit.timeit("multithreaded_train({})".format(threads),
                       setup="from __main__ import multithreaded_train",
                       number=iterations)

    print "Execution time for single threaded training: {} seconds.".format(t1)
    print "Execution time for multi threaded training: {} seconds.".format(tn)

在我的代码中,有两个函数:一个运行单线程,一个(假设)使用 multiprocessing 包运行多线程。

据我判断,我的多处理代码是正确的。但是当我运行它时,多处理代码不会在多个内核上运行。我通过检查运行时间验证了这一点(线程 = 4 和 4 个内核,它需要 4 倍的时间,而它应该需要大约与单线程运行一样长的时间)。我仔细检查了htop/atop

我知道Global Interpreter Lock (GIL),但多处理包应该可以处理这个问题。

我也知道issue that scipy causes the cpu affinity to be set in such a way that only one core is used。但是,如果我在将 scipy 导入 PyBrain 包 (print psutil.Process(os.getpid()).cpu_affinity()) 之后打印进程亲和力,我可以看到亲和力没问题:

$ python ./XOR_PyBrain.py
[0, 1, 2, 3]
Execution time for single threaded training: 14.2865240574 seconds.
Execution time for multi threaded training: 46.0955679417 seconds.

我在我的 Debian NAS 以及我的 Debian Desktop 和我的 Mac 上都观察到了这种行为。

Debian NAS 的版本信息:

  • CPU:Intel(R) Atom(TM) CPU D2701 @ 2.13GHz
  • Debian 8.4。内核:3.2.68-1+deb7u1 x86_64
  • Python 2.7.9
  • PyBrain 0.3
  • Scipy 0.14.0-2

所以,我的问题是:我如何让 PyBrain 在多核上进行训练?

【问题讨论】:

  • 你已经做到了吗?
  • @agtoever 请注意类似的question 关于多处理多线程,希望对您有所帮助。

标签: multithreading python-2.7 scipy blas pybrain


【解决方案1】:

一切似乎都是正确的。我已经测试了您的代码并且所有内核都在工作。时序问题来自于“当您尝试处理少量数据时,CPU 内核无法发挥其填充潜力。”

您构建的网络非常简单,因此在每个核心得到 100% 使用之前,该过程将结束。把它想象成你想要处理数百万个 5x5 像素的图像。您的计算机等待 HDD 获取数据的时间远远超过 CPU 处理它们的时间。

有些放在这里。但是在更快的区域(RAM)和更少量的数据(一个十进制数)中。可能如果您的计算机具有 DDR4 RAM,情况会发生变化。 (但我真的不这么认为)

尝试更繁重的流程、更大的网络、更多的数据等,你会看到你所期望的。

【讨论】:

  • 关于多处理多线程,请注意类似的question,希望对您有所帮助。
猜你喜欢
  • 2015-08-04
  • 2019-04-10
  • 2014-11-08
  • 1970-01-01
  • 2016-07-11
  • 2020-05-15
  • 2016-05-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多