PyTorch:tensor.cuda() 和 tensor.to(torch.device("cuda:0")) 有啥区别?
Posted
技术标签:
【中文标题】PyTorch:tensor.cuda() 和 tensor.to(torch.device("cuda:0")) 有啥区别?【英文标题】:PyTorch: What is the difference between tensor.cuda() and tensor.to(torch.device("cuda:0"))?PyTorch:tensor.cuda() 和 tensor.to(torch.device("cuda:0")) 有什么区别? 【发布时间】:2020-11-04 12:51:04 【问题描述】:在PyTorch中,以下两种发送张量(或模型)到GPU的方法有什么区别:
设置:
X = np.array([[1, 3, 2, 3], [2, 3, 5, 6], [1, 2, 3, 4]]) # X = model()
X = torch.DoubleTensor(X)
Method 1 | Method 2 |
---|---|
X.cuda() |
device = torch.device("cuda:0") X = X.to(device)
|
(我真的不需要详细解释后端发生的事情,只是想知道它们是否本质上都在做同样的事情)
【问题讨论】:
【参考方案1】:两者没有区别。
pytorch 的早期版本有 .cuda()
和 .cpu()
方法将张量和模型从 cpu 移动到 gpu 并返回。但是,这使得代码编写有点麻烦:
if cuda_available:
x = x.cuda()
model.cuda()
else:
x = x.cpu()
model.cpu()
后来的版本引入了.to()
,它基本上以一种优雅的方式处理所有事情:
device = torch.device('cuda') if cuda_available else torch.device('cpu')
x = x.to(device)
model = model.to(device)
【讨论】:
【参考方案2】:它们的语法略有不同,但they are equivalent:
⠀ | .to(name) | .to(device) | .cuda() |
---|---|---|---|
CPU | to('cpu') |
to(torch.device('cpu')) |
cpu() |
Current GPU | to('cuda') |
to(torch.device('cuda')) |
cuda() |
Specific GPU | to('cuda:1') |
to(torch.device('cuda:1')) |
cuda(device=1) |
注意:当前cuda设备默认为0
,但可以用torch.cuda.set_device()
设置。
【讨论】:
以上是关于PyTorch:tensor.cuda() 和 tensor.to(torch.device("cuda:0")) 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
Pytorch / numpy / python高效插值损坏的数据
『PyTorch』第五弹_深入理解Tensor对象_上:初始化以及尺寸调整
PyTorch:卷积/padding/pooling api