python - Ray:如何在一个 GPU 上运行多个演员?
问题描述
我只有一个 gpu,我想在那个 gpu 上运行很多演员。以下是我使用的内容ray
,遵循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')
和(num_gpus=1)
. 当我保留它们时,问题就出现了:似乎只有learner
被创建,但没有一个workers
被构造。我应该怎么做才能让它工作?
解决方案
当你使用装饰器定义一个actor类时@ray.remote(num_gpus=1)
,你是说从这个类创建的任何actor都必须在actor的生命周期内为其保留一个GPU。由于您只有一个 GPU,您将只能创建一个这样的演员。
如果你想让多个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 内存的答案?例如。
推荐阅读
- r - 从 bash 调用 R 脚本时退出代码
- c++ - 赋值运算符并不总是在模板类上调用
- javascript - JS 函数适用于单个数组,但在尝试遍历数组数组时行为不端
- python - 使用 Tensor 编写 Numpy 操作
- javascript - 如果填充了表单,则在 React 中构造 POST Json
- typescript - 将 React Redux 连接到 Typescript 中的组件
- php - 如何使所有 example.com 页面重定向到 example.com/smth
- python - 如何从 Julia 的 if 语句中打破 for 循环?
- python - nan到空字符串python
- javascript - 从本地主机跨站点cookie到paystack?