从gpu打印PytorchTensor,还是移动到cpu和/或分离?

d7v8vwbk  于 2023-01-13  发布在  其他
关注(0)|答案(1)|浏览(194)

我刚开始使用Pytorch,还在努力理解它的基本概念。
如果我在GPU上有一个网络n,它产生一个输出Tensorout,它可以直接打印到stdout吗?或者应该先将它移到cpu,或者在打印之前将它从图形中分离出来?
尝试了以下涉及.cpu().detach()的几种组合

import torch.nn as nn
import torch

class Net(nn.Module):
    def __init__(self):
        super().__init__()
        self.layers = nn.Sequential(
            nn.Linear(5, 10),
            nn.ReLU(),
            nn.Linear(10, 10),
            nn.ReLU(),
            nn.Linear(10, 3),
        )

    def forward(self, x):
        return self.layers(x)

device = torch.device("cuda:0")  # assume its available
x = torch.rand(10, 5).to(device)
net = Net().to(device)

# Pretend we are in a training loop iteration

out = net(x)
print(f"The output is {out.max()}")
print(f"The output is {out.max().detach()}")
print(f"The output is {out.max().cpu()}")
print(f"The output is {out.max().cpu().detach()}")

# continue training iteration and repeat more iterations in training loop

我得到了相同的输出为所有4种方法。哪种是正确的方式?

xggvc2p6

xggvc2p61#

你不应该对同样的价值输出感到惊讶,它不应该改变任何价值。
cpu()将Tensor传递到cpu。并且detach()将Tensor从计算图形中分离,以便autograd不会在将来的反向传播中跟踪它。
通常我是做.detach().cpu()的,因为它将它从计算图中分离出来,然后它将移动到cpu中进行进一步处理。.cpu().detach()也可以,但在这种情况下,autograd考虑了cpu(),但在前面的情况下,.cpu()操作不会被autograd跟踪,这是我们想要的。就是这样。它'It“只有这些小事情是不同的--价值在所有情况下都是相同的。

相关问题