Рэй: Как запустить много актеров на одном GPU? - PullRequest
0 голосов
/ 02 февраля 2019

У меня только один графический процессор, и я хочу запустить много актеров на этом графическом процессоре.Вот что я делаю, используя ray, после чего https://ray.readthedocs.io/en/latest/actors.html

  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)
затем определите рабочий класс
@ray.remote(num_gpus=1)
class Worker(Network):
    # do something
определить класс ученика
@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 не создается.Что я должен сделать, чтобы это работало?

1 Ответ

0 голосов
/ 03 февраля 2019

Когда вы определяете класс актера с помощью декоратора @ray.remote(num_gpus=1), вы говорите, что любой актер, созданный из этого класса, должен иметь один GPU, зарезервированный для него на время жизни актера.Поскольку у вас есть только один графический процессор, вы сможете создать только один такой актер.

Если вы хотите, чтобы несколько актеров совместно использовали один графический процессор, то вам нужно указать, что каждому актору требуется менее 1 графического процессора,например, если вы хотите разделить один графический процессор среди 4 актеров, то вы можете попросить каждого актера требовать 1/4 графического процессора.Это можно сделать, объявив класс актера с помощью

@ray.remote(num_gpus=0.25)

Кроме того, вам необходимо убедиться, что каждый актор действительно соблюдает ограничения, которые вы на него устанавливаете.Например, если вы хотите объявить актера с @ray.remote(num_gpus=0.25), то вам также следует убедиться, что TensorFlow использует не более четверти памяти GPU.См. Ответы на Как предотвратить использование тензорного потока всей памяти GPU? например.

...