PyTorch でテンソルをコピーする推奨方法 質問する

PyTorch でテンソルをコピーする推奨方法 質問する

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、 はよりも明示的に優先されます。 なぜ が優先されるのでしょうか? パフォーマンスでしょうか? 読みにくくなると思います。dad

を使用する理由はありますか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',
)

おすすめ記事