More Related Content Similar to LUT-Network ~Edge環境でリアルタイムAIの可能性を探る~ (15) LUT-Network ~Edge環境でリアルタイムAIの可能性を探る~2. 自己紹介
• 基本的にサンデープログラマ(平日はサラリーマンやってる2児の父親)
• 1976年生まれ 全国転々としつつも結局、福岡が一番長く、今も福岡在住
• 1998~ μITRON仕様 Real-Time OS HOS-80 をリリース
• 現在 HOS-V4a にて各種組み込みCPUに対応
(ARM,H8,SH,MIPS,x86,Z80,AM,V850,MicroBlaze, etc.)
• 2008~ FPGA用ソフトコアSoC環境 Jelly をリリース(MIPS互換コア)
• 現在 Zynq 上にて Real-Time GPU や LUT-Network の実験など
各種 Real-Time コア開発の実験場と化す
• 2018~ LUT-Network用の環境 BinaryBrain を開発中
• 本日のお題
• リアルタイムコンピューティング(当然Edgeコンピュータ)が大好き
• 電脳メガネ計画(いつかやりたい電脳コイルの世界)
• Real-Time 画像I/O (カメラ[IMX219] & OLED 1000fps駆動)
• Real-Time GPU開発 (frame buffer無し、ゼロ遅延描画)
• Real-Time DNN開発 (超低遅延DNN認識)
2
11. LUT-Network のコンセプト
• 通常のDNN
1. パーセプトロンを配置して結線を定義
2. 学習を実施
3. パーセプトロンの重み係数が得られる
• LUT-Network
1. LUT素子を配置して結線を定義
2. 学習を実施
3. 各LUTのテーブルが得られる
θ
x1
x2
x3
xn
・・・
w1
w2
w3
wn
y
11
12. Network Design
Learning
(e.g. Tensor Flow)
Convert to C++
network
parameter
C++ source code
High Level Synthesis
(e.g. Vivado HLS)
RTL(behavior)
Synthesis
(e.g. Vivado)
Complete
(many LUTs, 100~200MHz)
Network Circuit
Design
network
(FPGA Circuit)
Learning
(BinaryBrain)
RTL(net-list)
Complete
(few LUTs, 300~400MHz)
Synthesis
(e.g. Vivado)
LUT Networkのデザインフロー
【従来】 【LUT-Network】
12
パーセプトロンモデルを合成 そのまま学習するだけ
18. LUTの学習方法
• LUTテーブルの学習方法
• 直接学習(力技での学習実験)
• Micro-MLPによるバイナリ値で学習する方法 (2018/02/02 fpgaxで発表)
• Stochastic-LUTによる確率値で学習する方法 [New!]
• Stochastic-LUTモデルを Micro-MLP的に使ってバイナリ値で学習する方法 [New!]
• バイナリ学習の底上げ
• バイナリ変調を行う方法 [Update]
• 番外(新モデルの非バイナリ応用)
• Stochastic-LUTモデルをStochasticガン無視で、浮動小数点の学習として、パーセプト
ロンの変わりに使う方法 [New!]
18
まだまだ試行錯誤中ですが、いろいろな知見が得られてきました
19. [直接学習] 学習方法
入力値 発生回数 0出力時の損失 1出力時の損失
0 37932 47813.7 48233.9
1 39482 50001.3 49692.9
2 37028 44698.9 44845.7
3 40640 49257.1 49331.0
4 27156 33998.4 33891.0
5 23930 29538.6 29495.2
6 29002 35197.3 35451.4
7 27786 33390.9 33466.9
8 43532 52741.1 52993.5
9 41628 49985.9 50388.5
10 49176 56521.4 56026.1
11 46542 54215.4 54284.9
・・・・
・・・・
・・・・
・・・・
59 34268 41152.9 41215.8
60 22872 28852.4 29000.0
61 17930 22068.9 22112.9
62 24156 28213.2 28227.1
63 24194 28367.0 28450.4
新しいテーブル値
0
1
0
0
1
1
0
0
0
0
1
0
・・・・
0
0
0
0
0
1. LUTテーブルを一旦乱数で埋める
2. ある1個のLUTの出力を0と1それぞれに固定して学習データ全部流す
3. LUTの入力値毎に損失関数の総和を取っておき、損失が減る方向にテーブルを更
新
19
20. [直接学習] MNISTの学習実験
0.6
0.65
0.7
0.75
0.8
0.85
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
MNIST学習実験
学習データ(6万個) 評価データ(1万個)
小規模実験ではあるが、学習に用いたデータでの認識率とほぼ対応する
形で、評価用のデータセットでも認識率の向上が見られた。
層構成:360-180-30 の570個のLUTを利用
結線 :全層ともランダム結線
20
思いの外、過学習的な挙動を示さない
22. [誤差逆伝播] バイナリ活性層 (binary activation layer)
• forward
• Sign()
• 𝑦 =
1 𝑖𝑓 𝑥 ≥ 0,
0 𝑜𝑡ℎ𝑒𝑟𝑤𝑖𝑠𝑒,
• 符号見るだけ
• backward
• hard-tanh()
• 𝑔 𝑥 = 1 𝑥 ≤1
• 小さい値の時のみ伝播
Binary Connect の方法をそのまま拝借(先人の知恵に感謝)
重みは実数なので Batch Normalization はオリジナルの実数版を使う
22
BatchNormalization
Binary-Activation
・
・
・
23. [誤差逆伝播] micro-MLP の学習
Affine Layer
(16~64 perceptron)
Activation Layer
Sigmoid or ReLU
・・・・
・・・・
Affine Layer
(1 perceptron)
Batch Normalization
Activation Layer
Binarize
6 signals input (0.0 or 1.0)
【Learning (FP32) [CPU/GPU]】
1 signal output (0.0 or 1.0)
×16~64
(FP32)
×1 (FP32)
【Prediction (Binary) [FPGA)]】
LUT
(64bit Look-up Table)
6 signals input (H or L)
1 signal output (H or L)
Affine Layer
(16~64 perceptron)
Activation Layer
Sigmoid or ReLU
・・・・
・・・・
Affine Layer
(1 perceptron)
Batch Normalization
Activation Layer
hard-tanh
1 gradient input (FP32)
6 gradients output (FP32)
<Forward> <Backward>
<Forward>
logic
synthesis
× 16~64
(FP32)
×1 (FP32)
×6 (Binary)
×1 (Binary)
×1 (FP32)
×1 (FP32)
×6 (FP32)
×16~64
(FP32)
× 16~64
(FP32)
×1 (FP32)
23
26. オーバーサンプリングによるバイナリ変調モデル
• オーバーサンプリングと量子化による変調
• PWM(Pulse Width Modulation)変調
• 1bitADC(⊿Σ変調), ディザ, etc.
• 変調を行うことで値に応じて確率的に1/0が現れる信号列に変換される
• 計算はバイナリだが、LPFでノイズは取り除かれ階調が回復する
• 階調が回復するので回帰分析など多値へのフィッティングアプリケーションにも応用できる
• 例えば高速度カメラの映像などノイズを含む画像は
そのまま量子化すれば元々確率的に1/0が現れる
変調 バイナリDNN
ノイズや
局部発振器
LPF
26
人間で代替も可能
(人の感覚自体がLPFとしても機能する)
32. [新アイデア] Stochastic-LUTモデル
32
-
*
-
x0
x1
*
W0
binarize
*
*
W1
*
*
W2
*
*
W3
1
1
+ y
2入力LUTの例 x0-x1 を入力する確率変数. W0-W3 をテーブル値とする
W0 が参照される確率 : (1 - x1) * (1 - x0)
W1 が参照される確率 : (1 - x1) * x0
W2 が参照される確率 : x1 * (1 - x0)
W3 が参照される確率 : x1 * x0
y = W0 * (1 - x1) * (1 - x0)
+ W1 * (1 - x1) * x0
+ W2 * x1 * (1 - x0)
+ W3 * x1 * x0
値をすべて観測時に0と1のどちらかの値に決まる確率変数として確率値をFP32で扱います。
この計算グラフは微分可能であるため、誤差逆伝播が可能です。
6入力LUTのグラフは図示すると巨大になるので作成していませんが、同様に作成可能です。
確率的LUTモデルを用いることで、一度に非常に多くのバイナリ値を計算したのと同じ効果が得られるた
め、micro-MLPよりも高速/高精度な結果が得られます。W値はそのままLUT化できます。
これだけでLUTを完全モデル化
Batch-Normalization不要
Activationも不要
39. LUT-Networkの特徴まとめ
• 基本的にはエッジでの推論を効率化する技術
• 学習時はGPU使います
• バイナリ・ニューラル・ネットワークの一種である
• BDNNで可能なものは(原理的には)学習可能(な筈)
• LUT単位の学習なので高密度&高速(300~400MHz)
• ネットワーク定義時に回路規模が決まる
• FPGA内のリソースを決めてから、その範囲での最大の認識率が探れる
• つまりリアルタイム保証を先に行える
通常DNNのFPGA適用 LUT Network
認識率 学習時に決定 出来高払い
(ベストエフォート)
性能 合成結果で出来高払い
(ベストエフォート)
学習に先立って決定
39
40. 学習用OSSの紹介(BinaryBrain)
• 今回の実験の為に開発した環境(C++ & Eigen)
• githubにて公開中
• https://github.com/ryuz/BinaryBrain
• 特徴
• TensorFlowもChainerもTorchもCaffeも知らずノリで書いた(笑)
• 参考書は「ゼロから作るDeep Learning」のみ
• RTL(Verilog)を出力できる[今のところ Xilinxしか試してないですが]
• NCHWでもNHWCでもないCHWNメモリ配置
→ 1bitデータをメモリにパッキングしたままSIMD演算
• CUDA対応、FMA2命令とかも活用
• 普通のDNNもシンプルなCNN程度なら学習可能
(条件を揃えてベンチマークがしたい)
Ver.1(直接学習の実験)→ Ver.2(micro-MLPでの逆伝播の実験)
→ Ver.3を開発中(GPU対応/Stochasticモデル)
40
42. 発表者アクセス先
• 渕上 竜司 (Ryuji Fuchikami)
• e-mail : ryuji.fuchikami@nifty.com
• Web-Site : http://ryuz.my.coocan.jp/
• Blog. : http://ryuz.txt-nifty.com/
• GitHub : https://github.com/ryuz/
• Twitter : https://twitter.com/Ryuz88
• Facebook : https://www.facebook.com/ryuji.fuchikami
• YouTube : https://www.youtube.com/user/nekoneko1024
• レスポンス悪いかもしれませんが、お気軽にお問い合わせください m(_ _)m
42
なお、この資料は当方のこの後 Slide Shareでも公開予定です。
46. FPGAとGPUの比較
46
[FPGA] Digi-Key XPS
品番 LUT 円 円/LUT W W/LUT
XC7A200T-1FBG484C 134,600 22,662 0.168
XC7A100T-1FTG256C 63,400 12,776 0.202
XC7A75T-1FTG256C 47,200 10,835 0.230
XC7A50T-1FTG256C 32,600 6,224 0.191
XC7A35T-1FTG256C 20,800 4,021 0.193
XC7A25T-1CPG238C 14,600 3,849 0.264
XC7A15T-1FTG256C 10,400 3,268 0.314
XC7A12T-1CPG238C 8,000 3,006 0.376
XC7S6-1CSGA225 3,752 1,720 0.458 4.821 0.0013
[GPU] 価格.com Wiki
品番 CUDA cores 円 円/core TDP W/core
RTX 2080Ti 4,352 129,790 29.823 250 0.0574
RTX 2080 2,944 79,800 27.106 215 0.0730
RTX 2070 2,304 53,977 23.428 175 0.0760
RTX 2060 1,920 36,698 19.114 160 0.0833
GTX 1660Ti 1,536 31,980 20.820 120 0.0781
GTX 1660 1,408 25,780 18.310 120 0.0852
GTX 1650 896 16,990 18.962 75 0.0837
GTX 1070Ti 2,432 56,980 23.429 180 0.0740
GTX1060 1,280 21,700 16.953 120 0.0938
GT 1030 384 8,680 22.604 30 0.0781
Jetson Nano 128 12800 100.000 7.5 0.0586
同じことをFPGAとGPUで行った場合、
FPGAだとLUT:20~100個で出来てしまうこと
が、CPU/GPUだと数サイクル使ってしまうよ
うなケースでFPGAが有利
したがって、低bit数の演算であればFPGAに分
がある。
特にLUT-Networkと同じことをCPU/GPUでや
る場合、1個のLUT分の演算で数サイクルを消
費するような関係なので極めて性能差が出る
47. 実例紹介1 [MNIST MLP]
(1000fps 動作)
DNN
(LUT-Net)
MIPI-CSI
RX
Raspberry Pi
Camera V2
(Sony IMX219)
SERDE
S
TX
PS
(Linux)
SERDES
RX
FIN1216
DMA
OLED
UG-9664HDDAG01
DDR3
SDRA
M
I2C
MIPI-CSI
Original Board
PCX-Window
1000fps
640x132
1000fps
control
PL (Jelly)
BinaryBrain
Ether
RTL
offline learning (PC)
ZYBO Z7-20
debug view
47
動画紹介
48. MNIST MLP
総LUT: 1182 個
input:784
layer0: 256
layer1: 256
layer2: 128
layer3: 128
layer4: 128
layer5: 128
layer6: 128
layer7: 30
Camera + OLED込みの全体リソース
DNN部はLUTのみハードマクロで指定
(ぴったり上記のリソース量)
DNN部のみのリソース
250MHz = 250,000,000fps
49. DNN
(LUT-Net)
MIPI-CSI
RX
Raspberry Pi
Camera V2
(Sony IMX219)
SERDE
S
TX
PS
(Linux)
SERDES
RX
FIN1216
DMA
OLED
UG-9664HDDAG01
DDR3
SDRA
M
I2C
MIPI-CSI
Original Board
PCX-Window
1000fps
640x132
1000fps
control
PL (Jelly)
BinaryBrain
Ether
RTL
offline learning (PC)
ZYBO Z7-20
debug view
OSD
(frame-mem)
49
事例紹介2 MNIST CNN
(1000fp動作)
動画紹介
50. MNIST CNN 学習時ログ
fitting start : MnistCnnBin
initial test_accuracy : 0.1518
[save] MnistCnnBin_net_1.json
[load] MnistCnnBin_net.json
fitting start : MnistCnnBin
[initial] test_accuracy : 0.6778 train_accuracy : 0.6694
695.31s epoch[ 2] test_accuracy : 0.7661 train_accuracy : 0.7473
1464.13s epoch[ 3] test_accuracy : 0.8042 train_accuracy : 0.7914
2206.67s epoch[ 4] test_accuracy : 0.8445 train_accuracy : 0.8213
2913.12s epoch[ 5] test_accuracy : 0.8511 train_accuracy : 0.8460
3621.61s epoch[ 6] test_accuracy : 0.8755 train_accuracy : 0.8616
4325.83s epoch[ 7] test_accuracy : 0.8713 train_accuracy : 0.8730
5022.86s epoch[ 8] test_accuracy : 0.9086 train_accuracy : 0.8863
5724.22s epoch[ 9] test_accuracy : 0.9126 train_accuracy : 0.8930
6436.04s epoch[ 10] test_accuracy : 0.9213 train_accuracy : 0.8986
7128.01s epoch[ 11] test_accuracy : 0.9115 train_accuracy : 0.9034
7814.35s epoch[ 12] test_accuracy : 0.9078 train_accuracy : 0.9061
8531.97s epoch[ 13] test_accuracy : 0.9089 train_accuracy : 0.9082
9229.73s epoch[ 14] test_accuracy : 0.9276 train_accuracy : 0.9098
9950.20s epoch[ 15] test_accuracy : 0.9161 train_accuracy : 0.9105
10663.83s epoch[ 16] test_accuracy : 0.9243 train_accuracy : 0.9146
11337.86s epoch[ 17] test_accuracy : 0.9280 train_accuracy : 0.9121
fitting end
50
→ その後95%までは行ったがさすがに小規模すぎた
51. MNIST CNN (DNN部リソース)
CNV3x3
CNV3x3
MaxPol
Affine
CNV3x3
CNV3x3
MaxPol
Affine
// sub-networks for convolution(3x3)
bb::NeuralNetSparseMicroMlp<6, 16>sub0_smm0(1 * 3 * 3, 192);
bb::NeuralNetSparseMicroMlp<6, 16>sub0_smm1(192, 32);
bb::NeuralNetGroup<>sub0_net;
sub0_net.AddLayer(&sub0_smm0);
sub0_net.AddLayer(&sub0_smm1);
// sub-networks for convolution(3x3)
bb::NeuralNetSparseMicroMlp<6, 16>sub1_smm0(32 * 3 * 3, 192);
bb::NeuralNetSparseMicroMlp<6, 16>sub1_smm1(192, 32);
bb::NeuralNetGroup<>sub1_net;
sub1_net.AddLayer(&sub1_smm0);
sub1_net.AddLayer(&sub1_smm1);
// sub-networks for convolution(3x3)
bb::NeuralNetSparseMicroMlp<6, 16>sub3_smm0(32 * 3 * 3, 192);
bb::NeuralNetSparseMicroMlp<6, 16>sub3_smm1(192, 32);
bb::NeuralNetGroup<>sub3_net;
sub3_net.AddLayer(&sub3_smm0);
sub3_net.AddLayer(&sub3_smm1);
// sub-networks for convolution(3x3)
bb::NeuralNetSparseMicroMlp<6, 16>sub4_smm0(32 * 3 * 3, 192);
bb::NeuralNetSparseMicroMlp<6, 16>sub4_smm1(192, 32);
bb::NeuralNetGroup<>sub4_net;
sub4_net.AddLayer(&sub4_smm0);
sub4_net.AddLayer(&sub4_smm1);
// main-networks
bb::NeuralNetRealToBinary<float>input_real2bin(28 * 28, 28 * 28);
bb::NeuralNetLoweringConvolution<>layer0_conv(&sub0_net, 1, 28, 28, 32, 3, 3);
bb::NeuralNetLoweringConvolution<>layer1_conv(&sub1_net, 32, 26, 26, 32, 3, 3);
bb::NeuralNetMaxPooling<>layer2_maxpol(32, 24, 24, 2, 2);
bb::NeuralNetLoweringConvolution<>layer3_conv(&sub3_net, 32, 12, 12, 32, 3, 3);
bb::NeuralNetLoweringConvolution<>layer4_conv(&sub4_net, 32, 10, 10, 32, 3, 3);
bb::NeuralNetMaxPooling<>layer5_maxpol(32, 8, 8, 2, 2);
bb::NeuralNetSparseMicroMlp<6, 16>layer6_smm(32 * 4 * 4, 480);
bb::NeuralNetSparseMicroMlp<6, 16>layer7_smm(480, 80);
bb::NeuralNetBinaryToReal<float>output_bin2real(80, 10);
xc7z020clg400-1
51
DNN部の単体性能
250MHz / (28x28) = 318,877fps
53. Learning prediction
operator
CPU
1Core
operator
CPU 1Core
(1 weight calculate instructions)
FPGA
(XILIN 7-Series)
ASIC
multi-cycle pipeline multi-cycle pipeline
Affine
(Float)
Multiplier
+ adder
0.25
cycle
Multiplier
+ adder
0.125 cycle
(8 parallel [FMA])
[MUL] DSP:2
LUT:133
[ADD] LUT:413
左×node数 gate : over 10k gate : over 10M
Affine
(INT16)
Multiplier
+ adder
0.125
cycle
Multiplier
+ adder
0.0625 cycle
(16 parallel)
[MAC] DSP:1 左×node数 gate : 0.5k~1k gate : over 1M
Binary
Connect
Multiplier
+ adder
0.25
cycle
adder
+adder
0.125 cycle
(8 parallel)
[MAC] DSP:1 左×node数 gate : 100~200 左×node数
BNN/
XNOR-Net
Multiplier
+ adder
0.25
cycle
XNOR
+popcnt
0.0039+0.0156 cycle
(256 parallel)
LUT:6~12
(接続数次第)
LUT:400~10000
(接続数次第)
gate : 20~60 左×node数
6-LUT-Net μPLD
4.6
cycle
LUT
1.16 cycle
(6 input load
+ 1 table load) / 6
(256 parallel)
LUT : 1
(over spec)
LUT : 1
(fit)
gate : 10~30
(over spec)
gate : 10~30
2-LUT-Net
Multiplier
+ adder
0.5
cycle
logic-gate
1.5 cycle
(2 input load
+ 1 table load) / 2
LUT : 1
(over spec)
LUT : 1
(over spec)
gate : 1
(over spec)
gate : 1
(fit)
演算機リソース規模について
※ 重要なところ意外は主観で適当に書いてます m(_ _)m
53
全結線をpipeline展開すると規模爆発するが、疎結合のLUT-Netならフィット
55. 結線の問題
• 疎接続する時点で「どこをどう繋ぐか?」は課題として発生
• まだMLPでのMNIST実験だけだが
• 下手に規則正しく繋ぐと過学習する模様!?(要精査)
• ランダム結線は今のところ意外に性能が良い(というか今のところ最善?)
• だが配線混雑でルーティングできないケースも発生
• CNNだとノード数がある程度小さくなるのでこの問題は大幅緩和
• 密結合での重み主体で結線を疎結合化してもランダムに勝てていない
0
0.2
0.4
0.6
0.8
1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
ランダム結線
test train
0
0.2
0.4
0.6
0.8
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
隣接結線
test train
55
過学習
58. 深層学習用のハードウェアとしての考察
• Learning用ハードウェアとPredictionハードウェアの関係
• Learning用ハードウェア
• 学習の可能性を極力排除しない余裕を持った演算
• Prediction用ハードウェア
• 実効性能重視(コスト[$/FLOPS], 熱・バッテリー[W/FLOPS])
• LUT-NetworkはPredictionの効率化を狙った新しい技術提案
• 通常Learning用ハードウェアはそのままPredictionもこなせる(上位互換)が、
LUT-Networkは異なる
• 正攻法の後者の追及は量子化とSparse化
→ LUT-Network は初めからこのボリュームを最大に捻ってスタート
• 学習結果のテーブル化という新しい効率化が本質
• 既存Learning用ハードウェアのアーキテクチャ改善はLUT-Network用のネット
の加速にあまり寄与してくれないかも(課題)
58
効率よく
学習結果を
移行させたい
60. 技術ポイントまとめ(計算機効率)
• 演算器個数×クロック周波数以上の演算は出来ない
• CPU/GPUは上限が決まっている
• ASICやFPGAでは演算器に回せるリソース量(トランジスタ数)は設計次第
• 演算器個数を増やすには
• 演算器に使うトランジスタの比率を増やす(制御や記憶のリソースを減らす)
• 専用エンジン(ASIC) > FPGA ≒ GPU > CPU
• 演算器を小さくする(演算密度を上げる)
• テーブル化(LUT-Net) < INT1 (Binary-Net) < INT8 < FP16 < FP32
• 演算器稼働率を上げる(無駄な計算はしない)
• 学習時には多くの可能性が欲しい
• backwardで勾配消失しない十分な精度 → FP16~FP32
• 十分な結合 → 演算できる範囲で密結合
• 推論時には結果に影響する演算だけを効率よくやりたい
• 不要な計算の削除 → 疎結合網
60
61. Real-Time DNNしながらFPGAのリリースを使い尽くす
• LUT
• LUT-Networkのレイヤーに利用
• Block-RAM(SRAM)
• 畳み込みのラインバッファ
• DSP(積和演算機)
• 入力の1段目だけ普通の掛け算にする
• 画像を認識する上で多値の勾配などの情報は魅力的
• I/O
• 外界の機器と演算ユニットを直結
• エッジコンピューティングの醍醐味
• 高速シリアル
• 別のエッジと連携
• ロジック規模拡張に複数FPGA
• DDR3/4-SDRAM
• U-Net や RNNのバッファとして
• AIコア(Versal ACAP)
• さてどうするべきか?
61
LUT以外のリソースも使い切ってこそのFPGA活用
62. リファレンス
• BinaryConnect: Training Deep Neural Networks with binary weights during propagations
https://arxiv.org/pdf/1511.00363.pdf
• Binarized Neural Networks
https://arxiv.org/abs/1602.02505
• Binarized Neural Networks: Training Deep Neural Networks with Weights and Activations
Constrained to +1 or -1
https://arxiv.org/abs/1602.02830
• XNOR-Net: ImageNet Classification Using Binary Convolutional Neural Networks
https://arxiv.org/abs/1603.05279
• Xilinx UltraScale Architecture Configurable Logic Block User Guide
https://japan.xilinx.com/support/documentation/user_guides/ug574-ultrascale-clb.pdf
62