gpt4 book ai didi

multithreading - Python : multithreaded learning neural networks using PyBrain and Multiprocessing

转载 作者:行者123 更新时间:2023-12-03 13:10:06 31 4
gpt4 key购买 nike

我正在尝试使用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)

在我的代码中,有两个功能:一个运行单线程,另一个(据说)运行使用多处理程序包的多线程。

据我判断,我的多处理代码是正确的。但是,当我运行它时,多处理代码不会在一个以上的内核上运行。我通过检查运行时间来验证了这一点(使用线程= 4和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在多个内核上训练?

    最佳答案

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

    您建立的网络非常简单,因此在每个内核获得100%使用率之前,该过程将结束。就像想处理数百万个5x5像素的图像一样。您的计算机等待硬盘驱动器获取数据的时间远远超过CPU处理数据所花费的时间。

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

    尝试更大的过程,更大的网络,更多数据等,您将看到期望的结果。

    关于multithreading - Python : multithreaded learning neural networks using PyBrain and Multiprocessing,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37706743/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com