SlideShare una empresa de Scribd logo
1 de 50
LUT-Network
~本物のリアルタイムコンピューティングを目指して~
Ryuji Fuchikami
渕上 竜司
自己紹介
• 基本的にサンデープログラマ(平日はサラリーマンやってる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 を開発中
• 本日のお題
• 電脳メガネ計画(他にもいろいろやってますが今はこれ)
• Real-Time 画像I/O (カメラ[IMX219] & OLED 1000fps駆動)
• Real-Time GPU開発 (frame buffer無し、ゼロ遅延描画)
• Real-Time DNN開発 (超低遅延DNN認識)
2
まなみ・画
リアルタイムコンピューティングとは?
• 現実世界のダイナミクスに計算機の方を合わせる技術
• 人が計算機に合わせることに疑問を持たなくなってませんか?
• 世の中には複数の人やモノがあり、相互作用したり、自律制御したり
• 「スループットが破綻しない」 ≠ 「真のリアルタイム処理」
• 対象のダイナミクスに応じた応答性が出せてこそ(超体感コンピューティング)
人
人
モ
ノ
モ
ノ
デジタルミラー
どこでも窓
遠隔運転
宇宙探査ロボ
介護ロボ
電脳メガネ
生活空間に計算を
アドオンするということ
3
計算
機
自律制御
動画紹介
多くの計算機は
生活動線の枠外で稼動
リアルタイムコンピューティングの遷り変わり
• マイコン(Single ALU)の時代
• 貴重なトランジスタを割り当てたALUを如何に有効に使うか?
• どのタスクから順に処理するかで現実世界に及ぼす価値が変わる
→ スケジューリング問題 (Real-Time OS のスケジューラで解く)
• 並列演算器の時代
• 豊富なトランジスタを如何に休ませずに稼動させるかに問題が変化
• 効率を上げれば確かに速くはなるが、リアルタイム保証は逆に困難に
(計算が速い ≠ リアルタイム処理)
• ノイマンアーキテクチャからの脱却
→ データフロープロセッサとして、クリティカルパス短縮問題へ
(アルゴリズムとセットで設計)
4
並列化時代のリアルタイムコンピューティング(提案)
メモリ
プロセッサ入力装置 出力装置
間に合わなければコマ落ち(fps低下)
一度メモリに入らないと演算できない
命令フロー型のプログラミング(ノイマン型)
データフロー型のプログラミング
メモリ
プロセッサ入力装置 出力装置
・データは最短経路で出力に反映
・入出力データを直接演算
・メモリには何でも書ける
/(過去データは)何でも読める
[チューリング完全性の維持]
5
データフロープログラミングに適したモダンな手法
Deep
Neural
Network
6
Deep Neural Network
• リアルタイムコンピューティングにDNNを適用したい
• ツールさえ揃えば、DNN研究者は明日から優秀なリアルタイムプログラマ
• 課題
• DNNの演算量が非常に多い(≒ 結果として非常に遅い)
→ 今のままのだと演算資源がデータパスに入りきれない
• DNNがGPUなどの非リアルタイム型計算機に馴染む方向に進化中
→ 由々しき問題。FPGAはもっと自由(GPUと同じ土俵で戦う必要なし)
• DNNの性能をfpsで語る風潮
→ ベストエフォート(出来高払い)ではなくリアルタイム保証したい
• 解決に向けたアプローチ
• FPGA + LUT-Network ← やっと本題
7
LUT-Network とは?
FPGAのLUTで
作ったネット
ワーク
8
LUT-Network の概要
• 通常のDNN
1. ニューロ素子を配置して結線を定義
2. 学習を実施
3. 各ニューロ素子の重み係数が得られる
• LUT-Network
1. LUT素子を配置して結線を定義
2. 学習を実施
3. 各LUTのテーブルが得られる
θ
x1
x2
x3
xn
・・・
w1
w2
w3
wn
y
9
先に現在の成果の紹介
10
xc7z020clg400-1
こんな微小リソース量で 認識が1ミリ秒の遅延でできてます
MNISTコア単体性能CNN時 318,877fps(まだ本気ではない)
カメラも含めたシステム動作1000fps
LUT-Networkの特徴
• 基本的にはエッジでのPredictionの効率化技術
• バイナリ・ニューラル・ネットワークの一種である
• BDNNで可能なものは(原理的には)学習可能(な筈)
• LUT単位の学習なので高密度&高速(300~400MHz)
• ネットワーク定義時に回路規模が決まる
• FPGA内のリソースを決めてから、その範囲での最大の認識率が
探れる
• つまりリアルタイム保証を先に行える
通常DNNのFPGA適用 LUT Network
認識率 学習時に決定 出来高払い
(ベストエフォート)
性能 合成結果で出来高払い
(ベストエフォート)
学習に先立って決定
11
そもそも論として今の回路開発って....
12
LUT
LUT
LUT
LUT
LUT
LUT
何かの認識
目標
数式どおり実行する回路
対象データを何か入力して良い結果を出力するのが目的
(それ以上でも以下でもない)
認識器(目的)の回路化ではなく、計算機(手段)の回路化になってませんか?
無駄多くないですか?
数式
(アルゴリズム)
FPGA合成プログラミング
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】
13
どうやってLUTを学習させるのか?
• LUTを直接学習
• Trainデータに対して、損失関数が最小化するように直接LUTテーブルを最適化
• 学習可能な構成に制約
• MLPのみ学習可能
• 単独で大きなネットの直接学習は困難(別のBDNNから層単位で模倣学習は可能)
• 勾配を用いないので非Trainデータに対する特性が従来DNNと異なる可能性
(Adversarial Examplesなどに効果ないか?)
• 誤差逆伝播によって学習
• BDNNの手法を応用
• 畳込みを含む基本的なネットワークの学習が可能
2つのアイデア
14
[直接学習] 学習方法
入力値 発生回数 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の入力値毎に損失関数の総和を取っておき、損失が減る方向にテーブルを
更新
15
[直接学習] 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を利用
結線 :全層ともランダム結線
16
思いの外、過学習的な挙動を示さない
[直接学習] 模倣学習の可能性について(仮説)
• まだなんの実験できていないので仮説ですが
• 巨大なネットについて
• 現状のままでは巨大なネットは学習困難(課題)
• ただし従来のバイナリネットワークの手法で学習された巨大なネットの学習
結果を模倣できる可能性はある。
• 各層個別に、学習データの入出力結果のみを取り出して学習できない
か?
• 非学習データに対しては異なる特性を示す可能性がないか?
• そもそも学習に勾配を用いていないので、Adversarial Examples攻撃
に耐性が無いか?
17
[直接学習] 模倣学習によるLUT化のアイデア(未検証)
Affine
Binarize
im2col
BatchNorm
col2im
BinAct
ReLU
Binarize
CONV
Affine
SoftMax
従来のネット
BinAct
CONV
Affine
BatchNorm
BinAct
BatchNorm
Affine
SoftMax
BinAct
BatchNorm
活性化層の
バイナリ化
畳み込み層の
Loweringによる
Affine化
Binarize
im2col
col2im
SoftMax
LUT Layer
LUT Layer
LUT Layer
・・・
LUT Layer
LUT Layer
LUT Layer
・・・
模倣学習
まだ試せるところまで作りこめていないです.... 18
[直接学習] FPGAのLUTの動的変更について
• 重みの変更を動的にやるにはLUTの
テーブル変更が必要
• パーシャルリコンフィギュレー
ショでもよいが、Xilinx の
SRLC32E とかは書き換え可能な
LUTとして使えるのでは?
• いっそ学習に使えないか?
• LUTの動作はCPUで行うと遅い
• LUTテーブルが動的に変更できれ
ば学習に使えるのでは?
• 統計テーブルを作るための信号引
き出しが課題?
• パーシャルリコンフィギュレー
ションとも併用でなんとかならな
いか?
19
~ FPGAでLearningもやれる可能性 ~
[誤差逆伝播] 誤差逆伝播法による手法
• LUTと同じ入出力条件のニューラルネットワークの定義
• 6入力1出力のバイナリ結合のNetwork
• 従来のバイナリネットを疎結合にしただけ? → No!
• 入出力だけバイナリ
• パーセプロトン+BN+BinAct をまとめて1個のLUT
• 内部はフル実装
• 重み係数も計算も浮動小数点精度
20
LUTmapping
BatchNormalization
Binary-Activation
・
・
・
20
















yxwvu
tsrqp
onmlk
jihgf
edcba
















000
000
000
000
000
wv
ts
ok
gf
db
Dense-Affine (Fully Connection)
Sparse-Affine (最初のアイデア)
・
・
・
synthesis
LUT
LUT
LUT
LUT
LUT
LUT
LUTmapping
BatchNormalization
Binary-Activation
BatchNormalization
Binary-Activation
Deep Logic
(Low-speed and Middle
Performance)
同じくXORはだめ
でも高速(300MHz~400MHz)
1層ではXORは学習できない
100MHz~200MHz
micro-MLPを束ねた層(現在の実装)
LUTmapping
BatchNormalization
Binary-Activation
1層でXORも学習できる
高速(300MHz~400MHz)
・
・
・
Simple Logic
(High-speed and Low Performance)
Simple Logic
(High-speed and High Performance)
BNもLUT内に含める
隠れ層もLUT内に含める
この単位を micro-MLP として定義
[誤差逆伝播] アイデアの変遷
21
[誤差逆伝播] バイナリ活性層 (binary activation layer)
• forward
• Sign()
• 𝑦 =
1 𝑖𝑓 𝑥 ≥ 0,
0 𝑜𝑡ℎ𝑒𝑟𝑤𝑖𝑠𝑒,
• 符号見るだけ
• backward
• hard-tanh()
• 𝑔 𝑥 = 1 𝑥 ≤1
• 小さい値の時のみ伝播
Binary Connect の方法をそのまま拝借(先人の知恵に感謝)
重みは実数なので Batch Normalization はオリジナルの実数版を使う
22
BatchNormalization
Binary-Activation
・
・
・
[誤差逆伝播] Batch Normalization
(計算式は変えずに実装だけ工夫)

N
i
ix
N 1
1
x

N
i
ix
N 1
1

2
x x
x
1

* * 



N
i
ix
N 1
1
x

N
i
ix
N 1
21

2
x
 x
x
1
* * 


x1 = 0, x2 =0;
for ( i = 0; i < n; ++i ) {
x1 += x[i];
}
mean = x1 / n;
for ( i = 0; i < n; ++i )
x2 += (x[i] - mean) * (x[i] - mean);
}
var = x2 / n;
x1 = 0, x2 =0;
for ( i = 0; i < n; ++i ) {
x1 += x[i];
x2 += x[i] * x[i];
}
mean = x1 / n;
var = x2 / n - mean * mean;
x tmp y
x
Σx
y
Σx2
dx
Σx
dy
back
x
back back
dy
Σx Σx2
tmp
forward backward
forward backward
re-calc
23
・Batch Normalization多用するので最適化が重要
・平均と分散を1パスで計算
・中間処理用のメモリを大幅削減
・そのままだと精度が下がるのでループ内で誤差蓄積
変数を別に準備して対策。
BatchNormalization
Binary-Activation
・
・
・
[誤差逆伝播] パーセプトロン部分
6次のXORパターンを学習実験
中間層はいくら増やしても
Predictionのリソースは増えない
数が多いほど学習性能は高い
(Learning時の計算量は増える)
数が少ないとそもそも学習できな
いケースが多発(局所解)
20個以上あれば大丈夫?
(調整も今後の課題)
24
中間層に何個のパーセプトロンがあれば十分か?
BatchNormalization
Binary-Activation
・
・
・
中間層の個数を変えて、直接学習と比較
LUT数570個小さなMLPにおける直接学習と誤差逆伝播法の比較
適用可能な範囲においては直接学習は優秀
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
学習方式比較 (360-180-30 MLPでのMNIST)
直接学習 SparseAffine μMLP<4> μMLP<8> μMLP<16> μMLP<32> μMLP<64>
25
[誤差逆伝播] 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)
26
Learning Prediction
Matrix
(行列)
Weight
(重み)
Activation
(活性化)
Convolution
(畳み込み層)
Deep
Network
performance of
CPUs/GPUs
performance of
FPGA
Binary
Connect
Dense
(密行列)
Binary
(2値)
Real
(実数)
OK
Binarized
Neural
Network
Dense
(密行列)
Binary
(2値)
Binary
(2値)
OK
XNOR-
Network
Dense
(密行列)
Binary
(2値)
Binary
(2値)
OK
LUT-
Network
Sparse
(疎行列)
Real
(実数)
Binary
(2値)
OK ?
(原理的にXNOR-Netより
有利なはず)
good(良い)
excellent(非常に良い)
bad(イマイチ)
1 node → many adders
1 node → many XNOR
1 node → many XNOR
1 node → 1 LUT
excellent(非常に良い)
[誤差逆伝播] 従来の Binary Networkとの比較
27
普通のバイナリネットは Wightの縮小が目的だが、
LUT-NetではここはRealのまま放置!
学習環境(BinaryBrain)
• 今回の実験の為に開発した環境(C++ & Eigen)
• githubにて公開中
• https://github.com/ryuz/BinaryBrain
• 特徴
• 直接学習/逆伝播のどちらも計算可能
• RTL(Verilog)を出力できる[今のところ Xilinxしか試してないですが]
• TensorFlowもChainerもTorchもCaffeも知らずノリで書いた(笑)
• 参考書は「ゼロから作るDeep Learning」のみ
• 大半は車輪の再発明
• 6入力LUTの処理をOpenMP+AVX (コア数×256並列)で記述
• 1bitデータで構成されたテンソルをメモリに稠密に格納できるバッファオブジェクト
• 逆伝播はFMA2命令でFP32演算を普通に記述(コア数×8並列)
• 普通のDNNもシンプルなCNN程度なら学習可能
(なるべく条件を揃えてベンチマークがしたい)
Ver.1(直接学習の実験)→ Ver.2(逆伝播の実験)
→ 現在GPUを使った本格的な環境としてVer.3を開発中
28
実例紹介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
29
動画紹介
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
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)
31
事例紹介2 MNIST CNN
(1000fp動作)
動画紹介
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
32
→ その後95%までは行ったがさすがに小規模すぎた
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
33
DNN部のみ
250MHz / (28x28) = 318,877fps
MNIST CNN (システム全体リソース)
Camera + OLED込みの全体リソース
34
シミュレーション結果
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
35
バイナリ化による精度変化
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1
1 2 3 4 5 6 7 8 9 101112131415161718192021222324252627282930313233
全結線CNNのバイナリ化比較
ReLU BinAct
CNV3x3
Binarize
Activate
CNV3x3
Activate
MaxPol
Dropout
Affine
Activate
Dropout
Affine
SoftMax
36
単純にバイナリ化すると性能は落ちる(ある意味当たり前)
バイナリ化して浮いたリソースで規模の増強などが必要
結線の問題
• 疎接続する時点で「どこをどう繋ぐか?」は課題として発生
• まだ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
37
過学習
Real-Time化に向けたアーキ考察 (例:U-Net)
Conv
Conv
Pooling
Conv
Conv
UP
Conv
Conv
frame
memory
frame
memory
Motion
Compensation
Pooling
Conv
Conv
Conv
Conv
UP
Conv
Conv
Pooling
Conv
Conv
UP
Conv
Conv
frame
memory
Motion
Compensation
Motion
Compensation
SDRAM
SDRAM
SDRAM
pooling後のデータは解像度が低いので1frame前のものを
動き補償して使えばよいのでは?
ハイスピードビジョンの動き探索はとても軽量。
一番上だけ最新なら結果も最新
current frame
previous frame
previous frame
previous frame
38
Real-Timeで 最も尤もらしい結果を出力するアーキ
39
DNN
Video-In
ME MC
Video-Out
Frame Memory
オーバーサンプリング系は誤差を次のフレーム以降に持ち越せるので多少間違えてもOK
IIRフィルタに帰着できる
Real-Time DNN の時間軸方向活用案
• Real-Time = 時間軸を計算に織り込む
• オーバーサンプリングと変調と量子化
• ⊿Σ変調
• 確率共鳴
• レイテンシ(応答性)を上げる為にスループット(fps)を上げると後者はオーバースペック
になる → そこを量子化にまわす
• 高速度カメラは揺らぎを加えるまでもなく元々ノイズが多い。
LPF(ローパスフィルタ)通すと積分されて綺麗な絵になる
• サーバーサンプリングするほど強い量子化が可能
→ より回路は小さくなり、レイテンシは減少する
• LPFは人間を持って代替できる場合もあるし、IIRとかFIRとかカルマンフィルタとかも可
変調
量子化
DNN
確率的揺らぎ
LPF
40
深層学習用のハードウェアとしての考察
• Learning用ハードウェアとPredictionハードウェアの関係
• Learning用ハードウェア
• 学習の可能性を極力排除しない余裕を持った演算
• Prediction用ハードウェア
• 実効性能重視(コスト[$/FLOPS], 熱・バッテリー[W/FLOPS])
• LUT-NetworkはPredictionの効率化を狙った新しい技術提案
• 通常Learning用ハードウェアはそのままPredictionもこなせる(上位互換)が、
LUT-Networkは異なる
• 正攻法の後者の追及は量子化とSparse化
→ LUT-Network は初めからこのボリュームを最大に捻ってスタート
• 学習結果のテーブル化という新しい効率化が本質
• 既存Learning用ハードウェアのアーキテクチャ改善はLUT-Network用のネット
の加速にあまり寄与してくれないかも(課題)
41
効率よく
学習結果を
移行させたい
GPUを使ったLUT-Netの学習に向けて
42
BatchNormalization
Binary-Activation
・
・
・
μMLP1個の学習
global memory
CUDA
(SM)
shared memory
(L1)
AVX2 (i7-4770) CUDA(GT 1030) 高速化
μMLP forward 94ms 16ms 5.8倍
μMLP backward 603ms 236ms 2.5倍
Im2Col forward 663ms 15ms 44.2倍
Im2Col backward 498ms 43ms 11.5倍
CUDAのSMのアーキがワーキングセットとしてジャストフィット!
L1メモリ部分を排除してDense Tensorの演算の効率を上げるDNN専用
チップより、普通のGPUがLUT-Netの学習には向いている可能性
[少しCUDAも書いて実験]
※ GT1030は論理性能でi7-4770の2倍ぐらい。コーディングの気合の入れ方にそもそもムラが大きい
技術ポイントまとめ(計算機効率)
• 演算器個数×クロック周波数以上の演算は出来ない
• CPU/GPUは上限が決まっている
• ASICやFPGAでは演算器に回せるリソース量(トランジスタ数)は設計次第
• 演算器個数を増やすには
• 演算器に使うトランジスタの比率を増やす(制御や記憶のリソースを減らす)
• 専用エンジン(ASIC) > FPGA ≒ GPU > CPU
• 演算器を小さくする(演算密度を上げる)
• テーブル化(LUT-Net) < INT1 (Binary-Net) < INT8 < FP16 < FP32
• 演算器稼働率を上げる(無駄な計算はしない)
• 学習時には多くの可能性が欲しい
• backwardで勾配消失しない十分な精度 → FP16~FP32
• 十分な結合 → 演算できる範囲で密結合
• 推論時には結果に影響する演算だけを効率よくやりたい
• 不要な計算の削除 → 疎結合網
43
今後に向けて
• DNNとしての可能性(正攻法)
• Predictionとして
• Sparse性に関する取り組み → 結線最適化どうするか?
• 量子化に対する取り組み → 入力データの特徴を捉えた量子化(傾きなどの活用?)
• Learning系
• GPUを活用した学習環境の強化に対する取り組み
→ BinaryBrain Ver3 に向けてまじめな設計を検討着手
• 大規模ネットワークへの挑戦(例えばVGG16ぐらい?)
→ GPU化と Google colab など
• Recurrentなどのまだ取り組めていない分野への挑戦
• 信号処理方式としての可能性(オーバーサンプリングの活用)
• オーバーサンプリング×確率事象のDNNによる表現方法
• ⊿Σ的な概念で時間軸も計算に入れて損失関数を考える
• 時間フィルタをネット内に入れ込むことでバイナリに多値性を与えられないか?
• 脳のシナプスの発火には頻度という時間軸の情報もある?(間違ってたらすいません)
44
今後ものんびり楽しくやっていきます!
ご静聴ありがとうございました
45
発表者アクセス先
• 渕上 竜司 (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
46
以下、予備資料
47
LUTモデルの数学的な考察
48
input[n-1:0]
output
入力をn個とすると、テーブル自体がn次元のデータ
下記はXORの2次元テーブルを図示したもの
・テーブル値を頂点の値として補完できるし、多値も取れる
・入力はテーブルの位置を指すインデックス
・誤差逆伝播に対しては
- 入力をテーブルの傾きに応じて答えに近づく方にずらす
- テーブル内の値を答えに近づく方に変化させる
・LUTをそのまま誤差逆伝播で学習させることは可能か?
Real-Time DNNしながらFPGAのリリースを使い尽くす
• LUT
• LUT-Networkのレイヤーに利用
• Block-RAM(SRAM)
• 畳み込みのラインバッファ
• DSP(積和演算機)
• 入力の1段目だけ普通の掛け算にする
• 画像を認識する上で多値の勾配などの情報は魅力的
• I/O
• 外界の機器と演算ユニットを直結
• エッジコンピューティングの醍醐味
• 高速シリアル
• 別のエッジと連携
• ロジック規模拡張に複数FPGA
• DDR3/4-SDRAM
• U-Net や RNNのバッファとして
• AIコア(Versal ACAP)
• さてどうするべきか?
49
LUT以外のリソースも使い切ってこそのFPGA活用
リファレンス
• 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
50

Más contenido relacionado

La actualidad más candente

Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Preferred Networks
 
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門
Norishige Fukushima
 
DEEP LEARNING、トレーニング・インファレンスのGPUによる高速化
DEEP LEARNING、トレーニング・インファレンスのGPUによる高速化DEEP LEARNING、トレーニング・インファレンスのGPUによる高速化
DEEP LEARNING、トレーニング・インファレンスのGPUによる高速化
RCCSRENKEI
 

La actualidad más candente (20)

TensorFlow XLAは、 中で何をやっているのか?
TensorFlow XLAは、 中で何をやっているのか?TensorFlow XLAは、 中で何をやっているのか?
TensorFlow XLAは、 中で何をやっているのか?
 
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
 
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門
 
明日使えないすごいビット演算
明日使えないすごいビット演算明日使えないすごいビット演算
明日使えないすごいビット演算
 
Recent Advances on Transfer Learning and Related Topics Ver.2
Recent Advances on Transfer Learning and Related Topics Ver.2Recent Advances on Transfer Learning and Related Topics Ver.2
Recent Advances on Transfer Learning and Related Topics Ver.2
 
Ultra96ボードでYOLOを高速化
Ultra96ボードでYOLOを高速化Ultra96ボードでYOLOを高速化
Ultra96ボードでYOLOを高速化
 
第10回 配信講義 計算科学技術特論A(2021)
第10回 配信講義 計算科学技術特論A(2021)第10回 配信講義 計算科学技術特論A(2021)
第10回 配信講義 計算科学技術特論A(2021)
 
CuPy解説
CuPy解説CuPy解説
CuPy解説
 
[DL輪読会]Convolutional Conditional Neural Processesと Neural Processes Familyの紹介
[DL輪読会]Convolutional Conditional Neural Processesと Neural Processes Familyの紹介[DL輪読会]Convolutional Conditional Neural Processesと Neural Processes Familyの紹介
[DL輪読会]Convolutional Conditional Neural Processesと Neural Processes Familyの紹介
 
DEEP LEARNING、トレーニング・インファレンスのGPUによる高速化
DEEP LEARNING、トレーニング・インファレンスのGPUによる高速化DEEP LEARNING、トレーニング・インファレンスのGPUによる高速化
DEEP LEARNING、トレーニング・インファレンスのGPUによる高速化
 
Xbyakの紹介とその周辺
Xbyakの紹介とその周辺Xbyakの紹介とその周辺
Xbyakの紹介とその周辺
 
最近のDeep Learning (NLP) 界隈におけるAttention事情
最近のDeep Learning (NLP) 界隈におけるAttention事情最近のDeep Learning (NLP) 界隈におけるAttention事情
最近のDeep Learning (NLP) 界隈におけるAttention事情
 
CRC-32
CRC-32CRC-32
CRC-32
 
機械学習による統計的実験計画(ベイズ最適化を中心に)
機械学習による統計的実験計画(ベイズ最適化を中心に)機械学習による統計的実験計画(ベイズ最適化を中心に)
機械学習による統計的実験計画(ベイズ最適化を中心に)
 
LDA入門
LDA入門LDA入門
LDA入門
 
DNNのモデル特化ハードウェアを生成するオープンソースコンパイラNNgenのデモ
DNNのモデル特化ハードウェアを生成するオープンソースコンパイラNNgenのデモDNNのモデル特化ハードウェアを生成するオープンソースコンパイラNNgenのデモ
DNNのモデル特化ハードウェアを生成するオープンソースコンパイラNNgenのデモ
 
猫でも分かるVariational AutoEncoder
猫でも分かるVariational AutoEncoder猫でも分かるVariational AutoEncoder
猫でも分かるVariational AutoEncoder
 
機械学習で泣かないためのコード設計 2018
機械学習で泣かないためのコード設計 2018機械学習で泣かないためのコード設計 2018
機械学習で泣かないためのコード設計 2018
 
数学で解き明かす深層学習の原理
数学で解き明かす深層学習の原理数学で解き明かす深層学習の原理
数学で解き明かす深層学習の原理
 
【DL輪読会】Llama 2: Open Foundation and Fine-Tuned Chat Models
【DL輪読会】Llama 2: Open Foundation and Fine-Tuned Chat Models【DL輪読会】Llama 2: Open Foundation and Fine-Tuned Chat Models
【DL輪読会】Llama 2: Open Foundation and Fine-Tuned Chat Models
 

Similar a LUT-Network ~本物のリアルタイムコンピューティングを目指して~

[AI05] 目指せ、最先端 AI 技術の実活用!Deep Learning フレームワーク 「Microsoft Cognitive Toolkit 」...
[AI05] 目指せ、最先端 AI 技術の実活用!Deep Learning フレームワーク 「Microsoft Cognitive Toolkit 」...[AI05] 目指せ、最先端 AI 技術の実活用!Deep Learning フレームワーク 「Microsoft Cognitive Toolkit 」...
[AI05] 目指せ、最先端 AI 技術の実活用!Deep Learning フレームワーク 「Microsoft Cognitive Toolkit 」...
de:code 2017
 
Or seminar2011final
Or seminar2011finalOr seminar2011final
Or seminar2011final
Mikio Kubo
 
もしも… Javaでヘテロジニアスコアが使えたら…
もしも… Javaでヘテロジニアスコアが使えたら…もしも… Javaでヘテロジニアスコアが使えたら…
もしも… Javaでヘテロジニアスコアが使えたら…
Yasumasa Suenaga
 

Similar a LUT-Network ~本物のリアルタイムコンピューティングを目指して~ (20)

LUT-Network ~Edge環境でリアルタイムAIの可能性を探る~
LUT-Network ~Edge環境でリアルタイムAIの可能性を探る~LUT-Network ~Edge環境でリアルタイムAIの可能性を探る~
LUT-Network ~Edge環境でリアルタイムAIの可能性を探る~
 
LUT-Network Revision2
LUT-Network Revision2LUT-Network Revision2
LUT-Network Revision2
 
「ゼロから作るDeep learning」の畳み込みニューラルネットワークのハードウェア化
「ゼロから作るDeep learning」の畳み込みニューラルネットワークのハードウェア化「ゼロから作るDeep learning」の畳み込みニューラルネットワークのハードウェア化
「ゼロから作るDeep learning」の畳み込みニューラルネットワークのハードウェア化
 
Enjoy handwritten digits recognition AI !!
Enjoy handwritten digits recognition AI !!Enjoy handwritten digits recognition AI !!
Enjoy handwritten digits recognition AI !!
 
Pythonとdeep learningで手書き文字認識
Pythonとdeep learningで手書き文字認識Pythonとdeep learningで手書き文字認識
Pythonとdeep learningで手書き文字認識
 
[AI05] 目指せ、最先端 AI 技術の実活用!Deep Learning フレームワーク 「Microsoft Cognitive Toolkit 」...
[AI05] 目指せ、最先端 AI 技術の実活用!Deep Learning フレームワーク 「Microsoft Cognitive Toolkit 」...[AI05] 目指せ、最先端 AI 技術の実活用!Deep Learning フレームワーク 「Microsoft Cognitive Toolkit 」...
[AI05] 目指せ、最先端 AI 技術の実活用!Deep Learning フレームワーク 「Microsoft Cognitive Toolkit 」...
 
Deep learning実装の基礎と実践
Deep learning実装の基礎と実践Deep learning実装の基礎と実践
Deep learning実装の基礎と実践
 
Mt basic as-os_on_danbot
Mt basic as-os_on_danbotMt basic as-os_on_danbot
Mt basic as-os_on_danbot
 
C# 7.2 with .NET Core 2.1
C# 7.2 with .NET Core 2.1C# 7.2 with .NET Core 2.1
C# 7.2 with .NET Core 2.1
 
2018/06/23 Sony"s deep learning software and the latest information
2018/06/23 Sony"s deep learning software and the latest information2018/06/23 Sony"s deep learning software and the latest information
2018/06/23 Sony"s deep learning software and the latest information
 
Or seminar2011final
Or seminar2011finalOr seminar2011final
Or seminar2011final
 
2値化CNN on FPGAでGPUとガチンコバトル(公開版)
2値化CNN on FPGAでGPUとガチンコバトル(公開版)2値化CNN on FPGAでGPUとガチンコバトル(公開版)
2値化CNN on FPGAでGPUとガチンコバトル(公開版)
 
Scrum alliance regional gathering tokyo 2013 pub
Scrum alliance regional gathering tokyo 2013 pubScrum alliance regional gathering tokyo 2013 pub
Scrum alliance regional gathering tokyo 2013 pub
 
プログラムを高速化する話
プログラムを高速化する話プログラムを高速化する話
プログラムを高速化する話
 
2値ディープニューラルネットワークと組込み機器への応用: 開発中のツール紹介
2値ディープニューラルネットワークと組込み機器への応用: 開発中のツール紹介2値ディープニューラルネットワークと組込み機器への応用: 開発中のツール紹介
2値ディープニューラルネットワークと組込み機器への応用: 開発中のツール紹介
 
DAシンポジウム2019招待講演「深層学習モデルの高速なTraining/InferenceのためのHW/SW技術」 金子紘也hare
DAシンポジウム2019招待講演「深層学習モデルの高速なTraining/InferenceのためのHW/SW技術」 金子紘也hareDAシンポジウム2019招待講演「深層学習モデルの高速なTraining/InferenceのためのHW/SW技術」 金子紘也hare
DAシンポジウム2019招待講演「深層学習モデルの高速なTraining/InferenceのためのHW/SW技術」 金子紘也hare
 
Graviton2プロセッサの性能特性と適用箇所/Supership株式会社 中野 豊
Graviton2プロセッサの性能特性と適用箇所/Supership株式会社 中野 豊Graviton2プロセッサの性能特性と適用箇所/Supership株式会社 中野 豊
Graviton2プロセッサの性能特性と適用箇所/Supership株式会社 中野 豊
 
Spmv9forpublic
Spmv9forpublicSpmv9forpublic
Spmv9forpublic
 
Ruby で高速なプログラムを書く
Ruby で高速なプログラムを書くRuby で高速なプログラムを書く
Ruby で高速なプログラムを書く
 
もしも… Javaでヘテロジニアスコアが使えたら…
もしも… Javaでヘテロジニアスコアが使えたら…もしも… Javaでヘテロジニアスコアが使えたら…
もしも… Javaでヘテロジニアスコアが使えたら…
 

Más de ryuz88 (6)

LUT-Network その後の話(2022/05/07)
LUT-Network その後の話(2022/05/07)LUT-Network その後の話(2022/05/07)
LUT-Network その後の話(2022/05/07)
 
Rust で RTOS を考える
Rust で RTOS を考えるRust で RTOS を考える
Rust で RTOS を考える
 
Verilator勉強会 2021/05/29
Verilator勉強会 2021/05/29Verilator勉強会 2021/05/29
Verilator勉強会 2021/05/29
 
FPGA勉強会資料 20210516
FPGA勉強会資料 20210516FPGA勉強会資料 20210516
FPGA勉強会資料 20210516
 
Deep Learning development flow
Deep Learning development flowDeep Learning development flow
Deep Learning development flow
 
LUT-Network Revision2 -English version-
LUT-Network Revision2 -English version-LUT-Network Revision2 -English version-
LUT-Network Revision2 -English version-
 

LUT-Network ~本物のリアルタイムコンピューティングを目指して~