我正在尝试从头开始编写神经网络,并且由于数据集非常庞大,我希望我的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慢。