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'))
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.