为什么在完成一定数量的任务后多处理突然停止?

时间:2019-11-27 10:35:07

标签: python multiprocessing pytorch

我正在尝试编写一些代码以并行执行一堆任务。基本上,脚本的组织方式如下。

import multiprocessing as mp


def obj_train(x):
    return x.train()


class ServerModel(nn.Module):
    self.S = nn.Parameter(torch.rand(x, y), requires_grad=True)


class ClientModel(nn.Module):
    self.S = nn.Parameter(torch.rand(x, y), requires_grad=True)
    self.U = nn.Parameter(torch.rand(x, y), requires_grad=True)


class Server:
    def __init__(self, model):
        self.model = model
        ...

    def train(clients):
        for i, c in enumerate(clients):
            sd = c.model.state_dict()
            sd['S'] = self.model.S
            c.model.load_state_dict(sd)
        self.c_list = random.sample(clients, 200)
        pool = mp.Pool(mp.cpu_count()-1)
        results = pool.map(obj_train, self.c_list)
        pool.close()
        pool.join()
        print("Training complete")


class Client:
    def __init__(self, client_id, model, train_set):
        self.id = client_id
        self.model = model
        self.train_set = train_set

    def train(self):
        self.optimizer = optim.SGD([self.model.S, self.model.U])
        for i in self.train_set:
            loss = self.model(i)
            loss.backward()
            self.optimizer.step()
        print("Trained client %d", self.id)

        return self.model.S


if __name__ == '__main__':
    ...
    server = Server(server_model)
    clients = [Client(u, ClientModel(), train_set[u]) for u in range(n_clients)]
    server.train(clients)

好的,问题出在多处理中。我尝试了很多方法,但是所有方法都给我带来了同样的问题。服务器应管理200个客户端的培训,但是经过一定数量的培训(具体取决于方法,但大约为50-100),脚本完全卡住并且CPU的内核停止工作。

您有什么想法吗?我尝试过的其他方法例如是mp.PoolProcessPoolExecutor

谢谢您的帮助。

1 个答案:

答案 0 :(得分:1)

是不是您达到了机器能够处理的最大进程数/线程数? 例如,当将Web爬网程序从开发阶段转移到生产阶段时,机器通常不允许进行更多处理,这是很常见的。

我来看看文件

/etc/sysctl.d

,以防增加机器可能处理的数量。

另一个原因可能是您限制了RAM限制或类似限制,请尝试快速查看命令

htop

跟着

free -m 

看看他们告诉你什么。这可能是硬件问题。虽然从软件中可以看出,您正在使用的https://docs.python.org/2/library/multiprocessing.html库具有硬编码限制。同样在这里,您可以在库参数中轻松将其设置得更高。

最后但并非最不重要的一点,请尝试逐步查找问题。我将使用2个进程对其进行测试,然后缓慢递增以查看应用程序何时开始出现问题。到那时,问题可能更清楚了。祝你好运!