Theano、TensorFlow、Torch、MXNetから最近人気のPyTorchなど、ディープラーニングフレームワーク間の比較は常に注目を集めるホットな話題です。しかし、実際にユーザーがどう感じているかご存知ですか?最近、Reddit ユーザーの cjmcmurtrie が「PyTorch vs. TensorFlow」というタイトルのディスカッション スレッドを投稿し、これら 2 つの人気フレームワークの利点を理解したいと考えていました。
Torch7 から TensorFlow にはまだ移行していません。 TensorFlow をいろいろ試してみましたが、Torch7 の方が直感的だと感じました (まだ十分に試していないだけでしょうか)。私も PyTorch を少し試してみたので、まずはそれがどのように動作するか確認してみることにしました。
PyTorch を数週間使用した後、少なくとも私が興味を持っているプロジェクトに関しては、今すぐに TensorFlow に移行する必要はないと思います。 PyTorch でカスタム モジュールを書くのは非常に簡単です。そして、その動的なグラフ構築により、これまで実装するために夜遅くまで起きていなければならなかったこと(または待機リストに載っていたこと)に対して、多くの新しいアイデアが生まれました。 PyTorch は機械学習開発者にとって素晴らしいツールセットだと思います。また、TensorFlow のコミュニティ リソースの方がはるかに強力であることもわかっていますが、コードを書き直したり、既存のアーキテクチャのチュートリアルを読んだりするのではなく、まったく新しいプロジェクトを開発したい場合、コミュニティはあまり役に立たない可能性があります。
この Reddit の投稿が公開された後、多くの機械学習の研究者や開発者の注目を集め、彼らはこの投稿をフォローして自分たちのアイデアや経験について語りました (PyTorch や TensorFlow だけでなく、他のツールについても議論されました)。
軽量です。
現在は Python です。
計算を明示的に制御できます。コードを「助ける」ほど賢くしたり、スピードアップしようとするコンパイラは存在しません。実際、ほとんどのコンパイラはデバッグ中に多くの問題を引き起こします。
GPU カーネル呼び出しの上にいくつかの (解釈可能な) 抽象化レイヤーのみを有効にし、これがまさに高パフォーマンスを保証します。
個人的な好みかもしれませんが、私は抽象的なものに対してある種の強迫性障害を感じます。大変な仕事をしなければならないときはいつも緊張します。自分の将来が明らかになると、逃れられない耐え難い痛みを感じるからです。この感覚は、内部で比較的単純なことが起きているはずのほとんどの場合に特に強くなります。
デバッグは、特定のコード内の特定の行で失敗するため(大きな Graph オブジェクトや生成された Graph オブジェクトを使用する sess.run() から離れた場所ではなく)、より簡単になります。スタック トレースは、「バグを見つけよう!」という垂直スクロール ゲームをプレイするのに 3 つの画面を埋め尽くすほどの大きさにはなりません。
コンパイル時間はありません。 Theano ユーザーがこれをどう処理するのか理解できません。もっと忍耐強くならなければなりません。
勾配を直接操作できるため、明らかにいくつかのことがより簡単かつ自然になります (バックプロパゲーション中の勾配クリッピングや、最近の Shake Shake reg コマンドのようなさまざまな「壊れたバックプロパゲーション」のアイデアなど。実際、 stop_gradient を使用してソリューションをハックできると思います)。
動的グラフィックスのサポートは、後から考えたものではなく、トップダウンの原則に基づいて根本から設計されました。そして、大規模な NLP やニューラル モジュール ネットワークなどの、より動的なグラフも登場するでしょう。
コードをインデントしたり肥大化させたりする明示的なセッション オブジェクトはありません。
正しく行われる抽象化は、生の numpy -> テンソル (ただし、GPU 上の生の numpy はおそらくディープラーニングについて何も知りません!) -> 変数 (ディープラーニングについて知っている)、およびモジュールや Optim などです。
動的計算により多くのことが容易になります。たとえば、seq2seq + attention ニューラル変換は keras + tf では実装が難しいですが、PyTorch では簡単に実行できます。
標準の PyThon ツールを使用できるため、デバッグが簡単になります。
PyTorch を使用するとカスタム実装が容易になるため、アルゴリズムに集中する時間を増やすことができ、多くの場合、パフォーマンスの大幅な向上につながります。
マルチ GPU をシンプルでわかりやすいものにします。
Torch-vision を使用すると、画像の読み込みと変換が簡単になります。
PyTorch は拡張機能を提供します。一般的に、機能強化の実装にはそれほど多くのリソースが必要ではなく、RL に呼び出す組み込み関数がいくつかあると便利です。
私が遭遇したバグや問題は、PyTorch チームによってすぐに対処され、通常はその日のうちに修正されるか、回避策や問題追跡ツールが提供されました。
PyTorch はすぐに使用でき、私の現在のプロジェクトでは、単一 GPU のトレーニング時間は theano+lasagne よりも 100% 高速です。私はテストしましたが、CIFAR100 で 100% 正確に実行すると、(最も単純なケースでは) 5 分/エポックから 2.5 分/エポックになり、場合によっては 2 分/エポック (つまり、2 倍の速さ) まで短縮されます。