我只有一个 GPU,我想在该 GPU 上运行许多 Actor。这是我使用的方法ray
, 下列的https://ray.readthedocs.io/en/latest/actors.html https://ray.readthedocs.io/en/latest/actors.html
- 首先在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')
and (num_gpus=1)
。当我保留它们时,麻烦就出现了:似乎只有learner
已创建,但没有一个workers
被建造。我应该怎么做才能让它发挥作用?
当您使用装饰器定义演员类时@ray.remote(num_gpus=1)
,您是说从此类创建的任何 actor 都必须在 actor 的生命周期内为其保留一个 GPU。由于您只有一个 GPU,因此您只能创建一个这样的 actor。
如果你想让多个 Actor 共享一个 GPU,那么你需要指定每个 Actor 需要少于 1 个 GPU,例如,如果你希望在 4 个 Actor 之间共享一个 GPU,那么你可以让每个 Actor 需要 1/4 GPU 的。这可以通过声明 actor 类来完成
@ray.remote(num_gpus=0.25)
此外,您需要确保每个参与者确实尊重您对其设置的限制。例如,如果你想声明一个演员@ray.remote(num_gpus=0.25)
,那么您还应该确保 TensorFlow 使用最多四分之一的 GPU 内存。查看以下问题的答案如何防止 TensorFlow 分配全部 GPU 内存? https://stackoverflow.com/questions/34199233/how-to-prevent-tensorflow-from-allocating-the-totality-of-a-gpu-memory例如。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)