Python 在不同CPU上并行运行的多个PyTorch网络
我试图让不同的PyTorch神经网络在不同的CPU上并行运行,但我发现,与顺序运行它们相比,它并没有带来任何加速 下面是我的代码,它完全复制了这个问题。如果您运行这段代码,它表明使用2个进程所花费的时间大约是使用1个进程所花费时间的两倍,但实际上所花费的时间应该是相同的Python 在不同CPU上并行运行的多个PyTorch网络,python,parallel-processing,pytorch,Python,Parallel Processing,Pytorch,我试图让不同的PyTorch神经网络在不同的CPU上并行运行,但我发现,与顺序运行它们相比,它并没有带来任何加速 下面是我的代码,它完全复制了这个问题。如果您运行这段代码,它表明使用2个进程所花费的时间大约是使用1个进程所花费时间的两倍,但实际上所花费的时间应该是相同的 import time import torch.multiprocessing as mp import gym import numpy as np import copy import torch.nn as nn imp
import time
import torch.multiprocessing as mp
import gym
import numpy as np
import copy
import torch.nn as nn
import torch
class NN(nn.Module):
def __init__(self, output_dim):
nn.Module.__init__(self)
self.fc1 = nn.Linear(4, 50)
self.fc2 = nn.Linear(50, 500)
self.fc3 = nn.Linear(500, 5000)
self.fc4 = nn.Linear(5000, output_dim)
self.relu = nn.ReLU()
def forward(self, x):
x = self.relu(self.fc1(x))
x = self.relu(self.fc2(x))
x = self.relu(self.fc3(x))
x = self.fc4(x)
return x
def Worker(ix):
print("Starting training for worker ", ix)
env = gym.make('CartPole-v0')
model = NN(2)
for _ in range(2000):
model(torch.Tensor(env.reset()))
print("Finishing training for worker ", ix)
def overall_process(num_workers):
workers = []
for ix in range(num_workers):
worker = mp.Process(target=Worker, args=(ix, ))
workers.append(worker)
[w.start() for w in workers]
for worker in workers:
worker.join()
print("Finished Training")
print(" ")
start = time.time()
overall_process(1)
print("Time taken: ", time.time() - start)
print(" ")
start = time.time()
overall_process(2)
print("Time taken: ", time.time() - start)
有人知道为什么会发生这种情况以及如何解决吗
我认为这可能是因为PyTorch networks在后台自动实现CPU并行性,因此我尝试添加以下两行代码,但这并不总能解决问题:
torch.set_num_threads(1)
torch.set_num_interop_threads(1)
答案是设置torch。在每个辅助进程开始时(而不是在主进程中)设置_num_线程(1),如下所述:有多少个内核?AFAIK Pytork通过MKL使用所有可用的核心,因此一个网络的训练速度可能是使用所有核心的两倍,这将解释您的结果。尝试使用
torch.set_num_线程(cores//2)
而不使用torch.multi-processing
,看看这是否会改变什么。遗憾的是,使用torch.set_num_线程(1)似乎无法解决问题。