1. ホーム
  2. copy

[解決済み] Pytorchが推奨するテンソルのコピー方法

2022-10-05 20:26:10

質問

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 は、明示的に ad のどちらかを実行すると、UserWarning が表示されます。 a または d . なぜそれが好まれるのでしょうか?パフォーマンス?私は可読性が低いと主張します。

を使うことに賛成/反対する理由があれば教えてください。 c ?

どのように解決するのですか?

TL;DR

使用方法 .clone().detach() (もしくは、できれば .detach().clone() )

<ブロッククオート

最初にテンソルをデタッチしてからクローンすると、計算パスはコピーされず、逆にコピーしてから放棄されます。このように .detach().clone() の方がごくわずかに効率的です --。 pytorch フォーラム

は若干高速で、何をするのかが明確なので


使用方法 perflot を使って、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',
)