9.9K Views
February 14, 22
スライド概要
ONNX や OpenVINO™、TensorFlow の各種モデルオプティマイザを駆使したモデル最適化の詳細のご紹介 ならびに モデル変換の実演デモを行います。このプレゼンテーション資料は講演全体1時間の前半30分の資料です。
Hobby Programmer. Caffe, Tensorflow, NCS, RaspberryPi, Latte Panda, ROS, DL, TPU, OpenVINO. Intel Software Innovator. The remarks are my personal opinion.
最新の OpenVINO ツールキット マニュアルビルドを使用した ステレオ深度推定モデルの最適化 TM ~モデル変換・最適化とデモンストレーションとその裏話~ part1 株式会社サイバーエージェント AI Lab リサーチエンジニア 兵頭 亮哉
兵頭 亮哉 (Katsuya Hyodo / a.k.a PINTO) • 株式会社サイバーエージェント AI Lab HCIチーム リサーチエンジニア • 接客対話エージェントの研究・開発 • 大阪大学大学院基礎工学研究科 招聘研究員の方々の開発面をサポート Twitter GitHub Discord • 対象領域は HCI/HRI/インタラクション/対話システム/機械学習/画 像処理/自然言語処理 @PINTO03091 @PINTO0309 @PINTO @PINTO @PINTO0309 2
アジェンダ
1. フレームワークの種類 2. モデルフォーマットの特徴 3. オプティマイザが得意とすること 4. 最適化の具体例 5. 部品最適化 6. 範囲最適化 7. 最適化によるパフォーマンスの変化 8. フレームワーク特性に応じたチューニング 4
フレームワークの種類
6
7
8
モデルフォーマットの特徴
Intel® Distribution of OpenVINO™ Toolkit • 独自のモデルフォーマット (.xml / .bin) • モデル生成後にテキストエディタ で構造を編集可能 • 構造と重みが物理ファイルレベル で分離 • 重みを手軽に差し替え可能 10
TensorFlow Lite • FlattBuffer形式 • バイナリとJSONを相互に変 換可能 11
ONNX •Protocol Buffers 形式 ・ファイルの上限2GB ・Extensibleデータで上限突破可能 •あらゆるフレームワークへ変 換可能 •モデル加工用のツールが公式 やコミュニティから多数提供 されている 12
オプティマイザが 得意とすること
OpenVINO 1. 形状推定 2. レイヤーの融合(BatchNorm, LayerNormなど) 3. プリミティブなレイヤーへの分解 14
TensorFlow Lite 1. 不必要なレイヤーの一掃 2. アクティベーションの融合(ReLU, ReLU6など) 3. 簡潔なモデル構造 15
ONNX 1. 未定義の入力次元 2. バイナリ生成後に次元を初期化 3. (一部)レイヤー融合 • onnxruntime-extensions • onnx_graphsurgeon • onnx-simplifier • onnxconverter-common • onnxmltools • onnx optimizer 16
• 標準オプティマイザの特性を組み合わせ • 標準オプティマイザのいいとこどり • 最適化したモデル生成 17
最適化の具体例
モデルの部分最適化 19
BatchNormalization BatchNorm -> Add + Multiply (ONNX → OpenVINO) 20
Transpose Transposeの削除 (ONNX → TFLite) 21
モデルの範囲最適化 22
ONNX 23
onnx-optimizer 24
OpenVINO 25
TensorFlow Lite 26
最適化による パフォーマンスの変化
DeepLab v3+ MobilenetEdgeTPUV2-XS with optimized fused argmax(onnx → OpenVINO → onnx) Cited: NobuoTsukamoto「Jetson Nano TensorRT Autoseg-EdgeTPU and DeepLab v3+ MobilenetEdgeTPUV2 latency」2022.02.04 https://github.com/NobuoTsukamoto/benchmarks/blob/main/tensorrt/jetson/deeplabv3_edgetpuv2/deeplabv3_edgetpuv2.md#latency-mean-ms 28
tensorflow-onnx VS openvino2tensorflow/tflite2tensorflow 公式ツールtensorflow-onnxによる変換 onnx → TensorRT [xx/xx/xxxx-xx:xx:xx] [I] === Performance summary === [xx/xx/xxxx-xx:xx:xx] [I] Throughput: 9.85818 qps [xx/xx/xxxx-xx:xx:xx] [I] Latency: ..., mean = 101.425 ms, ... [xx/xx/xxxx-xx:xx:xx] [I] End-to-End Host Latency: ..., mean = 101.438 ms, ... 趣味ノウハウによる最適化 onnx → TensorRT [xx/xx/xxxx-xx:xx:xx] [I] === Performance summary === [xx/xx/xxxx-xx:xx:xx] [I] Throughput: 10.5582 qps [xx/xx/xxxx-xx:xx:xx] [I] Latency: ..., mean = 94.7022 ms, ... [xx/xx/xxxx-xx:xx:xx] [I] End-to-End Host Latency: ..., mean = 94.7129 ms, ... Cited: NobuoTsukamoto「Jetson Nano TensorRT Autoseg-EdgeTPU and DeepLab v3+ MobilenetEdgeTPUV2 latency」2022.02.04 https://github.com/NobuoTsukamoto/benchmarks/blob/main/tensorrt/jetson/deeplabv3_edgetpuv2/deeplabv3_edgetpuv2.md#latency-mean-ms 29
TensorRT + Jetson Nano Cited: NobuoTsukamoto「Jetson Nano TensorRT Autoseg-EdgeTPU and DeepLab v3+ MobilenetEdgeTPUV2 latency」2022.02.04 https://github.com/NobuoTsukamoto/benchmarks/blob/main/tensorrt/jetson/deeplabv3_edgetpuv2/deeplabv3_edgetpuv2.md#latency-mean-ms 30
Cited: NobuoTsukamoto「Jetson Nano TensorRT Autoseg-EdgeTPU and DeepLab v3+ MobilenetEdgeTPUV2 latency」2022.02.04 https://github.com/NobuoTsukamoto/benchmarks/blob/main/tensorrt/jetson/deeplabv3_edgetpuv2/deeplabv3_edgetpuv2.md#latency-mean-ms 31
というお手軽なモデルの性能改善はオマケ 真の狙いは 、 「フレームワークをまたいでモデルを変換」 すること。 性能改善はモデルの汎用性を高めた結果の副産物 32
フレームワーク特性に 応じたチューニング
Abs (TFLite → Myriad) Abs → Square + Sqrt 34
NonMaxSuppression (TFLite → Myriad) NonMaxSuppressionV5 → NonMaxSuppressionV4 35
Power (TFLite → EdgeTPU) Power[x, n] → Multiply x (n-1)個 36
GroupConvolution (TensorFlow Lite) GroupConvolution → Convolution x N 37
GroupConvolution → Convolution x N Filter の分割 Kernel の分割 38
Acos / Asin (TensorFlow Lite / Myriad) Acos や Asin を近似計算式に置き換え TensorFlow Lite と Myriad の両方に対応 39
resize_bilinear / resize_nearest_neighbor (EdgeTPU) align_corners 無効化 40
バッチサイズの初期化 (ONNX) https://zenn.dev/pinto0309/scraps/e628353672f0d5 41
バッチサイズの初期化 (ONNX) https://zenn.dev/pinto0309/scraps/e628353672f0d5 42
バッチサイズの初期化 (ONNX) https://zenn.dev/pinto0309/scraps/e628353672f0d5 43
バッチサイズの初期化 (ONNX) https://zenn.dev/pinto0309/scraps/e628353672f0d5 44
バッチサイズの初期化 (ONNX) https://zenn.dev/pinto0309/scraps/e628353672f0d5 45
Height/Widthの固定化 (ONNX) https://zenn.dev/pinto0309/scraps/53d41e10054516 46
Height/Widthの固定化 (ONNX) https://zenn.dev/pinto0309/scraps/53d41e10054516 47
3個のモデルのマージ (ONNX) https://zenn.dev/pinto0309/scraps/62da09b025790d 48
複数モデルの融合 (ONNX) https://zenn.dev/pinto0309/scraps/62da09b025790d 49
オプティマイザを騙す (EdgeTPU / Myriad) Hard-Swish x * ReLU6(x + 3) * 0.16666667 ↓ x * ReLU6(x + 3) * 0.16666666 HardSwishに変換される ReLU6 と Add と Multiply に変換される オプティマイザは定数 0.16666667 を見て Hard-Swishレイヤー を生成するため、軽微な影響を許容しつつ簡単に騙せる 50
オプティマイザを騙す (EdgeTPU / Myriad) 51
今後
1. 最適化済みモデルのFPGAへの適用 2. 言語・音声モデルへのチャレンジ 3. モデル変換のWEBサービス化 53
まとめ
1. 公式モデルもひと手間で高速化可能 2. HWに合わせたチューニングは難しくない 3. 複数のオプティマイザの特性を生かす 55
ご清聴ありがとうございました