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

Ray: How to run many actors on one GPU?

我只有一个 gpu,我想在那个 gpu 上 运行 许多演员。这是我在 https://ray.readthedocs.io/en/latest/actors.html

之后使用 ray 所做的
  1. 先在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)
  1. 然后定义工人class
@ray.remote(num_gpus=1)
class Worker(Network):
    # do something
  1. 定义学习器class
@ray.remote(num_gpus=1)
class Learner(Network):
    # do something
  1. 训练函数
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 内存。例如,请参阅 的答案。