tensor flow usergroup 2016 (公開版)

47
2値化CNNなDQNを FPGAで動かしてみた 中原 啓貴 東京⼯業⼤学 1

Upload: hiroki-nakahara

Post on 21-Apr-2017

19.367 views

Category:

Engineering


7 download

TRANSCRIPT

Page 1: Tensor flow usergroup 2016 (公開版)

2値化CNNなDQNをFPGAで動かしてみた

中原 啓貴東京⼯業⼤学

1

Page 2: Tensor flow usergroup 2016 (公開版)

⾃⼰紹介• Hiroki Nakahara (中原 啓貴)• 36歳 (若⼿…︖)• JK@⽇本⼀モテない⼤学の教員• FPGA/ディープラーニングは⽣活の糧• FPGAは専⾨ではありません

(HDLを書くようになったのは学位を取ってから, ⾼位合成を始めたのは去年)• 多値論理と論理関数の複雑度が専⾨

2

Page 3: Tensor flow usergroup 2016 (公開版)

Custom Computing Machine

3

Multi‐valued logic Pattern matching circuit• Regular expressionmatching circuit

• Packet classifier• IP address look‐up

40m

Radio telescopeDeep neural network

Page 4: Tensor flow usergroup 2016 (公開版)

今⽇のお話

4Source: TensorFlow Tutorial, Strata NYC, 2016

FPGAも仲間に⼊れて︕

Page 5: Tensor flow usergroup 2016 (公開版)

今回の前提• 学習済みニューラルネットワークをFPGAに組込む話

5

Page 6: Tensor flow usergroup 2016 (公開版)

FPGA?• Field(現場で)• Programmable(書き換えができる)

• Gate(論理ゲートの)• Array(集合体)

6

PCIに刺してGPUの代わりにアクセラレータ (Altera社)

指先よりも小さいよ!(Lattice社)

ラズパイにのっけて高速化(Xilinx社)

iPhone7にも!!

Page 7: Tensor flow usergroup 2016 (公開版)

FPGA=その場でプログラム︕

7

某国民的ゲーム機に

Ubuntuが走るよ

Arduino(ATMEGA)を乗せてみました

電波望遠鏡用の信号処理装置

Page 8: Tensor flow usergroup 2016 (公開版)

FPGAの基本的な構造

8

SB SB SB SB

SB SB SB SB

SB SB SB SB

SB SB SB SB

LUT LUT LUT

LUT LUT LUT

LUT LUT LUT

IO IO IO IO IO IO

IO IO IO IO IO IO

IO

IO

IO

IO

IO

IO

IO

IO

IO

IO

IO

IO

Look-UpTable (LUT)

I/O Block

Channels

Switch Blocks

Page 9: Tensor flow usergroup 2016 (公開版)

LUTを使った論理ゲートの実現x0 x1 x2 y0 0 0 00 0 1 00 1 0 00 1 1 01 0 0 01 0 1 01 1 0 01 1 1 1

x0 x1 x2 y0 0 0 00 0 1 10 1 0 10 1 1 11 0 0 11 0 1 11 1 0 11 1 1 1

LUTの出⼒を書き換えて様々な論理ゲートを実現

Page 10: Tensor flow usergroup 2016 (公開版)

ChannelとSwitch Block

LUTどちらもトランジスタのスイッチ

Page 11: Tensor flow usergroup 2016 (公開版)

Programmable=メモリ書き換え

11

SB SB SB SB

SB SB SB SB

SB SB SB SB

SB SB SB SB

LUT LUT LUT

LUT LUT LUT

LUT LUT LUT

IO IO IO IO IO IO

IO IO IO IO IO IO

IO

IO

IO

IO

IO

IO

IO

IO

IO

IO

IO

IO

Page 12: Tensor flow usergroup 2016 (公開版)

FPGAの対象=論理回路

12

module hoge(input a, b, c;output d);

assign d = (a & b) | c;

endmodule

Xilinx社

Altera社

実現したい論理回路をハードウェア記述⾔語で書く(Verilog HDL/ VHDL)

FPGAベンダーが提供するCADツールでビットストリームに合成する

FPGAにビットストリームを送信して回路が実現︕

Page 13: Tensor flow usergroup 2016 (公開版)

ギャップ…

13

module hoge(input a, b, c;output d);

assign d = (a & b) | c;

endmodule

実現したい論理回路をハードウェア記述⾔語でもっっっっっっっっっっのすごーく⼤量のHDLで書く(Verilog HDL/ VHDL)

Y = X.dot(W)+B

学習したディイイイプなニューラルネットワークの⾏列演算をあっさり1⾏で書いてしまう

Page 14: Tensor flow usergroup 2016 (公開版)

⾏列演算を例に

14

Y = X.dot(W)+Bビヘイビア→データフロー→FSM→ハードウェア

ここまでやってようやくHDLのコーディング

Page 15: Tensor flow usergroup 2016 (公開版)

まずは⾏列の計算

15

Cとかだとループを回して完了!

Page 16: Tensor flow usergroup 2016 (公開版)

