假设模型最初存储在CPU上,然后我想将其移动到GPU0,那么我可以这样做:
device = torch.device('cuda:0')
model = model.to(device)
# or
model.to(device)
这两行之间的区别是什么?
发布于 2020-01-02 16:04:03
没有语义上的区别。nn.Module.to
函数将模型移动到设备。
但要小心。
对于张量(documentation):
# tensor a is in CPU
device = torch.device('cuda:0')
b = a.to(device)
# a is still in CPU!
# b is in GPU!
# a and b are different
对于型号(documentation):
# model a is in CPU
device = torch.device('cuda:0')
b = a.to(device)
# a and b are in GPU
# a and b point to the same model
发布于 2020-01-02 16:12:02
引用to
上的文档:
当在图形处理器上加载经过训练和保存的模型时,只需使用model.to(torch.device('cuda'))
将初始化的模型转换为
优化模型。此外,请确保对所有模型输入使用
.to(torch.device('cuda'))
函数,以便为模型准备数据。注意,调用my_tensor.to(device)
会在GPU上返回一个新的my_tensor
副本。它不会覆盖my_tensor
。因此,请记住手动重写张量:my_tensor = my_tensor.to(torch.device('cuda'))
。
大多数情况下,在torch.nn.Module
上使用to
时,是否保存返回值并不重要,作为一种微优化,实际上最好不要保存返回值。当在torch张量上使用时,您必须保存返回值-因为您实际上正在接收张量的副本。
参考:Pytorch to()
https://stackoverflow.com/questions/59560043
复制相似问题