HELLO CYBERNETICS

深層学習、機械学習、強化学習、信号処理、制御工学、量子計算などをテーマに扱っていきます

PyTorch1.3 リリース【プロダクト側も本格始動】

 

 

follow us in feedly

はじめに

これまでPyTorchといえば柔軟にネットワークが変更でき、素早いプロトタイプの実験が可能な研究志向の強いDeepLearningフレームワークという印象が強かったです。 しかし今回v1.3をリリースし、プロダクト側の強化の姿勢を大きく見せてきたように思います

github.com

Mobile Support

これまではTFliteがモバイルサポートで突出している状況でしたが、PyTorchが公式にモバイルのサポートを提供し始めました。

今回のアップデートで、モバイルでTorchScript推論が動くようにサポートされました。TorchScriptはPyTorchで書いたコードをtorch.jitにより変換することで得ることができます。これはC++フロントエンドで読みだして直接推論に使うことができましたが、今回AndroidやiOSで動作するビルド済のLibTorch(C++バージョンのPyTorch)が提供されるようです。また、モデルの読み込みや呼び出しなどの機能を持つJavaラッパー(Android用)の提供やARM CPUで最適化されたfp32やint8演算子の実装もあるようです。

これでPyTorchでプロトタイプの作成を実施し、torch.jit でTorchScriptを作成すれば、それをそのままモバイルで利用できるようなエコシステムが提供されるようになってきたと言えるでしょう。

ここらへんはTensorFlowの独壇場的な雰囲気だっただけに衝撃的です。

Quantization support

もう1つ重要なのが量子化です。通常、ディープラーニングのモデルはモバイルや組み込みでは少々荷が重いような大きなサイズになっていることが多いです。 その場合、パラメータを量子化するなどを行い、性能に影響がない程度に軽くするということが必要になります。

今回のアップデートでは様々な量子化手法が提供されるようになりました。

CNNで最も一般的な演算子の8ビット量子化実装もサポートしている他、 LSTMの線形量子化のために、量子化パラメータを計算するメソッドのサポートもあるようです。また、学習済モデルを量子化するのではなく、組み込みやモバイル前提で「量子化されたときに性能が落ちないように、量子化状態を模倣する学習(quantization aware training)」もサポートされるようです。

C++ Frontend Improvements

PyTorchのC++バージョンであるLibTorchの強化もなされています。 通常はPythonで学習を実施し、デプロイ時にC++などのより低レベルな言語で利用できる形に変換するというのが主流です。

しかし、LibTorchではほとんどPyTorchと変わらぬ使いやすいAPIのまま、C++で学習から推論まで一気通貫で実施できるようなフロントエンドを提供しようとしています。

ONNX Exporter Improvements

ONNXは様々なフレームワークが混在する中、共通のモデルの記述フォーマットを提供しています。言い換えればモバイルや組み込みがONNXとのインターフェースを提供しさえすれば、いろいろなフレームワークで作成されたモデルが、ONNXを通して利用可能になるということです。

TensorFlowは独自でエコシステムを構築していますが、多くのフレームワークはONNXを介する方針を持っています。PyTorchも(今回のアップデートで自身のエコシステムを拡張しましたが)ONNX対応を怠っておりません。

PyTorch 1.3では、ONNX IR v4セマンティクスでグラフをエクスポートするためのサポートを追加し、標準設定としました。 ONNX 1.6で最近リリースされたONNX Opset 11とのテスト状況も良好だそうです。 Opset 11のカバレッジは、次のリリースでさらに強化すると宣言しています。

また、約20の新しいPyTorch演算のエクスポートを有効にしており、PyTorchの細かい操作もそのまま変換できるように対応が進んでいるようです。特にモバイルや組み込みでの応用が盛んと思われる画像認識モデルのエクスポートを有効にすることに重点を置いているようです。特にTorchvisionbに含まれているモデルがそのまま使えるように整備していく模様です。

所感

TF2.0が出現し、使いやすさという点でTFがついにPyTorchに追いつきました(個人的にはTFのほうが使いやすいと感じるくらい)。 そうなるとエコシステムの強いTFがユーザーを取り戻すのかと思いましたが、PyTorchもプロダクト側の強化を強めて、がっちりユーザーを逃さないつもりのようです。

正直学習モデルを作って評価するという研究の段階であれば、どちらでもいいし、正直、低レベル周りのことなどどうでも良いのです。しかしこれを社会に実装していこうとなると、今回のアップデートでカバーされている範囲がむしろ主戦場になってきます。

ONNXに対応するつもりがなさそうなTFがガラパゴス化しないか不安なところですが、このまま切磋琢磨して便利になっていくと嬉しいですね。 個人的にはPyTorchのC++バージョンのLibTorchが素晴らしくPyTorchなAPIを持っていて、仮にエッジで学習までやりたいというような状況になったときに、もはやこれ以外の選択肢が無いのではないか…?と思いました。