使用火炬时多处理速度变慢

问题描述 投票:0回答:1

我使用

differential_evolution
中的
scipy
workers
来并行计算。我从
pytorch
切换到
numpy
以加快代码速度。

from torch.multiprocessing import set_start_method,Pool
if __name__ == '__main__':
    #device = get_device()
    device = torch.device('cpu') # testing with cpu
    num_workers=int(sys.argv[1])
    set_start_method("spawn",force=True)
    pool=Pool(num_workers)
    results = differential_evolution(likelihood, seed=np.random.seed(0),workers=pool.map,
                                             callback=print_de, bounds=bounds, maxiter=1500,
                                             disp=True,recombination=0.1,mutation=(0.9,1),
                                             constraints=NonlinearConstraint(positive_definite, lb=0, ub=np.inf),
                                             popsize=25,
                                             polish=False
                                             )

在我自己的笔记本电脑(m1 macbook)中,使用

torch.multiprocessing
multiprocessing
都可以正常工作(只需设置
workers=int(sys.argv[1])
)。

当我在 1 个节点有 256 个核心的 HPC 中测试这一点时,它的速度变慢了很多。使用

torch.multiprocessing
multiprocessing
更快,但一次迭代仍然比我不进行并行时慢得多。

当我使用

top
时,我可以看到正在运行的正确数量的
python
实例,但CPU使用率超过100%,有些甚至每个
python
为1000%,这可能是问题吗?当我使用
numpy
时,CPU使用率几乎是100%。

我该如何解决这个问题?

python-3.x numpy pytorch scipy multiprocessing
1个回答
0
投票

每种情况都是独特的。但这里有一些提示:

  1. 您只想使用足够的并行性,以免出现超额订阅。
  2. 并行涉及线程创建、将作业发送给不同的worker等开销。如果开销太大,那么串行计算可能会更好
  3. 矢量化通常会带来好处。这是您的目标函数同时发送大量参数向量的地方。如果您可以有效地处理这个问题(包括实现您自己的并行化),那么这可能比进行并行计算的 Differential_evolution 更好。
  4. 有时,在您自己的目标函数内进行并行化比并行化求解器更好。
  5. 如果瓶颈是计算,请考虑在 Cython/C 中实现目标函数。但是,对于大矩阵的矩阵乘法,您需要使用 BLAS。
© www.soinside.com 2019 - 2024. All rights reserved.