我试图在Python中使用PyBrain和Python的multiprocessing包来训练一个神经网络。Python:使用PyBrain和Multiprocessing的多线程学习神经网络
这是我的代码(它训练一个简单的神经网络来学习异或逻辑)。
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倍的时间,而它应该大致与单线程运行一样长)。我查看了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桌面以及我的Mac上。
为Debian NAS版本信息:
- CPU:英特尔(R)原子(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火车多核心?
你已经实现了吗? – mdargacz