为什么numpy的多处理速度很慢?

时间:2020-11-04 07:54:38

标签: python numpy python-multiprocessing joblib

我正在尝试从头开始编写神经网络,并且由于数据集非常庞大,我希望我的4个内核可以并行处理批处理。但是,与逐批处理所有批次相比,多处理的最终执行时间要慢。

我尝试了很多事情,但是我无法弄清楚问题所在。如果我为批处理的所有参数和变量分配了单独的内存,然后对该函数进行多处理,那么它不应该在与单独计算单个批处理相同(或至少相似)的时间内给出4个结果吗?我知道并行处理会有一些开销,但是单次执行要花四倍多的时间呢? 我在某个地方错了吗?

我将整个问题简化为一个简单的代码段:

Container(
        width: 330,
        height: 40,
        alignment: Alignment.centerLeft,
        child: TextField(
          controller: inputController,
          focusNode: focusNode,
          style: MyTextStyle.level9,
          keyboardType: TextInputType.number,
          decoration: InputDecoration(
            hintText: 'hint text',
            hintStyle: MyTextStyle.grey,
            border: InputBorder.none,
            suffixIcon: focusNode.hasFocus
                ? IconButton(
                    icon: MyIcon.CloseIcon,
                    onPressed: () {
                      inputController.clear();
                    })
                // use a SizedBox widget instead
                : SizedBox.shrink(),
            filled: true,
          ),
        ),
        decoration: BoxDecoration(
          color: MyColor.MidGray,
        ),
      ),

此代码段在我的计算机上显示了此结果:

import numpy as np
import time
from joblib import Parallel, delayed, parallel_backend

def compute(message, data):
    start = time.time()
    iters = 10
    for i in range(iters):
        c_sum = np.sum(data, axis=(2, 3, 4))
    end = time.time()
    print(f"{message}: {end-start:.4f}")

def main():
    data = np.random.randn(16, 32, 48, 48, 32)
    compute("Single Batch", data)
    n_jobs = 4
    with parallel_backend('loky', n_jobs=n_jobs):
        Parallel(n_jobs, prefer='processes')(delayed(compute)("parallel", data) for i in range(n_jobs))

if __name__ == "__main__":
    main()

如您所见,处理单个批处理比每次并行执行都要快。随着“ for”循环中迭代次数的增加,这个问题也越来越严重。我可以为此做些什么吗?

PS:我也尝试过numexpr,但是它甚至比numpy慢。

0 个答案:

没有答案