Python 具有少量GPU的多个cpu生产商不使用100%的GPU(Pytork)

Python 具有少量GPU的多个cpu生产商不使用100%的GPU(Pytork),python,parallel-processing,deep-learning,pytorch,reinforcement-learning,Python,Parallel Processing,Deep Learning,Pytorch,Reinforcement Learning,我尝试使用多个CPU并行地实现棋盘游戏自玩数据生成,以同时进行自玩。对于父进程,我为30个CPU创建了4个NN模型(1个模型用于10个CPU,1个模型用于训练),每个模型位于不同的GPU中(该模型使用batchnorm实现为20块类似resnet的体系结构),伪代码如下 nnet = NN(gpu_num=0) nnet1 = NN(gpu_num=1) nnet2 = NN(gpu_num=2) nnet3 = NN(gpu_num=3) for i in range(num_iterati

我尝试使用多个CPU并行地实现棋盘游戏自玩数据生成,以同时进行自玩。对于父进程,我为30个CPU创建了4个NN模型(1个模型用于10个CPU,1个模型用于训练),每个模型位于不同的GPU中(该模型使用batchnorm实现为20块类似resnet的体系结构),伪代码如下

nnet = NN(gpu_num=0)
nnet1 = NN(gpu_num=1)
nnet2 = NN(gpu_num=2)
nnet3 = NN(gpu_num=3)

for i in range(num_iteration):
    nnet1.load_state_dict(nnet.state_dict())
    nnet2.load_state_dict(nnet.state_dict())
    nnet3.load_state_dict(nnet.state_dict())
    samples = parallel_self_play()
    nnet.train(samples)
pool = mp.Pool(processes=num_cpu) #30
for i in range(self.args.numEps):
    results = []
    if i % 3 == 0:
        net = self.nnet1
    elif i % 3 == 1:
        net = self.nnet2
    else:
        net = self.nnet3

     results.append(pool.apply_async(AsyncSelfPlay, args=(net))
     # get results from results array then return it
     return results 
parallel_self_play()的实现如下

nnet = NN(gpu_num=0)
nnet1 = NN(gpu_num=1)
nnet2 = NN(gpu_num=2)
nnet3 = NN(gpu_num=3)

for i in range(num_iteration):
    nnet1.load_state_dict(nnet.state_dict())
    nnet2.load_state_dict(nnet.state_dict())
    nnet3.load_state_dict(nnet.state_dict())
    samples = parallel_self_play()
    nnet.train(samples)
pool = mp.Pool(processes=num_cpu) #30
for i in range(self.args.numEps):
    results = []
    if i % 3 == 0:
        net = self.nnet1
    elif i % 3 == 1:
        net = self.nnet2
    else:
        net = self.nnet3

     results.append(pool.apply_async(AsyncSelfPlay, args=(net))
     # get results from results array then return it
     return results 
我的代码在第一次自玩时gpu利用率几乎为100%(每次迭代不到10分钟),但在第一次迭代(训练)后,当我将新权重加载到nnet1-3时,gpu利用率再也不会达到80%(每次迭代约30分钟-1小时)。我在处理代码时注意到一些事情

  • 此模型包括batchnorm层,当将模型切换到train()模式->train->切换回eval()时,会导致自播放(使用模型的向前传球)根本不使用gpu

  • 如果不从eval()->train()(列车使用eval模式)切换,这会导致gpu利用率降低(30-50%),但不会完全消失

  • 如果不是主模型的模型没有从主模型加载权重,self play仍然使用100%的gpu,因此我猜测在训练过程中发生了一些事情,并改变了模型中的一些状态

  • 当仅使用8个CPU-1gpu体系结构和动态训练模型(无中间模型)时,也会发生这种情况

    有人能指导我在哪里修复代码,或者我应该如何训练我的模型吗