概要
よく議論されるTopicで一度は皆が疑問に思う、"PytorchかTensorFlowどっちが良いの?"について個人的な意見を述べたいと思います。PytorchとTensorflowそれぞれに良い所があり、場合によって使い分けましょうという記事が沢山あるので、今回はどちらか断言してみたいと思います。画像認識のタスクを学習し、ロボットに搭載する仮定で話します。
論文で使われいる割合
画像認識ではPytorchが圧倒的に多いです。感覚的には9割くらいかなと。基本的に開発は前に書いた人のコードを元にするので、違うライブラリーだと一から書き直さないといけないので大変です(汗)。
Third Party Library
PytorchにはTorchvision, Pytorch-Lightning, mmlabがあります。これらが優秀すぎます。比較ではないのですが、これらのライブラリーの便利さを簡単にまとめます。
Torchvisionは様々な画像認識に使える関数があるのですが、中でも学習済みモデルをcreate_feature_extractorという関数を使うとBackboneの部分として再利用出来ます。NeckはFPNをサポートしています。という事は残りはHeadだけを自分で書けばモデルが出来上がります。
Pytorch-Lightningは学習時に必要な幾つものコーディングを簡略化してくれます。使えるようになるとバグが減り、コーディングリビューがしやすくなります。
mmlabは複数のモデルをConfiguration fileから設定できます。現状、mmlab以上にデータ構造が綺麗なPerceptionのライブラリーは見たことがありません。mmlabを直接使う事も凄く便利ですし、僕はmmlabのコーディングを参考にして複数モデルかつ複数タスクを行えるPerceptionのライブラリーを作りました。
Pythonで学習したモデルをC++で実行した場合の速度
TensorflowはC++で書かれていて、それをPybind11でPythonをサポートしています。故に実行速度が早いと言われています。一方PytorchはPythonとC++は別々に書かれているので、PythonのコードをC++にexportすると多少遅いと言われています。これらの理由からTensorflowはC++でのリアルタイム実行に向いていると言われています。
しかし、実行速度を早くしたい場合は、ONNXやTensorRTのフォーマットに変換して実行します。故にどっちを使っても変換してしまえば、速度は変わらない筈です。しかも、Pytorch1.12以前のJIT Compiler(実行時用コンパイルラー)がCPUとGPUで同じnncというコンパイラーを使っていましたが、Pytorch1.12はGPUのJIT CompilerがNVIDIAが開発しているNVFuserになったことにより、処理速度が向上しました。今後もVersionが上がる毎にサポートが増えたり、より速く実行できるようになると開発者は言っていました。
余談ですが、僕はTorchScriptを使っています。理由としてはLibtorchにある関数を使えるので、前処理や後処理の部分をPytorchとほとんど同じようにコーディング出来るからです。TensorRTに関してはTorch-TensorRTを使っています。これはTensorRTのラッパーなので、TorchScriptでもTorch-TensorRTでも同じコードで実行できます。
結論
結論は研究場合も実用の場合もPytorchが良いと思います。僕がPytorch Userなので完全に贔屓しているような記事になってしまいました(汗)。実用の際はライブラリーの選択はかなり重要になるので、Tensorflowを使うメリットをかなり調べましたが、Pytorchに出来ない事が無いかなという感じです。やはり論文で使われたgithubやThird Partyが豊富な事が開発に置いて重要だと思っています。良ければコメントにどちらを使っているかとその理由を書いて頂けると、勉強になりますのでよろしくおねがいします。