推論時torch.tensor(sourceTensor)ではなくて、sourceTensor.clone().detach()を使おう

推論時torch.tensor(sourceTensor)ではなくて、sourceTensor.clone().detach()を使おう
Photo by Ashkan Forouzani / Unsplash

PyTorchのテンソル操作最適化: 警告メッセージの理解と解決

こんにちは!

Qualiteg プロダクト開発部です。

PyTorch 1.13にて、次のような警告メッセージに遭遇しました

UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.clone().detach() or sourceTensor.clone().detach().requires_grad_(True), rather than torch.tensor(sourceTensor).

この記事では、この警告の意味を解説し、修正方針についてかきたいとおもいます。

torch.tensor() よりも .clone().detach() のほうがおすすめなのか

それは、PyTorchがテンソルと自動微分(オートグラッド)をどのように扱うかに関係があります。

torch.tensor() をつかうと「勾配計算=自動微分どうするねん」っていう意思表示がハッキリしないんです。

一方clone().detach()は「勾配配計算しないよ」をあらわし、clone().detach().requires_grad_(True)は「勾配計算有効」をあらわすので、コードから意図がよみとれる&明示的に指定できる、のがポイントです。

clone().detach()では、元のテンソルとメモリを共有せず、計算グラフから切り離された新しいテンソルが作成されます。これにより、特に勾配や誤差逆伝播を扱う際に、予期せぬ動作を防ぐことができるというわけです。

推論で使うときはどう書けばいい?

結論からいうと、推論時には sourceTensor.clone().detach() をつかいましょう。

その理由は以下のとおりです

  1. 計算効率:
    推論時には通常、勾配計算は不要です。detach() を使うことで、テンソルを計算グラフから切り離し、不要な勾配計算を防ぎます。これにより、メモリ使用量が減少し、計算速度が向上します。
  2. メモリ管理
    clone() は新しいメモリ領域にデータをコピーします。これにより、元のテンソルに影響を与えることなく、安全に操作を行えます。
  3. 意図しない変更の防止
    detach() を使用することで、誤って勾配計算を行ってしまうリスクを減らせます。これは特に大規模なモデルや複雑なアーキテクチャで重要です。
  4. モデルの固定
    推論時には当然モデルのパラメータを更新したくないのでdetach() を使うことで、誤ってモデルが更新されることを防げます。

チェインしてるメソッドの詳細説明

  1. clone() メソッド:
    • 新しいテンソルを作成し、元のテンソルのデータをコピーします。
    • これにより、元のデータに影響を与えることなく安全に操作できます。
  2. detach() メソッド:
    • テンソルを現在の計算グラフから切り離します。
    • 勾配計算が不要な場合(例:推論時)に特に有用です。

まとめ

  • sourceTensor.tensor() でコピーするのはコンテクストがあいまいなので使わないようにしましょう。
  • 推論時は clone().detach() を使用します。勾配計算が不要なため、メモリ使用量を減らし、計算速度を向上させます。
  • 学習時は 勾配計算が必要な場合は、clone().detach().requires_grad_(True) を使用します。これにより、新しいテンソルで勾配計算が可能になります。

Read more

Luckfox Pico Mを外出先から使う。3,750円・64MBのLinuxボードにWireCanalで公開URLをつけるまで

Luckfox Pico Mを外出先から使う。3,750円・64MBのLinuxボードにWireCanalで公開URLをつけるまで

秋葉原で買った3,750円のLinuxボード Luckfox Pico M(RV1103・64MB・USB-Cのみ)を、Web公開用の受信ポートを追加せずにインターネット側から使えるようにするまで。SDカード書き込み、RNDIS経由のネットワーク、WireCanal無料プランでの公開、busybox initでの常駐とブラウザからのLED操作、再起動復帰(33秒)まで実測手順で解説します。

By Qualiteg プロダクト開発部
Raspberry Pi 5のWebサーバーをインターネットに公開する。ポートは開けない、WireCanalのトンネルで

Raspberry Pi 5のWebサーバーをインターネットに公開する。ポートは開けない、WireCanalのトンネルで

受信ポートを閉じたまま、Raspberry Pi 5のWebサーバーをインターネットに公開します。WireCanalのAgentをワンライナーで入れ、canalを作り、systemdで常駐化。ポート開放もルーター設定も不要で、操作はおよそ5分。再起動後の自動復活まで実測で検収しました。

By Qualiteg プロダクト開発部
Raspberry Pi 5を堅牢化する。SSH鍵認証・UFW・fail2banと、再起動でIPv6が復活する罠

Raspberry Pi 5を堅牢化する。SSH鍵認証・UFW・fail2banと、再起動でIPv6が復活する罠

セットアップ直後のRaspberry Pi 5は、パスワード認証が有効なまま、ファイアウォールなし、更新可能なパッケージ172件と無防備です。SSHの鍵認証化・UFW・fail2ban・自動更新・IPv6無効化を実コマンドと実測検収で解説します。sysctlのIPv6無効化が再起動で復活する現象と恒久対策も実機で確認しました。

By Qualiteg プロダクト開発部