web-dev-qa-db-fra.com

Pytorch 0.4.0: Il existe trois façons de créer des tenseurs sur un appareil CUDA. Y a-t-il une différence entre eux?

J'ai échoué dans la troisième voie. t3 est toujours sur CPU. Je ne sais pas pourquoi.

a = np.random.randn(1, 1, 2, 3)

t1 = torch.tensor(a)
t1 = t3.to(torch.device('cuda'))

t2 = torch.tensor(a)
t2 = t2.cuda() 

t3 = torch.tensor(a, device=torch.device('cuda'))
8
laridzhang

Les trois méthodes ont fonctionné pour moi.

En 1 et 2, vous créez un tenseur sur le processeur, puis le déplacez vers le GPU lorsque vous utilisez .to(device) ou .cuda(). Ce sont les mêmes ici.

Cependant, lorsque vous utilisez la méthode .to(device), vous pouvez explicitement dire à torch de passer à un GPU spécifique en définissant device=torch.device("cuda:<id>"). avec .cuda() vous devez faire .cuda(<id>) pour passer à un GPU particulier.


Pourquoi ces deux méthodes existent-elles alors?

.to(device) a été introduite en 0.4 car il est plus facile de déclarer la variable device en haut du code comme

device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")

et utilisez .to(device) partout. Cela facilite le passage du CPU au GPU et vice-versa

Avant cela, nous devions utiliser .cuda() et votre code aura if vérifier cuda.is_available() partout, ce qui rendait difficile le basculement entre GPU/CPU.


La troisième méthode ne crée pas de tenseur sur le CPU et copie directement les données sur le GPU, ce qui est plus efficace.

13
Umang Gupta