在Python中并行化循环

时间:2017-11-08 14:49:49

标签: python-3.x parallel-processing parallelism-amdahl

我编写了一个运行速度非常慢的神经网络,因此我希望通过并行化某个循环来加快速度。

我不确定GIL的实施情况以及GIL的相关性。

代码如下所示:

class net():
    def train(inputs)
        ...
        for tset in batch:
            self.backprop(tset, learn_rate)

    def backprop(inputs):
        ...
        for c, w in zip(n.inconnections, range(len(n.inconnections))):
            c.current_error += n.current_error * n.inconnectionweights[w]
            n.icweightupdates[w] += - learn_rate * n.current_error * c.activation
        n.biasupdate += -learn_rate * n.current_error

train() 中的循环是我要并行化的循环,因为 batch 包含一组可能的训练样本(20)独立处理。

2 个答案:

答案 0 :(得分:1)

虽然“ AGILE ”福音传播团伙的声音越来越响亮,

在您知道这样做之前,切勿开始编码:

为什么?

你可以花费无限的时间来编写一个事物,甚至没有任何意义,而花费在合理系统工程上的合理时间将帮助你确定,什么步骤是合理的,什么不是。

所以,让我们从一个共同点开始:你对并行化的动机是什么 - 是,性能。

如果我们都同意这一点,那就让我们回顾一下这个新的专业领域。

草拟代码并不难,这在这方面非常糟糕。

能够理解并设计代码变得越来越重要,这些代码可以利用当代硬件基础设施来实现最佳性能。

一般是intended for many other reasons, not just the performance -- your case, as proposed above, is at the end actually a "just"-[CONCURRENT]-type of process-scheduling。不正确 - [PARALLEL]?当然,如果它不在具有超过21个CPU内核的机器上,超线程关闭和所有操作系统进程暂时停止,直到所有20个示例在那里被处理并返回,在所有全局最小化器环路中得到融合

想象一下,你尝试只运行20个机器学习输入(示例),而现实世界的DataSET有数千个(在我的问题域中有数十万个)要处理的例子,所以永远不会进入这样的使用这种方式实现真正的[PARALLEL]流程调度的极端。

Best start to understand the Amdahl's Law in its full context first(对于新生实验而言,一种过头的天真制剂会为此做出糟糕的服务 - 首先是掌握 full-details also the Criticism section of the updated post on的开销和资源限制在投票进入“并行化,不惜任何代价”之前 - 甚至如果有六个“想要大师”建议你这么做并且有很多公关动机媒体今天大喊大叫你并行。)

Next, read this about details and differences, that may come just from using better or more appropriate tools ( Once having understood the Amdahl's Law principal Speedup ceilings, the speedup of +512x will shock you and set the gut feeling, what makes and what does not make sense )。这与每个性能瓶颈审查和重新设计相关。大多数神经网络花费了大量的时间( ,因为代码性能不佳,但由于巨大的DataSET大小)重新运行Feed前馈+返回传播阶段,其中矢量化代码比使用普通的python代码更难设计,但这是性能可以获得而不是丢失的地方。

Python可以使用 numpy 中的智能矢量化工具加上可以设计您的代码,通过系统使用视图来利用最小的开销,而不是在制作内存时重复地失去性能 - 分配一旦在神经网络中传递密集矩阵的副本,如果python实现要显示其可能的速度。

有很多情况,当只是编码会在代码可能涌入的任何工艺中产生非常糟糕的处理性能,而一些数学将显示对计算过程和过程性能的智能重新设计突然跳了几个数量级 ( yes, 10x, 100x faster just by using human brain and critical thinking )

是的,很难设计一个快速的代码,但是没有人答应你免费享用晚餐,是吗?

最后,但并非最不重要:

永远不要让所有[CONCURRENT] - 任务执行完全相同的工作,而不是总是重复它:

for c, w in zip( n.inconnections, range( len( n.inconnections ) ) ):
    ...

此语法很容易编码,但会在每个“想要加速”的任务中引入重新计算的 zip() 处理。不。如果表现仍然存在,那确实是一个坏主意。

答案 1 :(得分:0)

由于GIL,Python线程不会更快。相反,您可以尝试进程:

function largestOfFour(arr) {
    return arr.map(function (subArr){
        return subArr.reduce(function (oldLargest, newLargest) {
            return (newLargest > oldLargest) 
                ? newLargest
                : oldLargest;
        }, 0);
    });
}