代码之家  ›  专栏  ›  技术社区  ›  Luis Leal

即使使用显式cuda()调用,pytorch实例张量也未移动到gpu

  •  0
  • Luis Leal  · 技术社区  · 7 年前

    初始化

    model = Model()
    model.cuda()
    

    但是,当我通过以下方式向前传播简单输入X时:

    model(X) # or model.forward(X)
    

    我明白了

    RuntimeError:应为torch.cuda.FloatTensor类型的对象,但未找到 为参数#2'mat2'键入torch.FloatTensor

    指示matmul的第二个参数(我声明的实例张量)在CPU上,它在GPU上是预期的(与模型和数据的其余部分一样)。

    在matmul中,张量通过matrix.t()进行转置

    def cuda(self):
        super().cuda()
        self.matrix.cuda()
    

    X = X.cuda()
    

    这个错误还明确地说是matmul的参数2,在这种情况下,它是张量(称为矩阵),而不是X。

    1 回复  |  直到 7 年前
        1
  •  7
  •   Community Mohan Dere    5 年前

    让我们假设如下:

    1. X 已正确移动到GPU

    2. Model 类是一个简单的属性。

      i、 e.类似于以下内容:

    class Model(nn.Module):
       def __init__(self):
           super().__init__()
           self.matrix = torch.randn(784, 10)
           
       def forward(self, x):
           return torch.matmul(x, self.matrix)
    

    nn.Module.cuda() 方法只移动所有 Parameters Buffers

    你需要做出决定 Model.matrix Parameter 将其包装在参数类中。

    self.matrix = nn.Parameter(torch.randn(784, 10))
    

    现在,您尝试手动调用 .cuda() 模型矩阵 在覆盖范围内。

    nn.Module.cuda() 方法和步骤 torch.Tensor.cuda() 方法

    nn.Module.cuda() 缓冲区 Module torch.Tensor.cuda() 复制

    原始张量不受影响。


    1. 把你的头发包起来 matrix 属性为 参数
    2. 通过以下方式将GPU副本分配回矩阵:
    self.matrix = self.matrix.cuda()
    

    在你的超控中。

    我建议第一个。

        2
  •  2
  •   drevicko    6 年前

    当nn.Module.cuda()将模块的所有参数和缓冲区移动到GPU并返回自身时,torch.Tensor.cuda() 在GPU上。

    # if m is a Module, you do:
    m.cuda()
    
    # if t is a Tensor, you do:
    t = t.cuda()