import torch
from torch.autograd import Variable
a = Variable(torch.Tensor([1, 2]))
if torch.cuda.is_available():
b = a.cuda()
b_data = b.data
b_grad = b.grad
b_grad_data = b.grad.data
Se .data
e .grad
são atributos de classe, então .cuda()
pode ser mantido como propriedade para que se faça b = a.cuda
. Estou sugerindo que isso aumentaria a consistência da API, pois .cuda()
, .data
e .grad
são torch.Tensor
para que cuda() possa ser alterado para uma propriedade . Ao fazer isso, o modelo residente da GPU pode ser acessado por model.cuda
cuda
torna-se um método, pois é uma operação relativamente cara, que envolve a cópia de dados da CPU para a GPU. Enquanto grad
e data
são operações baratas ( O(1)
), que apenas recuperam referências ao tensor correspondente. Eu acho que fazer cuda
um método é razoável.
.cuda() copia os dados da CPU para a GPU. Você provavelmente não quer manter os dados na GPU o tempo todo. Isso significa que você só armazena dados na GPU quando é realmente necessário.
como mencionado por ambos os comentários acima, tornar .cuda
uma propriedade é inapropriado. Retornamos novos objetos ao referenciar .cuda()
e muita coisa está acontecendo.
Comentários muito úteis
cuda
torna-se um método, pois é uma operação relativamente cara, que envolve a cópia de dados da CPU para a GPU. Enquantograd
edata
são operações baratas (O(1)
), que apenas recuperam referências ao tensor correspondente. Eu acho que fazercuda
um método é razoável.