私は3番目の方法で失敗しました。 t3
はまだCPU上にあります。なぜだかわかりません。
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'))
3つの方法はすべて私にとってうまくいきました。
1と2では、CPUでテンソルを作成し、.to(device)
または.cuda()
を使用するときにテンソルをGPUに移動します。ここでも同じです。
ただし、.to(device)
メソッドを使用する場合、device=torch.device("cuda:<id>")
を設定することにより、特定のGPUに移動するようにトーチに明示的に指示できます。 .cuda()
を使用すると、特定のGPUに移動するために.cuda(<id>)
を実行する必要があります。
なぜこれらの2つの方法が存在するのですか?
.to(device)
は0.4で導入されました。コードの先頭でdevice
変数を宣言する方が簡単だからです。
device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")
どこでも.to(device)
を使用します。これにより、CPUからGPUに、またはその逆に切り替えるのが非常に簡単になります。
その前に、.cuda()
を使用する必要があり、コードでif
のcuda.is_available()
をチェックする必要があるため、GPU/CPUを切り替えるのが面倒でした。
3番目の方法は、CPUにテンソルを作成せず、データをGPUに直接コピーします。これはより効率的です。