Ray:如何在一个 GPU 上 运行 多个演员?
Ray: How to run many actors on one GPU?
我只有一个 gpu,我想在那个 gpu 上 运行 许多演员。这是我在 https://ray.readthedocs.io/en/latest/actors.html
之后使用 ray
所做的
- 先在gpu上定义网络
class Network():
def __init__(self, ***some args here***):
self._graph = tf.Graph()
os.environ['CUDA_VISIBLE_DIVICES'] = ','.join([str(i) for i in ray.get_gpu_ids()])
with self._graph.as_default():
with tf.device('/gpu:0'):
# network, loss, and optimizer are defined here
sess_config = tf.ConfigProto(allow_soft_placement=True)
sess_config.gpu_options.allow_growth=True
self.sess = tf.Session(graph=self._graph, config=sess_config)
self.sess.run(tf.global_variables_initializer())
atexit.register(self.sess.close)
self.variables = ray.experimental.TensorFlowVariables(self.loss, self.sess)
- 然后定义工人class
@ray.remote(num_gpus=1)
class Worker(Network):
# do something
- 定义学习器class
@ray.remote(num_gpus=1)
class Learner(Network):
# do something
- 训练函数
def train():
ray.init(num_gpus=1)
leaner = Learner.remote(...)
workers = [Worker.remote(...) for i in range(10)]
# do something
当我不尝试让它在 gpu 上工作时,这个过程工作正常。也就是说,当我删除所有 with tf.device('/gpu:0')
和 (num_gpus=1)
时它工作正常。当我保留它们时,问题就来了:似乎只创建了learner
,但是构建了workers
的none。我应该怎么做才能让它发挥作用?
当您使用装饰器 @ray.remote(num_gpus=1)
定义一个 actor class 时,您是说从这个 class 创建的任何 actor 必须在演员的一生。由于您只有一个 GPU,因此您将只能创建一个这样的 actor。
如果你想让多个演员共享一个GPU,那么你需要指定每个演员需要少于1个GPU,例如,如果你想在4个演员之间共享一个GPU,那么你可以有每个演员actor 需要 1/4 的 GPU。这可以通过用
声明演员 class 来完成
@ray.remote(num_gpus=0.25)
此外,您需要确保每个演员都真正遵守您对其施加的限制。例如,如果你想用 @ray.remote(num_gpus=0.25)
声明一个 actor,那么你还应该确保 TensorFlow 最多使用四分之一的 GPU 内存。例如,请参阅 的答案。
我只有一个 gpu,我想在那个 gpu 上 运行 许多演员。这是我在 https://ray.readthedocs.io/en/latest/actors.html
之后使用ray
所做的
- 先在gpu上定义网络
class Network():
def __init__(self, ***some args here***):
self._graph = tf.Graph()
os.environ['CUDA_VISIBLE_DIVICES'] = ','.join([str(i) for i in ray.get_gpu_ids()])
with self._graph.as_default():
with tf.device('/gpu:0'):
# network, loss, and optimizer are defined here
sess_config = tf.ConfigProto(allow_soft_placement=True)
sess_config.gpu_options.allow_growth=True
self.sess = tf.Session(graph=self._graph, config=sess_config)
self.sess.run(tf.global_variables_initializer())
atexit.register(self.sess.close)
self.variables = ray.experimental.TensorFlowVariables(self.loss, self.sess)
- 然后定义工人class
@ray.remote(num_gpus=1)
class Worker(Network):
# do something
- 定义学习器class
@ray.remote(num_gpus=1)
class Learner(Network):
# do something
- 训练函数
def train():
ray.init(num_gpus=1)
leaner = Learner.remote(...)
workers = [Worker.remote(...) for i in range(10)]
# do something
当我不尝试让它在 gpu 上工作时,这个过程工作正常。也就是说,当我删除所有 with tf.device('/gpu:0')
和 (num_gpus=1)
时它工作正常。当我保留它们时,问题就来了:似乎只创建了learner
,但是构建了workers
的none。我应该怎么做才能让它发挥作用?
当您使用装饰器 @ray.remote(num_gpus=1)
定义一个 actor class 时,您是说从这个 class 创建的任何 actor 必须在演员的一生。由于您只有一个 GPU,因此您将只能创建一个这样的 actor。
如果你想让多个演员共享一个GPU,那么你需要指定每个演员需要少于1个GPU,例如,如果你想在4个演员之间共享一个GPU,那么你可以有每个演员actor 需要 1/4 的 GPU。这可以通过用
声明演员 class 来完成@ray.remote(num_gpus=0.25)
此外,您需要确保每个演员都真正遵守您对其施加的限制。例如,如果你想用 @ray.remote(num_gpus=0.25)
声明一个 actor,那么你还应该确保 TensorFlow 最多使用四分之一的 GPU 内存。例如,请参阅