Python 雷:如何在一个GPU上运行多个演员?

Python 雷:如何在一个GPU上运行多个演员?,python,tensorflow,ray,Python,Tensorflow,Ray,我只有一个gpu,我想在这个gpu上运行许多演员。下面是我使用光线所做的工作 首先在gpu上定义网络 class网络(): 定义初始化(self,***此处有一些参数***): self.\u graph=tf.graph() os.environ['CUDA\u VISIBLE\u DIVICES']=','.join([str(i)for i in-ray.get\u gpu id()) 使用self.\u graph.as\u default(): 使用tf.device('/gpu:0'

我只有一个gpu,我想在这个gpu上运行许多演员。下面是我使用光线所做的工作

  • 首先在gpu上定义网络
  • class网络():
    定义初始化(self,***此处有一些参数***):
    self.\u graph=tf.graph()
    os.environ['CUDA\u VISIBLE\u DIVICES']=','.join([str(i)for i in-ray.get\u gpu id())
    使用self.\u graph.as\u default():
    使用tf.device('/gpu:0'):
    #这里定义了网络、损耗和优化器
    sess\u config=tf.ConfigProto(allow\u soft\u placement=True)
    sess_config.gpu_options.allow_growth=True
    self.sess=tf.Session(graph=self.\u graph,config=sess\u config)
    self.sess.run(tf.global\u variables\u initializer())
    atexit.寄存器(self.sess.close)
    self.variables=ray.experimental.TensorFlowVariables(self.loss,self.sess)
    
  • 然后定义工人类
  • @ray.remote(num\u gpus=1)
    班主任(网络):
    #做点什么
    
  • 定义学习者类别
  • @ray.remote(num\u gpus=1)
    班级学员(网络):
    #做点什么
    
  • 列车功能
  • def列():
    ray.init(num_gpus=1)
    leaner=学习者。远程(…)
    workers=[范围(10)内i的Worker.remote(…)]
    #做点什么
    

    当我不想让它在gpu上工作时,这个过程工作得很好。也就是说,当我使用tf.device('/gpu:0')和
    (num_gpus=1)
    删除所有
    时,它可以正常工作。当我保存它们时,问题就出现了:似乎只创建了
    学习者
    ,但没有构建
    工作者
    。我应该怎么做才能使它工作?

    当您使用decorator
    @ray.remote(num\u gpus=1)
    定义一个actor类时,您的意思是从该类创建的任何actor在其生命周期内都必须为其保留一个GPU。由于您只有一个GPU,您将只能创建一个这样的参与者

    如果希望多个参与者共享一个GPU,则需要指定每个参与者需要的GPU少于1个,例如,如果希望在4个参与者之间共享一个GPU,则可以让每个参与者需要GPU的1/4。这可以通过使用

    @ray.remote(num_gpus=0.25)
    

    此外,您需要确保每个参与者都尊重您对其施加的限制。例如,如果要使用
    @ray.remote(num_gpus=0.25)
    声明一个参与者,那么还应该确保TensorFlow最多使用GPU内存的四分之一。例如,请参见的答案。

    谢谢,它很有效。我可以进一步问你一个问题吗?我发现
    学习者实际上分配的GPU内存比工作者少,这有什么区别?员工负责与
    健身房
    环境互动,计算梯度并将其发送给学员。学习者应用渐变并将网络权重返回到workers@SherwinChen如果不看定义,很难说。然而,梯度计算比其他任何东西都需要更多的GPU内存,这是合理的,因为需要保存前向传递的激活,以便后向传递可以使用它们。这通常会占用大量内存。