PyTorchでテンソルのコピーを作成する方法はいくつかあるようです。
y = tensor.new_tensor(x) #a
y = x.clone().detach() #b
y = torch.empty_like(x).copy_(x) #c
y = torch.tensor(x) #d
b
またはのいずれかを実行すると UserWarning が表示されるためa
、 はよりも明示的に優先されます。 なぜ が優先されるのでしょうか? パフォーマンスでしょうか? 読みにくくなると思います。d
a
d
を使用する理由はありますかc
?
ベストアンサー1
要約
使用.clone().detach()
(または推奨.detach().clone()
)
最初にテンソルをデタッチしてからクローンすると、計算パスはコピーされませんが、その逆の場合はコピーされてから破棄されます。したがって、
.detach().clone()
わずかに効率が上がります。--pytorch フォーラム
やや高速で、動作が明確だからです。
使用perfflot
、PyTorch テンソルをコピーするさまざまな方法のタイミングをプロットしました。
y = tensor.new_tensor(x) # method a
y = x.clone().detach() # method b
y = torch.empty_like(x).copy_(x) # method c
y = torch.tensor(x) # method d
y = x.detach().clone() # method e
x 軸は作成されたテンソルの次元、y 軸は時間を示します。グラフは線形スケールです。明らかに、またははtensor()
他new_tensor()
の 3 つの方法に比べて時間がかかります。
注記:複数回実行した結果、b、c、e のいずれの方法でも最短時間になる可能性があることに気付きました。a と d についても同様です。ただし、b、c、e の方法は、a と d よりも一貫して短い時間になります。
import torch
import perfplot
perfplot.show(
setup=lambda n: torch.randn(n),
kernels=[
lambda a: a.new_tensor(a),
lambda a: a.clone().detach(),
lambda a: torch.empty_like(a).copy_(a),
lambda a: torch.tensor(a),
lambda a: a.detach().clone(),
],
labels=["new_tensor()", "clone().detach()", "empty_like().copy()", "tensor()", "detach().clone()"],
n_range=[2 ** k for k in range(15)],
xlabel="len(a)",
logx=False,
logy=False,
title='Timing comparison for copying a pytorch tensor',
)