Python 雷:如何在一个GPU上运行多个演员?
我只有一个gpu,我想在这个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'
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内存,这是合理的,因为需要保存前向传递的激活,以便后向传递可以使用它们。这通常会占用大量内存。