Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Deep Learning推論を高速化するソフトウェア技術

Deep Learning推論を高速化するソフトウェア技術

fpgax #11 + TFUG ハード部:DNN専用ハードについて語る会
の発表資料です。
https://fpgax.connpass.com/event/115446/

Koichi Nakamura

February 02, 2019
Tweet

More Decks by Koichi Nakamura

Other Decks in Technology

Transcript

  1. ソフトウェアベースの高速化は重要 • 高性能なハードウェアが使えない場合がある ◦ 金額が高い、消費電力が高い、発熱量が大きい、サイズが大きい、必要な機能が無い、供給保証 がない、ハードが枯れてない、ソフトが枯れてない、 etc • 汎用ハードを使いたい場合がある ◦

    DLだけじゃなく、普通の処理もする • ハードウェアが勝手に限界まで速くしてくれる訳ではない ◦ 同じハードウェアでも、ソフトウェアによって大分速度が異なる ◦ DNNは変換の自由度が高く、まだ全てハードウェア任せにできる感じではない • 速ければ速いほど精度が上がり得る ◦ 精度がクリティカルな用途では、少しでも速度を上げて計算量を稼ぎたい場面がある • 特定のハードウェアに依存したくない場合がある ◦ スマホアプリなど、様々なハードウェアで速くできる汎用的な方法が欲しい場面がある
  2. “ResNet-50から1%の精度低下でX倍速くなり、Y倍軽量になりました” • 単純にMobileNet v2 1.4 224を使っただけでも、同じ精度で 6.7倍計算量が減り、4.2倍軽量になる top-1 top-5 MAC

    (M) Parameters (M) ResNet-50 75.8% 92.9% 3900 25.6 MobileNet V2 1.4 224 75.0% 92.5% 582 6.06 • 知りたい情報は ◦ 同精度の最も高速なモデルと比べてどれくらい速くなったのか? ◦ 最も高速なモデルをベースにして、どれくらい速くできるのか? 例
  3. DNN特有の話 • 許容され得る変換の種類が広い ◦ floating pointの足し算、掛け算の順番を変える ◦ メモリ上のレイアウトを変える ◦ 数値の表現を変える

    ▪ float32 → float16, int16, int8 など ◦ 数学的な式変形を行う ◦ など • 理由 ◦ 認識精度が落ちなければ良い、というアプリケーションである場合が多い ◦ 計算グラフで表現される為、上記の変換を正しく行う事がしやすい
  4. 実際どれくらい変わるのか?① • モデル: あるsegmentationのモデル、fp32, 320x200 • ハード: Pi 3のCPU(Cortex-A 53)の1コアを利用

    • 全てNEONによるSIMD化利用 レイヤー融合 アルゴリズム ループアンロール メモリレイアウト 実行時間(ms) × direct × NCHW 733 ◦ direct × NCHW 495 ◦ im2col × NCHW 286 ◦ im2col ◦ NCHW 175 ◦ im2col ◦ NHWC 166 比較的単純な最適化のみで 4倍強変わる
  5. 実際どれくらい変わるのか?② • モデル: MobileNet V2 1.0 224x224, 1000クラス分類 • ハード:

    STM32H7(Cortex-M7) • float32のまま乗せたもの(レイヤー融合等はしている):9秒 • float32のままで最適化し3.1秒 ◦ Tightly Coupled Memory(TCM)を上手く使う ◦ Cortex-M7のSIMD命令 ◦ メモリ配置最適化(特にアラインメント) ◦ など • int16化して最適化し1.1秒 ◦ Cortex-M7のSIMD命令 ◦ など (講演時、間違えてここに入れてしまいましたので訂正します )
  6. レイヤー融合 Convolution Batch Normalization Convolution Convolution ReLU Convolution+ReLU 事前にWeight同士の積、 和を計算しておいて

    一つにまとめてしまう Convolutionの最内ループ にReLUをインライン化する など
  7. アルゴリズム • 2D Convolutionのアルゴリズム ◦ 入力サイズ=HxW, フィルタサイズ=3x3の場合 手法 概要 演算回数

    メモリ使用量 備考 Direct 定義通り - - メモリが弱いプロセッサだとこれが強い場合がある im2col 行列乗算 同じ 入力が9倍 非常によく使われる winograd 高速乗算 4/9程度に減少 Weightが16/9倍 よく使われる。Separable Convに弱い。 FFT 高速乗算 最大2/9程度に減少 WeightがHW/9倍 複素演算が必要。あまり使われない。 • 詳しくはConvolutionの数理とアルゴリズム
  8. ループ最適化 • 古典的な最適化手法。良く効く。奥が深い。 ◦ ループアンローリング ◦ ループ交換 ◦ ソフトウェアパイプライニング ◦

    など • ハードウェア特性を意識する事が必要 ◦ アクセス順序 ◦ アラインメント ◦ レジスタの数 ◦ ハードウェアパイプラインの構造 ◦ など
  9. • テンソルをメモリ上にどう配置するか? ◦ 以下は2Dイメージの場合の絵 ◦ 実際はもう一次元(N,バッチ)ある メモリレイアウト 1 2 3

    4 5 6 7 8 1 2 3 4 5 6 7 8 1 5 2 6 3 7 4 8 1 2 3 4 5 6 7 8 H W C アドレス CHW HWC HCW など (講演時、以下の図が誤っていましたので修正しました )
  10. 並列化 • SIMD • マルチコア • … N C H

    W • どこでどう並列化するのか?
  11. VideoCore IVでの高速化 • Raspberry PiシリーズにはVideoCore IVというGPUが搭載されている BCM2835 BCM2837 CPU 1GHz

    single-core ARM1176JZF-S 1.2GHz 64-bit quad-core ARM Cortex-A53 GPU VideoCore IV CPU peak performance 2Gflops 38.4Gflops GPU peak performance 28.8Gflops 28.8Gflops
  12. VideoCore IVのアーキテクチャ • 16wayのSIMDコアが4x3個 ◦ fp32の乗算,加算 ◦ Special function unit

    • HostからGPUへは L2 Cache経由とDMA • GPUからHostへはDMAのみ • Register AllocationやScheduling等 のハードウェア機能はない • よくある感じの(ちょっと昔の) アーキテクチャ Using Raspberry Pi GPU for Deep Neural Networkより
  13. 行列乗算のみGPU化 pure GPU化 もろもろのGPU化や 特定計算用の特化コー ド用意など レイヤー融合や メモリ転送最適化など golf, メモリ最適化

    タイリング最適化など いろいろ googlenet top1:68.7%, top5:88.9% mobilenet v1 top1:70.9%, top5:88.9% mobilenet v2 top1:71.8%, top5:91.0% depthwise, pointwise改善 メモリ管理改善などいろいろ ※ラズパイの GPU周波数に対する誤解があり、 ここ以前はオーバークロック状態 (400MHz)で測っているケースがありました。 ここ以後はデフォルト周波数 (300MHz)での値です。
  14. まとめ • 良いモデルを使いましょう ◦ ハード毎に特性が違うのでベンチマークを取りましょう • 良い実装を研究しましょう ◦ 同じモデル、ハードでも実装によって大分差があります ◦

    “まだ”、自動で最適実装が得られる感じにはなっていないと思う。いずれそうなるかも。 • 既にあるプロセッサでも、結構計算できるのでtryしましょう