はじめに
最近では、Deep LearningのライブラリとしてPyTorchが利用される機会が多くなっています。私自身も以前はTensorflow/Kerasを利用していましたが、現状はPyTorchを使うことがほとんどです。
しかし、PyTorchは実装がしやすいものの、モバイルやエッジデバイスへのデプロイを考える上では不安な点が残ります。今回は、PyTorchを様々なプラットフォーム上で利用することを考えたときにどのような方法があるかを整理します。
モバイル
選択肢の整理
現在、モバイル (iOS/Android)へのデプロイを考えるときにメジャーな選択肢が3つあります。
- Core ML (Apple)
- PyTorchをonnxに変換し、onnxをcoreMLに変換する
- Tensorflow Lite (Google)
- PyTorchをonnxに変換し、Tensorflow/Keras経由でTensorflow Liteに変換する
- PyTorch Mobile (Facebook)
- PyTorchをそのまま使える
Core MLはAppleの提供する機械学習用のツールです。PyTorchは直接サポートはされていないので、変換が必要です。Appleの用意しているもので、iOS用です。そのため、Androidはサポートされません。
Tensoflow LiteはTensorflowのデプロイ用のフレームワークです。様々なプラットフォームへのデプロイを目的にしており、その中でモバイルにも対応しています。PyTorchからの変換は少し手間ですが、PyTorch->onnx->Tensorflow/Keras->Tensorflow Liteのように変換を行うことで可能です。
Pytorch MobileはPyTorchのモバイルサポートのためのフレームワークです。v1.3 (2019/10/11)からサポートされました。PyTorchユーザーとしては特別な変換を行うことなく、デプロイまで公式にサポートされながらデプロイできることはメリットです。
検討事項
素直に考えると、PyTorch Mobileを使うことになるのですが、不安要素が大きく2つあります。
1は開発する上で気になるところです。情報が少なく、問題に直面したときの解決が難しそうな印象を持っています。モバイルへのデプロイはあまり一般的なブログ記事でも取り上げられることはあまり見られないため、公式のサポートの充実度合いは特に大事だと思います。
2はより本質的な問題なのですが、他のアクセラレータの利用が難しいようです。これは直接パフォーマンスに関わるので利用する上では厳しい印象です。今後この辺りは対応されていくとは思いますが、現状としては不安要素として残ります。
一方で、Tensorflow Liteはそれらの問題を解決できます。PyTorch Mobileより早くにリリースされ、利用されることも多いでしょうし、チュートリアルも充実しています。
また、Androidでは、NNAPI、GPU、Hexagonのデリゲートをサポートし、iOSではGPUとCore MLをサポートしています。
iOSでは直接、Core MLを使うほうがパフォーマンスは出るとは思いますが、Tensorflow LiteがデリゲートとしてCore MLをサポートするのであれば、Tensorflow Liteでクロスプラットフォームに対応させるほうが管理しやすいと思います。
以上をまとめると、PyTorch Mobileは使いたいが、現状では不安要素があるため、Tensorflow Liteを使うのが無難だと思います。
エッジ
エッジデバイスでの推論向けにはモバイルよりも選択肢は多いですが、主なものは以下があります。
- PyTorch そのまま (Facebook)
- Tensorflow Lite (Google)
- PyTorchをonnxに変換し、Tensorflow/Keras経由でTensorflow Liteに変換する
- TensorRT (NVIDIA)
- NVIDIA-AI-IOT/torch2trt で変換する
- OpenVINO (Intel)
- ngeorgis/pytorch_onnx_openvinoでonnx経由で変換する
- Edge TPU (Google)
- PyTorchはGloud TPUの利用は可能だが、Local TPUはできない模様
- Tensorflow Liteへ変換する
最も楽で直接な方法はエッジ用にbuildされたPyTorchをそのまま使うことだと思います。量子化はサポートがあるので対応可能ですが、エッジ用に特別に用意されたものは特にないと思います。一方で、Tensorflow Liteはモバイルと同様にTensorflow Liteがサポートします。おそらく、速度パフォーマンスに違いが出てくるのではないかと想像します。
また、Jetson系列にデプロイするのではあれば、TensorRTは魅力的です。NVIDIAが出しているだけあって、パフォーマンスがよいです。PyTorchからTensorRTへの変換はサポートされているようで、この点も良いです。TensorflowはTensorRTのサポートも進めているようで、抜かりない感じがします。
OpenVINOはIntelの推論用のツールです。推論に特化しており、Deep Learningフレームワークで学習したモデルを変換し、利用します。Intelのハードウェアを対象にサポートしています。ラズパイでも、Intelのスティック型のデバイスを使うことで、高速な推論を行うことができます。
Edge TPUはGoogleの出すエッジでの推論用のデバイスです。Edge TPUではTensorflow Liteを使うことが想定されています。Edge TPUが搭載されたボードやUSB接続タイプがあります。Tensorflow Liteを使うのであれば有力な選択肢となります。
以上をまとめると、パフォーマンスを高めるためにはハードウェアが何かと相談しながら、PyTorchのモデルを対応する何かしらのフレームワークへ変換するのがよいと思います。
終わりに
今回はPyTorchのモデルをモバイルやエッジにデプロイするときにどのような選択肢があるかを整理しました。PyTorchは産業利用としても使えるように進化してきていると思いますが、やはりTensorflowは強いと感じました。PyTorchのモデルをonnxやTensorflow Liteの形式でも使えるように準備しておくのが無難に思います。
今回は一般的な話をしましたが、より具体の話はいずれしたいと思います。