最新の OpenVINO™ ツールキット マニュアルビルドを使用したステレオ深度推定モデルの最適化_part1

9.9K Views

February 14, 22

スライド概要

ONNX や OpenVINO™、TensorFlow の各種モデルオプティマイザを駆使したモデル最適化の詳細のご紹介 ならびに モデル変換の実演デモを行います。このプレゼンテーション資料は講演全体1時間の前半30分の資料です。

profile-image

Hobby Programmer. Caffe, Tensorflow, NCS, RaspberryPi, Latte Panda, ROS, DL, TPU, OpenVINO. Intel Software Innovator. The remarks are my personal opinion.

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

最新の OpenVINO ツールキット マニュアルビルドを使用した ステレオ深度推定モデルの最適化 TM ~モデル変換・最適化とデモンストレーションとその裏話~ part1 株式会社サイバーエージェント AI Lab リサーチエンジニア 兵頭 亮哉

2.

兵頭 亮哉 (Katsuya Hyodo / a.k.a PINTO) • 株式会社サイバーエージェント AI Lab HCIチーム リサーチエンジニア • 接客対話エージェントの研究・開発 • 大阪大学大学院基礎工学研究科 招聘研究員の方々の開発面をサポート Twitter GitHub Discord • 対象領域は HCI/HRI/インタラクション/対話システム/機械学習/画 像処理/自然言語処理 @PINTO03091 @PINTO0309 @PINTO @PINTO @PINTO0309 2

3.

アジェンダ

4.

1. フレームワークの種類 2. モデルフォーマットの特徴 3. オプティマイザが得意とすること 4. 最適化の具体例 5. 部品最適化 6. 範囲最適化 7. 最適化によるパフォーマンスの変化 8. フレームワーク特性に応じたチューニング 4

5.

フレームワークの種類

9.

モデルフォーマットの特徴

10.

Intel® Distribution of OpenVINO™ Toolkit • 独自のモデルフォーマット (.xml / .bin) • モデル生成後にテキストエディタ で構造を編集可能 • 構造と重みが物理ファイルレベル で分離 • 重みを手軽に差し替え可能 10

11.

TensorFlow Lite • FlattBuffer形式 • バイナリとJSONを相互に変 換可能 11

12.

ONNX •Protocol Buffers 形式 ・ファイルの上限2GB ・Extensibleデータで上限突破可能 •あらゆるフレームワークへ変 換可能 •モデル加工用のツールが公式 やコミュニティから多数提供 されている 12

13.

オプティマイザが 得意とすること

14.

OpenVINO 1. 形状推定 2. レイヤーの融合(BatchNorm, LayerNormなど) 3. プリミティブなレイヤーへの分解 14

15.

TensorFlow Lite 1. 不必要なレイヤーの一掃 2. アクティベーションの融合(ReLU, ReLU6など) 3. 簡潔なモデル構造 15

16.

ONNX 1. 未定義の入力次元 2. バイナリ生成後に次元を初期化 3. (一部)レイヤー融合 • onnxruntime-extensions • onnx_graphsurgeon • onnx-simplifier • onnxconverter-common • onnxmltools • onnx optimizer 16

17.

• 標準オプティマイザの特性を組み合わせ • 標準オプティマイザのいいとこどり • 最適化したモデル生成 17

18.

最適化の具体例

19.

モデルの部分最適化 19

20.

BatchNormalization BatchNorm -> Add + Multiply (ONNX → OpenVINO) 20

21.

Transpose Transposeの削除 (ONNX → TFLite) 21

22.

モデルの範囲最適化 22

23.

ONNX 23

24.

onnx-optimizer 24

25.

OpenVINO 25

26.

TensorFlow Lite 26

27.

最適化による パフォーマンスの変化

28.

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

29.

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

30.

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

31.

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.

というお手軽なモデルの性能改善はオマケ 真の狙いは 、 「フレームワークをまたいでモデルを変換」 すること。 性能改善はモデルの汎用性を高めた結果の副産物 32

33.

フレームワーク特性に 応じたチューニング

34.

Abs (TFLite → Myriad) Abs → Square + Sqrt 34

35.

NonMaxSuppression (TFLite → Myriad) NonMaxSuppressionV5 → NonMaxSuppressionV4 35

36.

Power (TFLite → EdgeTPU) Power[x, n] → Multiply x (n-1)個 36

37.

GroupConvolution (TensorFlow Lite) GroupConvolution → Convolution x N 37

38.

GroupConvolution → Convolution x N Filter の分割 Kernel の分割 38

39.

Acos / Asin (TensorFlow Lite / Myriad) Acos や Asin を近似計算式に置き換え TensorFlow Lite と Myriad の両方に対応 39

40.

resize_bilinear / resize_nearest_neighbor (EdgeTPU) align_corners 無効化 40

41.

バッチサイズの初期化 (ONNX) https://zenn.dev/pinto0309/scraps/e628353672f0d5 41

42.

バッチサイズの初期化 (ONNX) https://zenn.dev/pinto0309/scraps/e628353672f0d5 42

43.

バッチサイズの初期化 (ONNX) https://zenn.dev/pinto0309/scraps/e628353672f0d5 43

44.

バッチサイズの初期化 (ONNX) https://zenn.dev/pinto0309/scraps/e628353672f0d5 44

45.

バッチサイズの初期化 (ONNX) https://zenn.dev/pinto0309/scraps/e628353672f0d5 45

46.

Height/Widthの固定化 (ONNX) https://zenn.dev/pinto0309/scraps/53d41e10054516 46

47.

Height/Widthの固定化 (ONNX) https://zenn.dev/pinto0309/scraps/53d41e10054516 47

48.

3個のモデルのマージ (ONNX) https://zenn.dev/pinto0309/scraps/62da09b025790d 48

49.

複数モデルの融合 (ONNX) https://zenn.dev/pinto0309/scraps/62da09b025790d 49

50.

オプティマイザを騙す (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

51.

オプティマイザを騙す (EdgeTPU / Myriad) 51

52.

今後

53.

1. 最適化済みモデルのFPGAへの適用 2. 言語・音声モデルへのチャレンジ 3. モデル変換のWEBサービス化 53

54.

まとめ

55.

1. 公式モデルもひと手間で高速化可能 2. HWに合わせたチューニングは難しくない 3. 複数のオプティマイザの特性を生かす 55

56.

ご清聴ありがとうございました