ML_Loft_4_エッジ推論.pdf

 ML_Loft_4_エッジ推論.pdf

4725a40963c6b76fd85234dbce2679d6?s=128

Shintarou Okada

July 19, 2019
Tweet

Transcript

  1. 岡田真太郎 - Preferred Networks エンジニア エッジ推論の前にやること

  2. エッジ推論の速度を決定する3つの要素 入力画像 サイズ デバイス モデル FPN BboxHead MaskHead ResNet50

  3. モデル INPUT 計算量 入力画像サイズ

  4. モデル INPUT モデル INPUT INPUT 計算量 0.7倍 モデルそのまま タテ・ヨコ 0.7倍

    するだけで 入力画像サイズ
  5. INPUT INPUT INPUT 計算量 0.7倍 計算量 半分! モデルそのまま タテ・ヨコ 0.7倍

    するだけで 入力画像サイズ モデル モデル
  6. 入力画像サイズ INPUT INPUT INPUT 0.7倍 精度は 大丈 夫? 計算量 半分!

  7. 逆に聞くけどそのタスクに精度 と速度はどれくらい必要なんで すか??????????? エッジ推論の前に,さっさとハイエンドのデバイス (例えばNVIDIAのGPU)使ってわざと精度落とし たり速度遅くしてモデルの必要性能の下限を明ら かにしましょう!!

  8. 精度と速度はトレードオフ エッジ推論は原則として精度か速度が落ちる どれくらいの精度と速度が必要なのかを見極めるのが重要 精度 速度 タスクに必要 な精度と速度

  9. 精度 速度 精度と速度はトレードオフ エッジ推論は原則として精度か速度が落ちる どれくらいの精度と速度が必要なのかを見極めるのが重要

  10. この領域に あればタス クがこなせる 精度 速度 精度と速度はトレードオフ エッジ推論は原則として精度か速度が落ちる どれくらいの精度と速度が必要なのかを見極めるのが重要

  11. 精度 速度 オリジナルのモデル on NVIDIA GPU 精度と速度はトレードオフ エッジ推論は原則として精度か速度が落ちる どれくらいの精度と速度が必要なのかを見極めるのが重要

  12. 精度 速度 デバイスを変えると 速度が落ちる 精度と速度はトレードオフ エッジ推論は原則として精度か速度が落ちる どれくらいの精度と速度が必要なのかを見極めるのが重要

  13. 精度 速度 入力画像サイズで 精度と速度を調整 精度と速度はトレードオフ エッジ推論は原則として精度か速度が落ちる どれくらいの精度と速度が必要なのかを見極めるのが重要

  14. 精度 速度 入力画像サイズで 精度と速度を調整 精度と速度はトレードオフ エッジ推論は原則として精度か速度が落ちる どれくらいの精度と速度が必要なのかを見極めるのが重要 再学習の 必要なし 手軽

  15. 精度 速度 精度と速度はトレードオフ エッジ推論は原則として精度か速度が落ちる どれくらいの精度と速度が必要なのかを見極めるのが重要 モデルを修正するとグ ラフが全体的に右下に 移動する

  16. モデル

  17. モデル ChainerCVの MaskRCNNFPNResNet50 (= インスタンスセグメン テーションのモデル)

  18. ChainerCVの MaskRCNNFPNResNet50 (= インスタンスセグメン テーションのモデル) 画像は https://www.oreilly.com/ideas/introducing-capsule-networks から引用

  19. モデル

  20. 拡大

  21. 拡大 FPN BboxHead MaskHead ResNet50

  22. FPN BboxHead 拡大 MaskHead ResNet50 どの部分の計算 量が多いのか?

  23. モデル 拡大 FPN BboxHead MaskHead ResNet50 どの部分の計算 量が多いのか? 掛け算の総量と考えればOK

  24. モデルの計算量を算出してくれる Chainer Computational Cost https://github.com/belltailjp/chainer_computational_cost import chainer import numpy as

    np from chainer_computational_cost import ComputationalCostHook net = chainer.links.VGG16Layers() x = np.random.random((1, 3, 224, 224)).astype(np.float32) with chainer.no_backprop_mode(), chainer.using_config('train', False): with ComputationalCostHook(fma_1flop=True) as cch: y = net(x) cch.show_report(unit='G', mode='md')
  25. https://github.com/belltailjp/chainer_computational_cost import chainer import numpy as np from chainer_computational_cost import

    ComputationalCostHook net = chainer.links.VGG16Layers() x = np.random.random((1, 3, 224, 224)).astype(np.float32) with chainer.no_backprop_mode(), chainer.using_config('train', False): with ComputationalCostHook(fma_1flop=True) as cch: y = net(x) cch.show_report(unit='G', mode='md') Markdown形式で表を 出してくれる モデルの計算量を算出してくれる Chainer Computational Cost
  26. 計算量

  27. 計算量 Convolutionがモデル 全体の計算量を決める ことが分かる

  28. Convの中でも一部が多くの計算量を占めている たった2つのConvがモ デル全体の計算量の 1/3以上を占めている MaskHead FPN ResNet50

  29. Convolution Layerの計算量 入力チャンネル数: N 出力チャンネル数: N kernelサイズ: k 入出力特徴マップサイズ: (H,

    W)
  30. Convolution Layerの計算量 入力チャンネル数: N 出力チャンネル数: N kernelサイズ: k 入出力特徴マップサイズ: (H,

    W) 入力画像サイズが 効いてくる部分
  31. Convolution Layerの計算量 入力チャンネル数: N 出力チャンネル数: N kernelサイズ: k 入出力特徴マップサイズ: (H,

    W) 約0.7倍
  32. Convolution Layerの計算量 入力チャンネル数: N 出力チャンネル数: N kernelサイズ: k 入出力特徴マップサイズ: (H,

    W) 計算量 半分! 約0.7倍
  33. 拡大 FPN BboxHead MaskHead ResNet50

  34. 拡大 FPN BboxHead MaskHead ResNet50 軽量化 全体からすると 約25%の削減 もちろん精度は変わ る

    軽量化
  35. モデルまとめ モデルのConvのチャンネル数を減らすと 計算量が減る 重たいConvはChainer-computational-costで調 べられる 入力画像サイズの調整と比べると労力が かかる

  36. デバイス • NVIDIA GPUは計算量が多いなら効率 が良い • Intel GPUがわりと速い • QualcommのSnapdragonはGPUと

    DSPが使えて,DSPはint8化が必須
  37. デバイス • NVIDIA GPUは計算量が多いなら効率 が良い • Intel GPUがわりと速い • QualcommのSnapdragonはGPUと

    DSPが使えて,DSPはint8化が必須 計算量/秒 のこと モデルによって異なることに注意
  38. デバイス • NVIDIA GPUは計算量が多いなら効率 が良い • Intel GPUがわりと速い • QualcommのSnapdragonはGPUと

    DSPが使えて,DSPはint8化が必須 計算量/秒 のこと モデルによって異なることに注意 モデルの選定では計算量だけでなく 対象のデバイスで実行した場合の 効率にも注意する必要がある
  39. デバイス • NVIDIA GPUは計算量が多いなら効率 が良い • Intel GPUがわりと速い • QualcommのSnapdragonはGPUと

    DSPが使えて,DSPはint8化が必須 つまり,入力画像サイズやバッチ サイズが大きい / Convのチャン ネル数が大きいモデルの場合
  40. デバイス • NVIDIA GPUは計算量が多いなら効率 が良い • Intel GPUがわりと速い • QualcommのSnapdragonはGPUと

    DSPが使えて,DSPはint8化が必須 裏を返すと,計算量が少ない場 合は演算器が無駄になる 特にメモリ転送の比率が大きい モデルでは効率が悪い (ShuffleNet, MobileNet系)
  41. デバイス • NVIDIA GPUは計算量が多いなら効率 が良い • Intel GPUがわりと速い • QualcommのSnapdragonはGPUと

    DSPが使えて,DSPはint8化が必須
  42. デバイス • NVIDIA GPUは計算量が多いなら効率 が良い • Intel GPUがわりと速い • QualcommのSnapdragonはGPUと

    DSPが使えて,DSPはint8化が必須 いわゆるIntel Graphics Intel CPUにたいてい付属し ているIntel製のGPU Intel製の推論フレームワークOpenVINOが使える
  43. デバイス • NVIDIA GPUは計算量が多いなら効率 が良い • Intel GPUがわりと速い • QualcommのSnapdragonはGPUと

    DSPが使えて,DSPはint8化が必須
  44. デバイス • NVIDIA GPUは計算量が多いなら効率 が良い • Intel GPUがわりと速い • QualcommのSnapdragonはGPUと

    DSPが使えて,DSPはint8化が必須 複数のチップ,ARMのCPUと GPUとDSPが載ったSoC CPUでも推論はできるが非力
  45. デバイス • NVIDIA GPUは計算量が多いなら効率 が良い • Intel GPUがわりと速い • QualcommのSnapdragonはGPUと

    DSPが使えて,DSPではint8化が必須 いわゆる量子化,精度が保てるかは モデル次第 単純なモデルではほぼ問題ない 量子化用のツールはSNPEに付属
  46. 使いたいチップのメーカーが出しているものを使え ば大抵OK • NVIDIAならTensorRT • IntelならOpenVINO(a.k.a opencv/dldt) • QualcommならSNPE オペレータ間を埋める必要があれば

    Menoh/Chainer-Compilerを使う 推論用のフレームワークは?
  47. 使いたいチップのメーカーが出しているものを使え ば大抵OK • NVIDIAならTensorRT • IntelならOpenVINO(a.k.a opencv/dldt) • QualcommならSNPE オペレータ間を埋める必要があれば

    Menoh/Chainer-Compilerを使う 推論用のフレームワークは? チップの性能を一番引き出せるのはその チップメーカー 手元でやる小手先の最適化はほぼ無意味
  48. • カンタンにできて効果のあることから始めよう • 入力サイズの調整は手軽に精度と速度の調節 がしやすい • モデルはConvのチャンネルを減らすと計算量 が減る • モデルによって実行効率が異なることに注意

    • 些細な最適化にこだわるな(フットワークが重くなる, 製品の価値に結びつかない,どうせ無駄になる) 全体のまとめ