【问题标题】:How do I know whether an instance is stored on GPU with PyTorch?如何使用 PyTorch 知道实例是否存储在 GPU 上?
【发布时间】:2021-11-14 10:37:14
【问题描述】:

最近在学习PyTorch,出现了这个问题。 例如,如果我有一个网络继承了“torch.nn.Module”。

class Net(torch.nn.Module):
    def __init__(self, something):
        super(net, self).__init__()
        self.p1=something

    def forward():
        pass

net1=Net(123)
net1.cuda()  ##Here I can't see what is changed.

那我怎么知道net1(和那个东西)是否存储在GPU上。

我已经阅读了 *.cuda() 的工作原理,似乎让所有“孩子”都运行 *.cuda()。我试图看看“孩子”是什么。上面的 net1 好像没有孩子。

【问题讨论】:

    标签: pytorch


    【解决方案1】:

    要检查一个简单的张量,您可以检查is_cuda 属性。例如:

    x = torch.zeros(100).cuda()
    y = torch.zeros(100)
    
    print(x.is_cuda) # True
    print(y.is_cuda) # False
    

    要检查模型,最简单的方法是使用 parameters() 方法,该方法返回模型的所有可训练参数。

    next(model.parameters()).is_cuda
    

    【讨论】:

    • 这假设模型的所有张量都在同一个设备上,即它只是告诉你第一个设备。这可能还不够。
    • 这很好。你有什么提示来处理这个吗?我现在无法测试它,因为我目前只有 1 个 GPU 可用。
    • 取决于你想做什么。对于报告/调试,只需遍历参数即可。 (我也可以在单个 GPU 上完成 99% 的工作。)
    • 这是否意味着只有可训练的参数才能存储在 GPU 中?我现在试试这个。我有一个类存储几个张量,然后我让一个实例调用 cuda()。似乎存储的张量仍在 CPU 上。现在我尝试将张量注册为其参数。它有效,但似乎真的很愚蠢。也许我应该创建一种方法将它们移动到 GPU?
    • 如果您的模型扩展了nn.Module 而您扩展了model.cuda(),例如,只有模型的参数被移动到卡中。所以,如果我得到你的问题,答案是肯定的。要包含更多张量,您需要将它们包含在参数中,例如:new_tensor = nn.Parameter(torch.zeros(10))
    猜你喜欢
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-17
    • 1970-01-01
    • 2015-09-03
    • 1970-01-01
    相关资源
    最近更新 更多