データパスを書きましょう

16データの入出力をすべて展開して書く

Page 17: Tensor flow usergroup 2016 (公開版)

スケジューリングしましょう

17今回はMAC演算器を使いまわす設計に(MAC: Multiply-ACcumulation)

一気に並列演算だと

完全に逐次処理だと

Page 18: Tensor flow usergroup 2016 (公開版)

状態遷移図を起こしましょう

18

S0を実行しようとしたら、まずw00とw10を読み出して、、次に、積和演算を実行っと…

Page 19: Tensor flow usergroup 2016 (公開版)

状態遷移図を書いた︕

19

Page 20: Tensor flow usergroup 2016 (公開版)

と思ったら

20

積和演算中に次の重みを読み込んでもよくね…? 依存関係のない処理を

同じ状態に押し込む!↓各状態に符号を割り当て

Page 21: Tensor flow usergroup 2016 (公開版)

FSMをハードウェアに落とし込んで…

21

Page 22: Tensor flow usergroup 2016 (公開版)

メモリや乗算器に割り当てましょう

22

制御部

データパス部

Page 23: Tensor flow usergroup 2016 (公開版)

HDLに起こした結果どうしてこうなった

23

Y = X.dot(W)+B

C/C++: 10⾏

Python: 1⾏

Verilog-HDL: 66⾏

Page 24: Tensor flow usergroup 2016 (公開版)

ということで、スケジューリングに…

24

パトラッシュ、、僕は疲れたよ、、、

Page 25: Tensor flow usergroup 2016 (公開版)

さらに検証が加わると地獄ですよ

25

シミュレーション波形とデータシートを見比べながら永遠と続く…

Page 26: Tensor flow usergroup 2016 (公開版)

どうしよう…

26

実現したい論理回路をハードウェア記述⾔語でもっっっっっっっっっっのすごーく⼤量のHDLで書く(Verilog HDL/ VHDL)

Y = X.dot(W)+B

学習したディイイイプなニューラルネットワークの⾏列演算をあっさり1⾏で書いてしまう

Page 27: Tensor flow usergroup 2016 (公開版)

ということでHigh-Level Synthesis (HLS)• C/C++が⼀般的な⼊⼒• ファミコンを1週間で作ったよ• 2値化Neural netを1か⽉で作ったよ短TATというFPGAのメリットを引き出す

27

Page 28: Tensor flow usergroup 2016 (公開版)

⾼位合成のフロー(従来はこれをすべて⼈⼿で⾏っていた)

28

Input Behavioral Spec. Dataflow   Scheduling     Data‐path generation

Controller (FSM) GenerationMapping to resources

(Binding)

Page 29: Tensor flow usergroup 2016 (公開版)

RTL(HDL)達⼈ v.s HLS達⼈

29J. Cong et. al, “High‐level synthesis for FPGAs: From prototyping to deployment,” IEEE Trans. on CAD, 2011.

Page 30: Tensor flow usergroup 2016 (公開版)

Deep Convolutional Neural NetworkのHLS実装• 依存性のない7重ループの最適化→⾼位合成でも最適化しやすい

...

...

120 nodes10 nodes

16 F. maps5x5

16 F. maps10x10

6 F. maps14x14

6 Feature maps28x28Gray scale

image32x32

5x52x2

5x52x2 5x5

1 2 12 4 21 2 1

⑤⑥

Page 31: Tensor flow usergroup 2016 (公開版)

あともう少し…

31

⾏列演算ライブラリの中⾝をC/C++で書くただし、HDLよりは抽象的(演算器スケジューリング・

FSMは不要)

Y = X.dot(W)+B

⾏列演算をあっさり1⾏で

Y=0;for(i=0; i < m; i++){for( j = 0; j < n; j++){Y += X[i][j]*W[j][i];}}

⾼位合成ツールがHDLを吐いてくれるので従来のフローを通してFPGAに実現できる

Page 32: Tensor flow usergroup 2016 (公開版)

今回作ったもの

32

⾏列演算ライブラリの中⾝をC/C++で書くただし、HDLよりは抽象的(演算器スケジューリング・

FSMは不要)

Y = X.dot(W)+bias

ディープニューラルネットワークをさっくり記述

Y=0;for(i=0; i < m; i++){for( j = 0; j < n; j++){Y += X[i][j]*W[j][i];}}

⾼位合成ツールがHDLを吐いてくれるので従来のフローを通してFPGAに実現できる

ここを⾃動⽣成+α

Page 33: Tensor flow usergroup 2016 (公開版)

なんでTensorFlowなのよ︖• (もちろんChainer (Caffe), Theano版も作ってますよ)

でもね…

• 分散学習が可能(スケールする)• クラウドで動く(計算機管理が不要になる)• みんな使ってる(研究結果を役⽴ててもらえる)

33

Page 34: Tensor flow usergroup 2016 (公開版)

Artificial Neuron (AN)

+

x0=1

x1

x2

xN

...

w0 (Bias)

w1

w2

wN

f(u)u y

