Python 如何在GPU上进行Pytork分发

Python 如何在GPU上进行Pytork分发,python,deep-learning,gpu,pytorch,distribution,Python,Deep Learning,Gpu,Pytorch,Distribution,有没有可能让PyTorch发行版直接在GPU上创建它们的样本 如果我这样做 from torch.distributions import Uniform, Normal normal = Normal(3, 1) sample = normal.sample() 然后样本将在CPU上。当然,可以在GPU上执行sample=sample.to(torch.device(“cuda”))。但是,有没有一种方法可以让样本直接进入GPU,而不首先在CPU上创建它 PyTorch发行版继承自对象,而不

有没有可能让PyTorch发行版直接在GPU上创建它们的样本

如果我这样做

from torch.distributions import Uniform, Normal
normal = Normal(3, 1)
sample = normal.sample()
然后样本将在CPU上。当然,可以在GPU上执行
sample=sample.to(torch.device(“cuda”))
。但是,有没有一种方法可以让样本直接进入GPU,而不首先在CPU上创建它

PyTorch发行版继承自
对象,而不是
nn.Module
,因此它没有将发行版实例放到GPU上的
方法


有什么想法吗?

发行版使用了重新参数化技巧。因此,将GPU上的大小为0的张量赋予分布构造函数。详情如下:

normal = Normal(torch.tensor(0).to(device=torch.device("cuda")), torch.tensor(1).to(device=torch.device("cuda")))

在我的例子中,我在神经网络模型中使用正态分布作为先验。例如,我有一个名为class1的类,在init函数中,我必须初始化我的prior。但是,调用class1实例的
.to('cuda')
不会更改分发设备,并在以后的使用中导致错误。因此,我可以使用寄存器缓冲区如下管理它

class class1(nn.Module):
    def __init__(self):
        super().__init__()
        self.register_buffer("mean", torch.tensor(0.))
        self.register_buffer("var", torch.tensor(1.))
    def get_dist(self):
        return torch.distributions.Normal(self.mean, self.var)
但是,我有几个先验条件,不可能注册一个列表。因此,一个选项可以是在get_dist属性中启动分发,除非您不关心启动分发的时间复杂性。我决定定义一个函数来启动分发,并尝试在get_dist中处理不同的状态。如果分配变量未分配或在CPU上,而我们期望它在GPU上,它会跳到除非我使用
torch.zeros(..).to(device)
启动分配

总的来说,要处理CPU/GPU设备的这个错误,您需要使用张量输入参数和适当的设备来启动分发。主要原因是
torch.Distribution
模块没有设备属性