87.1K Views
February 14, 22
スライド概要
PyTorchやTensorFlowなどの各種主要Machine Learningフレームワークへのロックインを回避しつつ、試行回数を増やし、コストを抑え、素早くデバイスシフトして運用するための手段として、エッジデバイス向けの効率的なモデル変換と量子化のワークフローについてご紹介します。
Hobby Programmer. Caffe, Tensorflow, NCS, RaspberryPi, Latte Panda, ROS, DL, TPU, OpenVINO. Intel Software Innovator. The remarks are my personal opinion.
エッジ推論のための各種フレームワー ク間のディープラーニングモデル変換 と量子化 株式会社サイバーエージェント AI Lab リサーチエンジニア 兵頭 亮哉
兵頭 亮哉 (Katsuya Hyodo / a.k.a PINTO) • 株式会社サイバーエージェント AI Lab HCIチーム リサーチエンジニア • 接客対話エージェントの研究・開発 • 大阪大学大学院基礎工学研究科 招聘研究員の方々の開発面をサポート Twitter GitHub Discord • 対象領域は HCI/HRI/インタラクション/対話システム/機械学習/画 像処理/自然言語処理 @PINTO03091 @PINTO0309 @PINTO @PINTO @PINTO0309 2
学習 変換 推論 3
変換 学習 推論 4
ディープラーニングの 現状の課題感
1. フレーム ワークが乱立 6
TensorFlow 2. 実装し易さ VS 展開・最適化 のし易さ PyTorch 研究 実装 7
3. 相互運用 性の不足 8
主要推論フレームワークの特徴
PyTorch • Define by Run • Numpy の構文に似ていて実装が理解しやすい • 複数種類のCUDA環境に対応したインストーラが 配布されている • TorchScript • モバイル環境での実行サポート (iOS / Android) 引用元: http://horace.io/pytorch-vs-tensorflow/ • ONNXフォーマットへのエクスポート • 実装の自由度が高い • 研究での使用率が高く見える • 「PyTorch」「TensorFlow」に言及された論文数の 推移 • Timm - PyTorch Image Models • Serving – PyTorch Hub • 2021年07月13日現在:42 種類 10
TensorFlow • Define by Run (v2.x 以降) • 豊富な推論最適化環境 • TPU / EdgeTPU • Serving • マイコン • TensorFlow Lite • TensorFlow Lite for Microcontrollers • Serving – TF Hub • 2021年07月13日現在:889 種類 11
Intel® Distribution of OpenVINO™ Toolkit • モデルの最適化と推論に特化 • Intel のハードウェア上での推論性能が極めて高い • CPU ※CPU推論最強 • iGPU • Myriad • FPGA • INT8量子化・推論対応 ※Gen.10 CPU以降 • Caffe, MXNet, ONNX, TensorFlow, Kaldi からのモデル変換と 最適化が可能 • OpenCVと融合 • open_model_zoo • 2021年07月13日現在:269 種類 12
ONNX (onnxruntime) • Open Neural Network Exchange • 読み込みと推論のロジックがとても簡単 • フレームワークのバージョンに合わせてOpsetが選択可能 • Protocol Buffer形式 • ONNX Model Zoo • 2021年07月13日現在:38 種類 13
TensorRT • NVIDIAのGPUに最適化 • FP16 / INT8量子化対応 • SSD300 + INT8 で 2,530 FPS 超高性能 • Jetson / GeForce / Tesla / Quadro / TITAN • open_model_zoo • • 2021年07月13日現在:16 種類 2018年から3年間アップデートなし 14
CoreML • モデルの最適化と推論に特化 • Apple のハードウェア上での推論に最適化 • FP16 / 1bit ~ 8bit 量子化・推論対応 • 公式 Core MLモデル • 2021年07月13日現在:11 種類 • Awesome-CoreML-Models • 2021年07月13日現在:35 種類 15
利用者目線での期待
1. 大手企業間の歩み寄りのスピード感を待っていられない ◼ 今使いたい ◼ 見込みが薄ければすぐに次を試したい ◼ 研究者が使用したフレームワークによらずあらゆる環境/デバイス上で実装を試したい 2. 新しいアイデア・論文が大量に公開され続ける状況への素早い対応 ◼ ひとつのモデルの再実装やリトレーニングのコストは下げたい ◼ 課題解消見込み高低の判断を短スパン・高サイクルで回したい ◼ State of the Art なモデルを手元のフレームワークですぐに試したい ◼ フレームワークロックイン・デバイスロックインを回避したい 3. トレーニングコード非公開のパブリックライセンスのモデルも流用したい 例1)open_model_zoo – Apache 2.0 例2)TF Hub の tflite のみ公開されているモデル – Apache 2.0 例3)MediaPipe の tflite のみ公開されているモデル - Apache 2.0 17
モデル変換の隙間を埋める
• 公式のエンジニアが作ってくれないものは自分で作る 1. 低レベルなコンパイラレベルの共通化や最適化は優秀な公式のエンジ ニアに任せる 2. 我々の手でも高レベルのAPIを通じてフレームワーク間でモデルを簡 単に流用できるようにする 3. 公式が解消してくれない問題を自力で解消・回避する 4. 変換フローが存在しないところには新たな変換フローを作る 5. ストレスを感じない作業時間は5分~10分 19
• 公式のエンジニアが作ってくれないものは自分で作る 1. 低レベルなコンパイラレベルの共通化や最適化は優秀な公式のエンジ ニアに任せる 2. 我々の手でも高レベルのAPIを通じてフレームワーク間でモデルを簡 単に流用できるようにする POINT 3. 公式が解消してくれない問題を自力で解消・回避する 4. 変換フローが存在しないところには新たな変換フローを作る 5. ストレスを感じない作業時間は5分~10分 20
• 自作ツールで新たに補う変換フロー 1. TensorFlow Lite (tflite) -> OpenVINO (.xml / .bin) 2. TensorFlow Lite (tflite) -> TensorFlow (saved_model, pb, hdf5) 3. TensorFlow Lite (tflite) -> JSON 4. JSON -> TensorFlow Lite (tflite) 5. OpenVINO (.xml / .bin) -> TensorFlow, TensorFlow Lite, ONNX, TF-TRT, CoreML 6. TensorFlow (saved_model) -> TensorFlow (pb) 7. TensorFlow (pb) -> TensorFlow (saved_model) 8. ONNX -> TensorFlow (saved_model, pb) ※公式ツールを超える最適化 9. ONNX -> JSON 10.JSON -> ONNX 21
• モデル変換用の3つのツール onnx2json json2onnx tflite2tensorflow openvino2tensorflow 22
• 自作ツールで新たに補う変換フロー tflite2tensorflow 1. TensorFlow Lite (tflite) -> OpenVINO (.xml / .bin) 2. TensorFlow Lite (tflite) -> TensorFlow (saved_model, pb, hdf5) 3. TensorFlow Lite (tflite) -> JSON 4. JSON -> TensorFlow Lite (tflite) 5. OpenVINO (.xml / .bin) -> TensorFlow, TensorFlow Lite, ONNX, TF-TRT, CoreML 6. TensorFlow (saved_model) -> TensorFlow (pb) 7. TensorFlow (pb) -> TensorFlow (saved_model) 8. ONNX -> TensorFlow (saved_model, pb) ※公式ツールを超える最適化 9. ONNX -> JSON 10.JSON -> ONNX 23
• 自作ツールで新たに補う変換フロー 1. TensorFlow Lite (tflite) -> OpenVINO (.xml / .bin) openvino2tensorflow 2. TensorFlow Lite (tflite) -> TensorFlow (saved_model, pb, hdf5) 3. TensorFlow Lite (tflite) -> JSON 4. JSON -> TensorFlow Lite (tflite) 5. OpenVINO (.xml / .bin) -> TensorFlow, TensorFlow Lite, ONNX, TF-TRT, CoreML 6. TensorFlow (saved_model) -> TensorFlow (pb) 7. TensorFlow (pb) -> TensorFlow (saved_model) 8. ONNX -> TensorFlow (saved_model, pb) ※公式ツールを超える最適化 9. ONNX -> JSON 10.JSON -> ONNX 24
• 自作ツールで新たに補う変換フロー 1. TensorFlow Lite (tflite) -> OpenVINO (.xml / .bin) 2. TensorFlow Lite (tflite) -> TensorFlow (saved_model, pb, hdf5) 3. TensorFlow Lite (tflite) -> JSON 4. JSON -> TensorFlow Lite (tflite) 5. OpenVINO (.xml / .bin) -> TensorFlow, TensorFlow Lite, ONNX, TF-TRT, CoreML 6. TensorFlow (saved_model) -> TensorFlow (pb) 7. TensorFlow (pb) -> TensorFlow (saved_model) 8. ONNX -> TensorFlow (saved_model, pb) ※公式ツールを超える最適化 onnx2json json2onnx 9. ONNX -> JSON 10.JSON -> ONNX 25
tflite2tensorflowによるモデ ルの変換と最適化
tflite2tensorflowの実装(1) • Float32 / Float16 の .tflite から最適化済みの Float32 tflite, Float16 tflite, Weight Quantization tflite, INT8 Quantization tflite, Full Integer Quantization tflite, EdgeTPU用tflite, TFJS, TF-TRT, CoreML, ONNX, Myriad Inference Engine Blob (OAK用) を自動生成 • TensorFlow Datasets の自動ダウンロードと自動量子化キャリブレーション • Numpyバイナリ形式のデータセットを使用した自動量子化キャリブレーション • TPU / EdgeTPU が対応できないオペレーションを自動置換 1. HardSwish 2. ResizeBilinear 3. ResizeNearestNeighbor • Swish と HardSwish をオプションで自動置換 27
tflite2tensorflowの実装(2) • 活性化関数の PReLU と Minimum / Muximum をオプションで自動置換 • OpenVINO の Interpolate (Resize動作に該当) の挙動問題を自動修正 • MediaPipe のカスタムオペレーション MaxPoolingWithArgmax2D, MaxUnpooling2D, Convolution2DTransposeBias を他のフレームワークで推論可 能な標準オペレーションへ自動置換 • TensorFlow Lite の特殊カスタムオペレーション TFLite_Detection_PostProcess を他のフレームワークで推論可能な標準オペレーションへ自動置換 • TensorFlow の Flexオペレーションを他のフレームワークで推論可能な標準オペレー ションへ自動置換 • .tflite のバイナリファイルからプレーンテキストの .JSON を自動生成 28
tflite2tensorflowの実装(3) • 変換過程で出力されたJSONファイルをエディタで編集することでモデル構造を自由 に加工 1. オペレーションの追加・削除 2. 重みや固定パラメータの追加・変更・削除 3. モデル全体を軽量化するためのオペレーション接続情報の改造 ※オペレーションの使い回し • 量子化時の正規化式をツール実行パラメータで外部から指定 • TensorFlow をカスタムビルド ※カスタムオペレーションの自力実装 • TensorFlow Lite をカスタムビルド ※カスタムオペレーションの自力実装 • 最新のオペレーションへの迅速な追随 • 全ての環境を Docker Container にインテグレートして Docker Hub へコミット 29
tflite2tensorflow 30
tflite2tensorflowの概観 Pull https://hub.docker.com/repository/docker/pinto0309/tflite2tensorflow Run • • • • • • • • OpenVINO TensorFlow TensorFlow Lite ONNX TensorRT TensorFlow.js tflite2tensorflow xhost : Convert • • • • • • • • tflite saved_model pb onnx json / bin mlmodel xml / bin blob 31
tflite2tensorflowの動作サンプル https://github.com/PINTO0309/tflite2tensorflow#tflite2tensorflow 32
tflite2tensorflowの内部動作 1.緩く変換 外部ツール フォーマット 変換フロー tflite flatc json pb saved_model モデルの 自動最適化と改造 33
tflite2tensorflowの内部動作 2.各種モデルへ一斉変換 外部ツール フォーマット 変換フロー tflite TensorFlow Model Optimizer FP16/INT8 tflite FP32/FP16 IR flatc json pb tensorflowonnx tfjsconverter tensorrt. converter ONNX FP32/FP16 TFJS FP32/FP16 TF-TRT saved_model coremltools myriad_ compile CoreML Myriad Blob 34
tflite - JSON ### Reverse transform tflite from JSON 編集OK $ ./flatc -o . -b ./schema.fbs xxxx.json JSON to tflite tflite JSONファイルを加工して "name" を 変更したりレイヤーを更新・削除可能 ◼ flatc コマンドで json から tflite のバ イナリを再生成可能 ◼ 35
openvino2tensorflowによる モデルの変換と最適化
Alexey氏とのやりとり • Is there an easy way to convert ONNX or PB from (NCHW) to (NHWC)? #15 https://github.com/PINTO0309/PINTO_model_zoo/issues/15 37
openvino2tensorflowの実装 • tflite2tensorflowの実装(1)~(3)に加えてさらなる特殊変換に対応 • NCHW形式 から NHWC形式 へのクリーンな自動変換 1. モデル構造と重みをすべて読み出して機械的にNHWCへ転置 2. onnx-tensorflow のようにゴミTransposeが大量に挿入されないようにチューニング • 重みや固定パラメータを設定ファイルで外挿して書き換え • 重みや固定パラメータを抽出してNumpyファイル化 1. 手作業による自由な重み・パラメータの加工 2. 加工済みの重み・パラメータを再取り込み 38
openvino2tensorflow 39
openvino2tensorflowの概観 Pull Run https://hub.docker.com/repository/docker/pinto0309/openvino2tensorflow • • • • • • • OpenVINO TensorFlow TensorFlow Lite ONNX TensorRT TensorFlow.js openvino2tensor flow • xhost : Convert • • • • • • • • tflite saved_model pb onnx json / bin mlmodel xml / bin blob 40
openvino2tensorflowの動作サンプル https://github.com/PINTO0309/openvino2tensorflow#openvino2tensorflow 41
openvino2tensorflowの内部動作 1.各種モデルからOpenVINO変換 フォーマット 外部ツール 変換フロー TensorFlow saved_model pb PyTorch ONNX Model Optimizer MXNet params json Caffe caffemodel prototxt IR xml / bin 42
openvino2tensorflowの内部動作 2.各種モデルへ一斉変換 外部ツール フォーマット 変換フロー IR xml / bin saved_model TensorFlow FP16/INT8 tflite ◼ 最適化イメージ https://github.com/PINTO0309/openvino2tensorflow#8-model-structure tensorflowonnx tfjsconverter tensorrt. converter ONNX FP32/FP16 TFJS FP32/FP16 TF-TRT coremltools myriad_ compile CoreML Myriad Blob 43
IR - xml / bin 編集OK ◼ XMLファイルを加工してレイヤーの追 加・更新・削除・使い回しが可能 ◼ 重み(Const) の使い回しをさせモデル 全体の若干の軽量化が可能 ◼ 重み(Const) の変換のタイミングで強 制的に別の値を差し込んで置き換えるこ とが可能 44
IR - 重みや固定パラメータの外挿 ◼ 4D Transposeの転 置パラメータ変更 JSONへの変更パラメータ直接指定 あ るいは Numpyバイナリ指定でパラメー タを変更 ■ ダイレクト入力 Multiplyの乗数変更 5D Transposeの転 置パラメータ変更 ■ Numpy入力 45
onnx2json / json2onnx
ONNX -> JSON -> ONNX ◼ ONNX onnx2json JSON onnxのバイナリをjson化して編集し、 再度jsonからonnxのバイナリを逆生成 json2onnx ONNX 47
Edgeデバイス向け Model Zoo
Edgeデバイス向け Model Zoo 2021年07月15日現在 130種類の変換済みモデルをコミット https://github.com/PINTO0309/PINTO_model_zoo ライセンスに注意 49
まとめ
まとめ ① Edge推論のためのフレームワーク間モデル変換ツールを使用 ② 高レベルAPIによるモデル変換作業 5分弱 ③ 好きなフレームワークで研究 → 好きなフレームワークで実装 ④ フレームワークロックイン回避 ⑤ デバイスロックイン回避 ⑥ トレーニングコードが無くてもモデル改造・最適化 ⑦ モデルのライセンスには注意 51
Appendix
Appendix No. Tools URL 1 Intel® Distribution of OpenVINO™ Toolkit https://github.com/openvinotoolkit/openvino 2 TensorFlow https://github.com/tensorflow/tensorflow 3 TensorFlow Lite for Microcontrollers https://github.com/tensorflow/tflite-micro 4 PyTorch https://github.com/pytorch/pytorch 5 ONNX https://github.com/onnx/onnx 6 MXNet https://github.com/apache/incubator-mxnet 7 KALDI https://github.com/kaldi-asr/kaldi 8 NCNN https://github.com/Tencent/ncnn 9 EdgeTPU https://github.com/google-coral/edgetpu 10 coremltools https://github.com/apple/coremltools 11 tensorflow-onnx https://github.com/onnx/tensorflow-onnx 12 onnx-tensorflow https://github.com/onnx/onnx-tensorflow 13 onnxmltools https://github.com/onnx/onnxmltools 14 tflite2tensorflow https://github.com/PINTO0309/tflite2tensorflow 15 openvino2tensorflow https://github.com/PINTO0309/openvino2tensorflow 16 onnx2json https://github.com/PINTO0309/onnx2json 17 json2onnx https://github.com/PINTO0309/json2onnx 18 mtomo https://github.com/PINTO0309/mtomo 53
ご清聴ありがとうございました