如何在 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.0
,ray.init(num_gpus=1)
仍然遇到同样的问题。
我的平台是redhat 7.3。
看起来你只有一个 GPU,但你的程序需要 args.pop_size 很多 GPU 才能运行,我认为这就是它挂起的原因。这听起来对吗?以上是关于如何在 Pytorch 中将 GPU 与 Ray 结合使用?我应该为远程类指定 num_gpus 吗?的主要内容,如果未能解决你的问题,请参考以下文章