PyTorch と Torch の関係性(Torch のモデルファイルは PyTorch では使えない?)
モデルファイル(重みファイル)の互換性(の低さ)
最近、弊社ではニューラルネット向けのライブラリとして PyTorch をメインで使っています。 TensorFlow, Keras も使いますが、 PyTorch はデバッグがしやすいので気に入っています。
この種のライブラリを使っていると、必ず他人が作ったニューラルネットを試したくなるときがあります。
で、大抵の場合ほとんどのコスト(時間、お金、[時間/空間]計算量)はデータの準備やニューラルネットの訓練に費やされるので、できることなら訓練を実施する前に性能を評価したいものです。
作者がモデル(ネットワークの重み)を公開している場合、これを使いたいと思うことが普通です。これらのファイルをモデルファイルや重みファイルと呼びます。
残念ながら、大半のライブラリの間で、モデルファイルには互換性がありません。 ONNX や DLPack などの相互運用性を高めるための枠組みも登場しつつありますが、まだ普及しているとは言い難いです。
しかし、 Torch と PyTorch は開発チームも同じだし、名前もほぼほぼ同じなのだから、多少なりとも互換性がありそうな気がします。
幸い、その答えはイエスです。残念なのは、そこに「極めて限定的に」という条件が付くことです。
Torch / PyTorch の重みファイル
Torch のモデルファイルには、通常 ".t7" という拡張子が付けられます。 PyTorch では ".pth" とするのが通例です。
もちろん、拡張子はその使途を説明しているだけで、それ以上の意味はありません。どんなファイルにも好きな拡張子をつけることができます(これを読むような人には当然かもしれませんが念のため: 拡張子とファイルの内容・内部構造には何の関係性もありません)。
そして、 ".t7" と ".pth" の内部構造は異なります。私もその詳細まで深掘りはしないことにしましたが、試してみればロードできないことはすぐにわかります。
それでも、一方から他方に変換してくれるコンバータくらいはあっても良いはずです。インターネットを検索すると、そういう GitHub リポジトリがいくつか見つかります。残念ながら、このスクリプトも動かない場合が多いです。このリポジトリの Issue を見ると、同様の報告がたくさん見つかります。
どういう場合に動かないかというと、「カスタムのモジュールを使用している場合」です。カスタムのモジュールを書くことはむしろ普通なので、たいていの場合は変換はできない、と理解するのが妥当そうです。
また、 "torch.util.load_lua" というユーティリティ関数を使う方法も見つかります。残念ながら、この機能にも似たような制約があって、かつ既に廃止となることが決まっているので、あまり頼りにできなさそうです。
Torch と PyTorch の関係
Torch と PyTorch の関係性はどうなっているのでしょうか。
公式のフォーラムでの回答などから考えると、 PyTorch は、 Torch の一部や 移植版ではなく、実際のところは「同じ C++ のライブラリを使っている別のソフトウェア」と捉えるのが妥当な印象です。
ただ、名前がすごく似ているのと、開発元が同じなので移植か何かのような印象を受けやすい、ということだと思います。
図でまとめてみます。
おわりに
というわけなので、私は Torch のモデルファイルを PyTorch で読み込むことは諦めました。
そもそも、この分野のフレームワーク自体かなり過渡期的状況にあることと、実際問題として Torch で書かれたプロジェクトの多くが PyTorch に移行して戻ってきていないことや、開発コミュニティも「 Torch のメンテナンスも続ける」くらいのことしか言っていないことから、今後あまり Torch が使われることはないように思われます。
そういう意味では、この記事はかなり賞味期限の短いものになると思います。
が、この関係性はあまりしっかり説明されている情報源がなかったので、誰かがまとめなければならないと思ってまとめました。ハマーン・カーン並みの使命感ですね。
それでは!
この記事が気に入ったらサポートをしてみませんか?