model.to(device) 和 model=model.to(device) 有什么区别?

Obs*_*ian 10 python pytorch

假设模型原本是存储在CPU上的,然后我想把它移到GPU0上,那么我可以这样做:

device = torch.device('cuda:0')
model = model.to(device)
# or
model.to(device)
Run Code Online (Sandbox Code Playgroud)

这两行有什么区别?

you*_*hao 28

没有语义差异。nn.Module.to函数将模型移动到设备。

但要谨慎。

对于张量(文档):

# 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 
Run Code Online (Sandbox Code Playgroud)

对于模型(文档):

# 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 
Run Code Online (Sandbox Code Playgroud)

  • [更新的链接](https://pytorch.org/docs/stable/ generated/torch.nn.Module.html#torch.nn.Module.to)。对于“nn.Module”,“此方法就地修改模块。” (3认同)

Man*_*ano 10

引用文档to

在 GPU 上加载经过训练并保存在 GPU 上的模型时,只需使用 将初始化模型转换为 CUDA 优化模型 model.to(torch.device('cuda'))。此外,请务必.to(torch.device('cuda'))在所有模型输入上使用该 函数来为模型准备数据。请注意,调用会my_tensor.to(device) 返回my_tensorGPU 上的新副本。它不会覆盖 my_tensor. 因此,请记住手动覆盖张量: my_tensor = my_tensor.to(torch.device('cuda')).

大多数情况下,to在 a 上使用时torch.nn.Module,是否保存返回值都没有关系,作为一种微优化,实际上最好不保存返回值。在 Torch 张量上使用时,您必须保存返回值 - 看到您实际上正在接收张量的副本。

参考:Pytorch to()