web-dev-qa-db-ja.com

Pytorch 0.4.0:CUDAデバイスでテンソルを作成するには3つの方法があります。それらの間にいくつかの違いはありますか?

私は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'))
8
laridzhang

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()を使用する必要があり、コードでifcuda.is_available()をチェックする必要があるため、GPU/CPUを切り替えるのが面倒でした。


3番目の方法は、CPUにテンソルを作成せず、データをGPUに直接コピーします。これはより効率的です。

13
Umang Gupta