如何在 Pytorch 中将 GPU 与 Ray 结合使用?我应该为远程类指定 num_gpus 吗?

Posted

技术标签:

【中文标题】如何在 Pytorch 中将 GPU 与 Ray 结合使用?我应该为远程类指定 num_gpus 吗?【英文标题】:How to use GPUs with Ray in Pytorch? Should I specify the num_gpus for the remote class? 【发布时间】:2019-06-24 08:52:34 【问题描述】:

当我将 Ray 与 pytorch 一起使用时,我没有为远程类设置任何 num_gpus 标志。

我收到以下错误

RuntimeError: Attempting to deserialize object on a CUDA device but torch.cuda.is_available() is False. 

主要流程是:我创建了一个远程类,并将一个pytorch模型state_dict()(created in main function)传递给它。在主函数中,torch.cuda.is_available()True,但在远程函数中,torch.cuda.is_available()False。谢谢

我尝试设置 num_gpus=1 并遇到一个新问题:程序卡住了。以下是重现此问题的最小示例代码。谢谢。

import ray


@ray.remote(num_gpus=1)
class Worker(object):
    def __init__(self, args):
        self.args = args
        self.gen_frames = 0

    def set_gen_frames(self, value):
        self.gen_frames = value
        return self.gen_frames

    def get_gen_num(self):
        return self.gen_frames


class Parameters:
    def __init__(self):
        self.is_cuda = False;
        self.is_memory_cuda = True
        self.pop_size = 10


if __name__ == "__main__":
    ray.init()
    args = Parameters()
    workers = [Worker.remote(args) for _ in range(args.pop_size)]
    get_num_ids = [worker.get_gen_num.remote() for worker in workers]
    gen_nums = ray.get(get_num_ids)
    print(gen_nums)

【问题讨论】:

我建议发布一个可以运行的最小示例。但是,听起来您需要使用@ray.remote(num_gpus=1)。你为什么不使用这个标志? 因为 Ray 教程说 Ray 会自动检测可用的 GPU。我尝试设置 num_gpus=1,但我遇到了另一个问题,程序卡住了。我将更新我的问题以上传最少的代码来重现此问题。 ray.init() 的调用应该会自动检测到机器 有可用的GPU,但除非它们在@ray.remote 中明确要求,否则任务不会为它们保留GPU装饰器。 知道了。谢谢。 【参考方案1】:

如果您还想在 gpu 上部署模型,则需要确保您的 actor 或任务确实可以访问 gpu(使用 @ray.remote(num_gpus=1),这将确保 torch. cuda.is_available() 将在该远程函数中为真)。如果您想在 CPU 上部署模型,则需要在加载模型时指定,例如参见 https://github.com/pytorch/pytorch/issues/9139。

【讨论】:

我尝试了这个并遇到了一个新问题,请参阅我编辑的问题。谢谢。 啊,可能是我们的自动gpu检测对你不起作用,ls /proc/driver/nvidia/gpus的输出是什么(你在哪个平台上)?你也可以试试 ray.init(num_gpus=1) 吗? ls /proc/driver/nvidia/gpus 的输出是0000:03:00.0 0000:82:00.0ray.init(num_gpus=1) 仍然遇到同样的问题。 我的平台是redhat 7.3。 看起来你只有一个 GPU,但你的程序需要 args.pop_size 很多 GPU 才能运行,我认为这就是它挂起的原因。这听起来对吗?

以上是关于如何在 Pytorch 中将 GPU 与 Ray 结合使用?我应该为远程类指定 num_gpus 吗?的主要内容,如果未能解决你的问题,请参考以下文章

[Pytorch系列-44]:如何使能GPU训练, 提升训练效率

vray为啥不用gpu渲染

如何告诉 PyTorch 不使用 GPU?

如何告诉 PyTorch 不使用 GPU?

Pytorch Multi-GPU原理与实现(单机多卡)

python使用Tensorflow检测GPU运行与使用Pytorch