Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在不同CPU上并行运行的多个PyTorch网络_Python_Parallel Processing_Pytorch - Fatal编程技术网

Python 在不同CPU上并行运行的多个PyTorch网络

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

我试图让不同的PyTorch神经网络在不同的CPU上并行运行,但我发现,与顺序运行它们相比,它并没有带来任何加速

下面是我的代码,它完全复制了这个问题。如果您运行这段代码,它表明使用2个进程所花费的时间大约是使用1个进程所花费时间的两倍,但实际上所花费的时间应该是相同的

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)似乎无法解决问题。