PyTorch でインプレース操作を処理する方法を考えていました。私が覚えているように、autograd でのインプレース操作の使用には常に問題がありました。
そして、実際には、以下のこのコードが機能することに驚いています。テストしていませんが、このコードは version でエラーを発生させたと思います0.3.1
。
基本的に私がしたいのは、テンソルベクトルの特定の位置を特定の値に設定することです:
my_tensor[i] = 42
作業例コード:
# test parameter a
a = torch.rand((2), requires_grad=True)
print('a ', a)
b = torch.rand(2)
# calculation
c = a + b
# performing in-place operation
c[0] = 0
print('c ', c)
s = torch.sum(c)
print('s ', s)
# calling backward()
s.backward()
# optimizer step
optim = torch.optim.Adam(params=[a], lr=0.5)
optim.step()
# changed parameter a
print('changed a', a)
出力:
a tensor([0.2441, 0.2589], requires_grad=True)
c tensor([0.0000, 1.1511], grad_fn=<CopySlices>)
s tensor(1.1511, grad_fn=<SumBackward0>)
changed a tensor([ 0.2441, -0.2411], requires_grad=True)
だから明らかにバージョンで0.4.1
。これは、警告やエラーなしで問題なく機能します。
ドキュメントのこの記事を参照してください: autograd-mechanics
autograd でインプレース操作をサポートすることは困難な問題であり、ほとんどの場合、その使用をお勧めしません。Autograd の積極的なバッファの解放と再利用により、非常に効率的になり、インプレース操作によって実際にメモリ使用量が大幅に削減されることはほとんどありません。メモリ負荷が高い環境で操作していない限り、それらを使用する必要はないかもしれません。
ただし、機能する場合でも、ほとんどの場合、インプレース操作の使用は推奨されません。
だから私の質問は:
インプレース操作の使用はパフォーマンスにどの程度影響しますか?
テンソルの 1 つの要素を特定の値に設定したい場合に、インプレース操作を使用して回避するにはどうすればよいですか?
前もって感謝します!