2016-06-08 121 views
2

我试图在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火车多核心?

+0

你已经实现了吗? – mdargacz

回答

0

一切似乎currect。我测试了你的代码,并且所有内核都在工作。计时的问题来自这样的事实:“当您尝试处理少量数据时,CPU内核无法实现其填充潜力。”

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

一些在这里。但在更快的区域(RAM)和更小的数据量(一个十进制数)。如果你的电脑有DDR4内存,情况可能会改变。 (但我真的不这么认为)

尝试较重的过程中,更大的网络,更多的数据,等等,你会看到你所期望的。