如何在Pytorch中使用gpu和Ray?我应该为远程类指定num_gpu吗?

如何在Pytorch中使用gpu和Ray?我应该为远程类指定num_gpu吗?,pytorch,ray,Pytorch,Ray,当我将光线与pytorch一起使用时,我不会为远程类设置任何num_gpus标志 我得到以下错误: RuntimeError: Attempting to deserialize object on a CUDA device but torch.cuda.is_available() is False. 主要的过程是:我创建一个远程类,并将pytorch模型state_dict()(在main函数中创建)传输给它。在主功能中,torch.cuda.is_可用()为True,但在远程功能中,

当我将光线与pytorch一起使用时,我不会为远程类设置任何num_gpus标志

我得到以下错误

RuntimeError: Attempting to deserialize object on a CUDA device but torch.cuda.is_available() is False. 
主要的过程是:我创建一个远程类,并将pytorch模型
state_dict()(在main函数中创建)
传输给它。在主功能中,
torch.cuda.is_可用()
True
,但在远程功能中,
torch.cuda.is_可用()
False
。谢谢

我试图将num_gpus设置为1,但遇到了一个新问题:程序卡住了。下面是复制此问题的最低示例代码。谢谢

导入光线
@远程(num_gpus=1)
类工作者(对象):
定义初始化(self,args):
self.args=args
self.gen_帧=0
def set_gen_帧(自身,值):
self.gen_frames=值
返回self.gen_帧
def get_gen_num(自我):
返回self.gen_帧
类参数:
定义初始化(自):
self.is_cuda=False;
self.is\u memory\u cuda=True
self.pop_size=10
如果名称=“\uuuuu main\uuuuuuuu”:
ray.init()
args=参数()
workers=[Worker.remote(args)用于范围内的(args.pop_大小)]
get\u num\u ids=[worker.get\u gen\u num.remote()用于worker中的worker]
gen\u nums=ray.get(get\u num\u id)
打印(gen_nums)

如果您还想在gpu上部署模型,您需要确保您的参与者或任务确实可以访问gpu(使用@ray.remote(num_gpus=1),这将确保torch.cuda.is_available()在该远程函数中为true)。如果您想在CPU上部署模型,则需要在加载模型时指定此选项,请参见示例。

我建议发布一个可以运行的最小示例。但是,听起来您需要使用
@ray.remote(num\u gpus=1)
。为什么不使用此标志?因为Ray教程说Ray将自动检测可用的GPU。我尝试设置num_gpus=1,但我遇到了另一个问题,程序卡住了。我将更新我的问题,以上载一个最小的代码来重现此问题。调用
ray.init()
将自动检测机器是否有可用的GPU,但任务不会为它们保留GPU,除非它们在
@ray.remote
装饰程序中明确要求它们。明白了。谢谢。我尝试了这个,得到了一个新的问题,请看我编辑的问题。谢谢。啊,可能是我们的自动gpu检测不适合您,ls/proc/driver/nvidia/gpu的输出是什么(您在哪个平台上)?你也可以试试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,但你的程序需要运行多个GPU,我想这就是为什么它会挂起来。听起来对吗?