xi: Input signalwi: Weightu: Internal statef(u): Activation function (Sigmoid, ReLU, etc.)y: Output signal

y f (u)

u wixii0

N

34

積和演算を何とかしたい…

Page 35: Tensor flow usergroup 2016 (公開版)

2値化ニューラルネットワーク• ⼆値(-1/+1)の乗算• 乗算器をXNORゲートで

35

x1 x2 Y

‐1 ‐1 1

‐1 +1 ‐1

+1 ‐1 ‐1

+1 +1 1

x1 x2 Y

0 0 1

0 1 0

1 0 0

1 1 1

Page 36: Tensor flow usergroup 2016 (公開版)

XNORによる2値化CNN

36

x1

w0 (Bias)

fsgn(Y)Y

z

w1

x2

w2

xn

wn

...

Page 37: Tensor flow usergroup 2016 (公開版)

2値化CNNの効果

37

x1

w0 (Bias)

fsgn(Y)Y

z

w1

x2

w2

xn

wn

...

短精度(4〜8)ビットを2値に置き換え→メモリ帯域の圧縮乗算器をXNORに置き換え→回路⾯積の削減

Page 38: Tensor flow usergroup 2016 (公開版)

2値化CNNの認識精度• 浮動⼩数点CNNとほぼ同じ

38

0

20

40

60

80

100

# of epochs

Classification error (%)

(a) float32 bit precision CNN

1                80              160    2000

20

40

60

80

100

# of epochsClassification error (%)

(b) Binarized CNN

1                80              160    200

単に2値化した場合

提案⼿法

約6%の誤差(VGG‐16を使⽤)H. Nakahara et al., “A memory‐based binarized convolutional deep neural network,”FPT2016 (to appear).

Page 39: Tensor flow usergroup 2016 (公開版)

2値化CNN on FPGA• Raspberry Pi3 Model B

[email protected] quad-core• 1GB RAM• Mnist CNNの処理速度: 85.81 msec/image(Cソースに変換後, gccを⽤いてコンパイル, 1コア動作)• 消費電⼒: 2Watt

• Digilent社 Nexys4 DDR• FPGA Xilinx社Artix-7100T@100MHz• 2880 Kb BRAM• Mnist CNNの処理速度: 1.56 msec/image• 消費電⼒: 1Watt未満(ワットチェッカーでは測定不能でした…)

39

Page 40: Tensor flow usergroup 2016 (公開版)

デモ1: ⼿書き⽂字認識

40

Page 41: Tensor flow usergroup 2016 (公開版)

Deep Q-learning Network• 全部の⼿を試すのは不可能• 報酬を最⼤にする⾏動をDeep Neural Networkで予測Deep Neural Network

+Q-learning

↓Deep Q-learning Network (DQN)

41

Page 42: Tensor flow usergroup 2016 (公開版)

AtariのPongをゲームするDQN

42

...512 neurons

3 neurons→上・下・待機

4x43x3

Arcade Learning Environment(ALE)とかOpenAI Gym

6層のConvolutional Deep Neural Network

操作ゲーム画⾯

記録しておく

Page 43: Tensor flow usergroup 2016 (公開版)

AtariのPongを勉強するDQN

43

...512 neurons

3 neurons→上・下・待機

4x43x3

Arcade Learning Environment(ALE)とかOpenAI Gym

6層のConvolutional Deep Neural Network

得点が上がる操作(最⼤とはしない)

を学習

ゲーム画⾯

シャッフルする

Page 44: Tensor flow usergroup 2016 (公開版)

デモ2: FPGA DQN

44

...512 neurons

3 neurons→上・下・待機

4x43x3

6層の学習済みConvolutional Deep Neural Network

操作 by UART

ゲーム画⾯by UART

Digilent社 Nexys4 DDR(Xilinx社 Artix7 100T搭載)

Page 45: Tensor flow usergroup 2016 (公開版)

On-going Work• 特定FPGAボード向けのプラットフォームを開発中• TensorFlowで設計したCNNを直接Pythonでたたける(もちろんハードウェアも)Arduinoを乗せたり、ARMでLinuxを⾛らせたりして…

• ボードを取り寄せ中

45

Terasic社DE0-nano-SoC Kit

(Atlas-SoC Kit)$99 (academic $90)

※ARM搭載

Terasic社DE10-Lite Board

$85 (academic $55)

Digilent社PYNQ-Z1 Board

$229 (academic $65?)※ARM搭載

Digilent社Arty Board

$99

Page 46: Tensor flow usergroup 2016 (公開版)

まとめ• FPGAをさっくり解説

• HDLのまま設計したら…⼤変だよ• 2値化CNNを実装• TensorFlowからFPGAに⼀気に落とすことが可能に

• 公開まであとちょっと待ってね

46

Page 47: Tensor flow usergroup 2016 (公開版)

(おまけ)FPGA関連お勧め書籍

47

FPGAについて基礎から解説

Verilog-HDLの⽂法書として Cからハードウェアに落とす⽅法を書いた数少ない良書