SlideShare une entreprise Scribd logo
1  sur  31
LUT-Network
~ 新のリアルタイムコンピューティングを目指して~
REVISION2
Ryuji Fuchikami
渕上 竜司
本資料について
• 前回資料「fpgax 2019/02/02発表資料 (Web公開版) 」から
のアップデートです。
• https://www.slideshare.net/ryuz88/lut-network-
fpgx201902
• BinaryBrain Version3 の公開と、確率的LUTモデルの追加で
劇的に学習効率が上がっております。
2
LUT-Network公開の履歴
• BinaryBrain Version 1 (2018/8/1 ~)
• 「LUT-Network」 と名づけました。
• 原理検証用のベタ書きプログラムのgithubへの公開でした
• バイナリLUTをSIMD(AVX2)で記述して256並列で計算しました(メモリ配置 CHWN)
• 学習モデルは力技での総当りに近いものでした
• この時点でバイナリ変調の概念を取り込んでいました
• BinaryBrain Version 2 (2018/9/2~)
• レイヤー構造を有したプログラム構造に移行しました
• 誤差逆伝播による学習を可能としました
• 最初は単純な疎行列のモデルでした
• 途中からmicro-MLPモデルとして、内部に隠れ層を素子を基本としたモデルに移行しました
• 畳み込み(CNN)をサポートしました
• Verilog-RTLの出力機能をつけました。同時にFPGAデモも公開しました
• BinaryBrain Version 3 (March 19, 2019 ~)
• フレームバッファ/テンソルバッファを導入し、GPGPU(CUDA)対応を行いました
• 確率的LUTのモデルを考案し、forward演算もFP32となり高速/高精度になりました
• バイナリ変調による回帰分析への適用を実験し、sampleを追加しました
3
https://github.com/ryuz/BinaryBrain
リアルタイムコンピューティングとは?
• 計算を現実世界のダイナミクスに適合させ、生活空間に計算機を入れ込むこと
• 意識的にPCにアクセスするのではなく、今ある現実世界のスペックでエッジコン
ピューティングが必要。
Human
thing
thing
電脳鏡
どこでも窓
遅延なき
遠隔制御
宇宙探査ロボ
介護ロボ
電脳メガネ
4
HPC
自立制御
YouTube動画 : https://www.youtube.com/watch?v=wGRhw9bbiik&t=2s
offline
Human
現実空間
Real-Time Binary-DNN architecture for FPGA
memory
processor
input
device
output
device
fpsは基本的にベストエフォート
対メモリでの計算
性能は出ても遅延が大きい
ノイマン型アーキテクチャ
リアルタイムプロセッシング(データフロー型プログラム)
memory
processor
input
device
output
device
オンザフライ演算で低遅延
ハードリアルタイム保証可能
メモリは過去の情報を使うためのもの
5
このアーキテクチャに合うAI計算機としてLUT-Networkを考案
LUT-Network の概要
• 通常のDNN
1. ニューロ素子を配置して結線を定義
2. 学習を実施
3. 各ニューロ素子の重み係数が得られる
• LUT-Network
1. LUT素子を配置して結線を定義
2. 学習を実施
3. 各LUTのテーブルが得られる
θ
x1
x2
x3
xn
・・・
w1
w2
w3
wn
y
6
LUT-Network の性能紹介
7
xc7z020clg400-1
微小リソースで実装可能 超低遅延でリアルタイム認識
MNIST MLP 分類はコア単独なら318,877fpsで動作
1ミリ秒遅延, 1000fps スループット
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のデザインフロー
【Conventional】 【LUT-Network】
8
学習結果がそのままFPGAに
LUT-Networkの特徴
• 基本的にはエッジでのPredictionの効率化技術
• バイナリ・ニューラル・ネットワークの一種である
• BDNNで可能なものは(原理的には)学習可能(な筈)
• LUT単位の学習なので高密度&高速(300~400MHz)
• ネットワーク定義時に回路規模が決まる
• FPGA内のリソースを決めてから、その範囲での最大の認識率が
探れる
• つまりリアルタイム保証を先に行える
通常DNNのFPGA適用 LUT Network
認識率 学習時に決定 出来高払い
(ベストエフォート)
性能 合成結果で出来高払い
(ベストエフォート)
学習に先立って決定
9
どうやってLUTを学習させるのか?
1. 力技総当り学習
• Trainデータに対して、損失関数が最小化するように直接LUTテーブルを最適化
• 学習可能な構成に制約
• MLPのみ学習可能
• 単独で大きなネットの直接学習は困難(別のBDNNから層単位で模倣学習は可能)
• 勾配を用いないので非Trainデータに対する特性が従来DNNと異なる可能性がある
(Adversarial Examplesなどに効果ないか?)
2. micro-MLPモデル
• 従来のバイナリDNNの技法の応用
• 順伝播(Forward)はBinaryで実施し、誤差逆伝播(backward)のみ実数型(FP32)で行う
• 学習はGPU上で可能だが、確率的試行が必要で較的遅い。 FPGAでの推論は高速.
3. learning with Stochastic-LUT model
• 順伝播も誤差逆伝播実数型(FP32)で行う
• 学習はGPU上で可能で、高速且つ高精度。FPGAでの推論はもちろん同様に高速.
3つのアイデア
10
力技総当り学習
入力値 発生回数 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の入力値毎に損失関数の総和を取っておき、損失が減る方向にテーブルを
更新
11
このやり方でちゃんと未知データの推論が可能でmicro-MLPより高精度
















yxwvu
tsrqp
onmlk
jihgf
edcba
















000
000
000
000
000
wv
ts
ok
gf
db
Dense-Affine (Fully Connection)
Sparse-Affine (my 1st idea)
・
・
・
synthesis
LUT
LUT
LUT
LUT
LUT
LUT
LUTmapping
BatchNormalization
Binary-Activation
BatchNormalization
Binary-Activation
Deep Logic
XORは学習できない
素子1つで速い(300MHz~400MHz)
XORが学習できないのは
従来のパーセプトロンモデル同様
多段なので遅い(100MHz~200MHz)
micro-MLP stack(my 2nd idea)
LUTmapping
BatchNormalization
Binary-Activation
単独素子モデルでXORが解ける
→ 演算密度が高い
素子1つで速い(300MHz~400MHz)
・
・
・
Simple Logic
LUT includes BN
LUT includes hidden layer
This unit is “micro-MLP”
Micro-MLPモデル
12
Simple Logic
Micro-MLPモデルのActivation
• forward
• Sign()
• 𝑦 =
1 𝑖𝑓 𝑥 ≥ 0,
0 𝑜𝑡ℎ𝑒𝑟𝑤𝑖𝑠𝑒,
• backward
• hard-tanh()
• 𝑔 𝑥 = 1 𝑥 ≤1
Binary Connect と同じもの
Batch Normalization は従来と同じものが利用できる
13
BatchNormalization
Binary-Activation
・
・
・
mapping LUT
確率的LUTモデルによる学習 [new]
14
-
*
-
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も不要
確率的LUTモデル
15
input[n-1:0]
output
LUTテーブルは入力数nに対してn次元を持ち、その中で連続体として振舞います。
上記は2入力LUTにXORを学習させた場合の模式図です。
内部の状態テーブルを参照する形式を取るために、パーセプトロン素子と違って
XOR問題を解くことができます
学習 推論
行列
Matrix
重み
Weight
活性化
Activation
畳み込み
Convolution
Deep
Network
CPUs/GPUs FPGA
Binary
Connect
密行列
(Dense)
2値
(Binary)
実数
(FP32)
OK
Binarized
Neural
Network
密行列
(Dense)
2値
(Binary)
2値
(Binary)
OK
XNOR-
Network
密行列
(Dense)
2値
(Binary)
2値
(Binary)
OK
LUT-
Network
疎行列
(Sparse)
実数
(FP32) 不要 OK
good
excellent
1 node → many adders
1 node → many XNOR
1 node → many XNOR
1 node → 1 LUT
excellent
他のBinary Networkとの比較
16
good
確率的LUTモデルの登場で、学習時のデメリットが大きく解消しました
またLUTテーブルの整数型へのパッキングでCPU/GPUでの推論可能性も出てきました
動作事例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
17
YouTube動画: https://www.youtube.com/watch?v=NJa77PZlQMI
MNIST MLP 1000fps
LUT: 1182
input:784
layer0: 256
layer1: 256
layer2: 128
layer3: 128
layer4: 128
layer5: 128
layer6: 128
layer7: 30
Total Utilization(include Camera/OLED control)Utilization of DNN part
250MHz / (28x28) = 318,877fps
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)
19
動作事例2
[MNIST CNN 1000fp]
YouTube movie : https://www.youtube.com/watch?v=aYuYrYxztBU
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
20
MNIST CNN (システム全体)
include Camera and OLED control
21
result of: RTL-simulation
MNIST CNN 学習ログ [micro-MLP]
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
22micro MLP-model on BinaryBrain version2
MNIST CNN 学習ログ [確率的LUT]
fitting start : MnistStochasticLut6Cnn
72.35s epoch[ 1] test accuracy : 0.9508 train accuracy : 0.9529
153.70s epoch[ 2] test accuracy : 0.9581 train accuracy : 0.9638
235.33s epoch[ 3] test accuracy : 0.9615 train accuracy : 0.9676
316.71s epoch[ 4] test accuracy : 0.9647 train accuracy : 0.9701
398.33s epoch[ 5] test accuracy : 0.9642 train accuracy : 0.9718
479.71s epoch[ 6] test accuracy : 0.9676 train accuracy : 0.9731
・
・
・
2111.04s epoch[ 26] test accuracy : 0.9699 train accuracy : 0.9786
2192.82s epoch[ 27] test accuracy : 0.9701 train accuracy : 0.9788
2274.26s epoch[ 28] test accuracy : 0.9699 train accuracy : 0.9789
2355.97s epoch[ 29] test accuracy : 0.9699 train accuracy : 0.9789
2437.39s epoch[ 30] test accuracy : 0.9696 train accuracy : 0.9791
2519.13s epoch[ 31] test accuracy : 0.9698 train accuracy : 0.9793
2600.71s epoch[ 32] test accuracy : 0.9695 train accuracy : 0.9792
fitting end
parameter copy to LUT-Network
lut_accuracy : 0.9641
export : verilog/MnistStochasticLut6Cnn.v
23
Stochastic-LUT model on BinaryBrain version3
線形回帰計算ログ [確率的LUT]
(scikit-learnのdiabetesデータを利用)
fitting start : DiabetesRegressionStochasticLut6
[initial] test MSE : 0.0571 train MSE : 0.0581
0.97s epoch[ 1] test MSE : 0.0307 train MSE : 0.0344
1.42s epoch[ 2] test MSE : 0.0209 train MSE : 0.0284
1.87s epoch[ 3] test MSE : 0.0162 train MSE : 0.0270
2.32s epoch[ 4] test MSE : 0.0160 train MSE : 0.0261
・
・
・
27.11s epoch[ 59] test MSE : 0.0146 train MSE : 0.0245
27.55s epoch[ 60] test MSE : 0.0195 train MSE : 0.0256
27.99s epoch[ 61] test MSE : 0.0145 train MSE : 0.0231
28.43s epoch[ 62] test MSE : 0.0133 train MSE : 0.0232
28.87s epoch[ 63] test MSE : 0.0940 train MSE : 0.0903
29.30s epoch[ 64] test MSE : 0.0146 train MSE : 0.0233
fitting end
parameter copy to LUT-Network
LUT-Network accuracy : 0.0340518
export : DiabetesRegressionBinaryLut.v
24Stochastic-LUT model on BinaryBrain version3
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
Multiplier
+ adder
23.8
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
1.37
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)
他方式との比較(リソース見積り)
25
確率的LUTモデルの登場で、主に学習時の計算量が改善しています
オーバーサンプリングによるバイナリ変調モデル
• オーバーサンプリングと量子化による変調
• PWM(Pulse Width Modulation)変調
• ⊿Σ変調
• ディザ, etc
• 例えば高速度カメラはそれ自身がノイズを多く含むのでディザかけたのと同じ
→ LPF掛けると元の露光時間の長い綺麗な画像に戻る
• 計算はバイナリだが、LPFでノイズは取り除かれ階調が回復する
• 階調が回復するので回帰分析にフィッティングができる
• LPFは無くてもよいし、IIR/FIRフィルタや、カルマンフィルタなどいろいろ考えられる
変調
量子化された
DNN
ノイズや
局部発振器
LPF
26
人間で代替も可能
(人の感覚自体がLPFとしても機能する)
Real-timeの為のアーキテクチャ案
27
DNN
Video-In
ME MC
Video-Out
フレームメモリ
IIRフィルタに似たアーキテクチャ
メモリは過去のものの参照にしか使わない
常に最新情報で最善の結果を出力し続ける
次のステップに向けて
• 疎結合の接続ルールの改善
• 現在基本的にランダム結線
• CNNがそうであるように、データには局所性がある
• 実は今も少しチャンネル方向に制限入れて改善している
• 接続先をノード距離でガウス関数などで確率的に決める手はある
• ピラミッド構造的に積層化接続したい
• 自動的な枝狩りも候補
• 全線結合からスタートしないといけないのでいろいろ難しい
• 過去に試したが極端に接続が減ってくると効果が微妙になってくる模様
• DNNプラットフォームとしての進化
• TFとかChainerとかを追いかける気は無いけど、もう少しマシにはしたい。
• とりあえずSequential以外のモデルも必要
• 今の延長で通用するのはVGG16ぐらいまでかな?
28
リファレンス
• 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
29
自己紹介
• 学生時代からいろいろなオープンソース公開している趣味の人
• 1976年生まれ, 福岡在住
• 1998~ HOS (Real-Time OS [uITRON]) 公開
• https://ja.osdn.net/projects/hos/
(ARM,H8,SH,MIPS,x86,Z80,AM,V850,MicroBlaze, etc.)
• 2008~ Jell (FPGA用MIPS互換ソフトコアCPU) 公開
• https://github.com/ryuz/jelly
• http://ryuz.my.coocan.jp/jelly/toppage.html
• 2018~ LUT-Network 公開
• https://github.com/ryuz/BinaryBrain
• 電脳メガネ計画実施中(今の取り組み)
• Real-Time glasses (camera [IMX219] & OLED 1000fps)
https://www.youtube.com/watch?v=wGRhw9bbiik
• Real-Time GPU (no frame buffer architecture)
https://www.youtube.com/watch?v=vl-lhSOOlSk
• Real-Time DNN (LUT-Network)
https://www.youtube.com/watch?v=aYuYrYxztBU
30
娘に描いてもらいました
※ これらはすべてサンデープログラミング(趣味)で開発しています
著者連絡先
• 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
31

Contenu connexe

Tendances

2値ディープニューラルネットワークと組込み機器への応用: 開発中のツール紹介
2値ディープニューラルネットワークと組込み機器への応用: 開発中のツール紹介2値ディープニューラルネットワークと組込み機器への応用: 開発中のツール紹介
2値ディープニューラルネットワークと組込み機器への応用: 開発中のツール紹介Hiroki Nakahara
 
2009/12/10 GPUコンピューティングの現状とスーパーコンピューティングの未来
2009/12/10 GPUコンピューティングの現状とスーパーコンピューティングの未来2009/12/10 GPUコンピューティングの現状とスーパーコンピューティングの未来
2009/12/10 GPUコンピューティングの現状とスーパーコンピューティングの未来Preferred Networks
 
PyOpenCLによるGPGPU入門
PyOpenCLによるGPGPU入門PyOpenCLによるGPGPU入門
PyOpenCLによるGPGPU入門Yosuke Onoue
 
汎用性と高速性を目指したペアリング暗号ライブラリ mcl
汎用性と高速性を目指したペアリング暗号ライブラリ mcl汎用性と高速性を目指したペアリング暗号ライブラリ mcl
汎用性と高速性を目指したペアリング暗号ライブラリ mclMITSUNARI Shigeo
 
ChainerでDeep Learningを試すために必要なこと
ChainerでDeep Learningを試すために必要なことChainerでDeep Learningを試すために必要なこと
ChainerでDeep Learningを試すために必要なことRetrieva inc.
 
Nested RNSを用いたディープニューラルネットワークのFPGA実装
Nested RNSを用いたディープニューラルネットワークのFPGA実装Nested RNSを用いたディープニューラルネットワークのFPGA実装
Nested RNSを用いたディープニューラルネットワークのFPGA実装Hiroki Nakahara
 
第1回 配信講義 計算科学技術特論A (2021)
第1回 配信講義 計算科学技術特論A (2021)第1回 配信講義 計算科学技術特論A (2021)
第1回 配信講義 計算科学技術特論A (2021)RCCSRENKEI
 
Wavelet matrix implementation
Wavelet matrix implementationWavelet matrix implementation
Wavelet matrix implementationMITSUNARI Shigeo
 
なにわTech20170218(tpu) tfug
なにわTech20170218(tpu) tfugなにわTech20170218(tpu) tfug
なにわTech20170218(tpu) tfugNatsutani Minoru
 
2015年度GPGPU実践プログラミング 第8回 総和計算(高度な最適化)
2015年度GPGPU実践プログラミング 第8回 総和計算(高度な最適化)2015年度GPGPU実践プログラミング 第8回 総和計算(高度な最適化)
2015年度GPGPU実践プログラミング 第8回 総和計算(高度な最適化)智啓 出川
 
CUDA1日(?)体験会 (再アップロード)
CUDA1日(?)体験会 (再アップロード)CUDA1日(?)体験会 (再アップロード)
CUDA1日(?)体験会 (再アップロード)RinKuriyama
 
CUDA1日(?)体験会
CUDA1日(?)体験会CUDA1日(?)体験会
CUDA1日(?)体験会RinKuriyama
 
第4回 配信講義 計算科学技術特論A (2021)
第4回 配信講義 計算科学技術特論A (2021)第4回 配信講義 計算科学技術特論A (2021)
第4回 配信講義 計算科学技術特論A (2021)RCCSRENKEI
 
Pythonによる並列プログラミング -GPGPUも-
Pythonによる並列プログラミング   -GPGPUも- Pythonによる並列プログラミング   -GPGPUも-
Pythonによる並列プログラミング -GPGPUも- Yusaku Watanabe
 
FPGAX2016 ドキュンなFPGA
FPGAX2016 ドキュンなFPGAFPGAX2016 ドキュンなFPGA
FPGAX2016 ドキュンなFPGAHiroki Nakahara
 
深層学習向け計算機クラスター MN-3
深層学習向け計算機クラスター MN-3深層学習向け計算機クラスター MN-3
深層学習向け計算機クラスター MN-3Preferred Networks
 
DEEP LEARNING、トレーニング・インファレンスのGPUによる高速化
DEEP LEARNING、トレーニング・インファレンスのGPUによる高速化DEEP LEARNING、トレーニング・インファレンスのGPUによる高速化
DEEP LEARNING、トレーニング・インファレンスのGPUによる高速化RCCSRENKEI
 
第3回機械学習勉強会「色々なNNフレームワークを動かしてみよう」-Keras編-
第3回機械学習勉強会「色々なNNフレームワークを動かしてみよう」-Keras編-第3回機械学習勉強会「色々なNNフレームワークを動かしてみよう」-Keras編-
第3回機械学習勉強会「色々なNNフレームワークを動かしてみよう」-Keras編-Yasuyuki Sugai
 

Tendances (20)

2値ディープニューラルネットワークと組込み機器への応用: 開発中のツール紹介
2値ディープニューラルネットワークと組込み機器への応用: 開発中のツール紹介2値ディープニューラルネットワークと組込み機器への応用: 開発中のツール紹介
2値ディープニューラルネットワークと組込み機器への応用: 開発中のツール紹介
 
2009/12/10 GPUコンピューティングの現状とスーパーコンピューティングの未来
2009/12/10 GPUコンピューティングの現状とスーパーコンピューティングの未来2009/12/10 GPUコンピューティングの現状とスーパーコンピューティングの未来
2009/12/10 GPUコンピューティングの現状とスーパーコンピューティングの未来
 
PyOpenCLによるGPGPU入門
PyOpenCLによるGPGPU入門PyOpenCLによるGPGPU入門
PyOpenCLによるGPGPU入門
 
汎用性と高速性を目指したペアリング暗号ライブラリ mcl
汎用性と高速性を目指したペアリング暗号ライブラリ mcl汎用性と高速性を目指したペアリング暗号ライブラリ mcl
汎用性と高速性を目指したペアリング暗号ライブラリ mcl
 
ChainerでDeep Learningを試すために必要なこと
ChainerでDeep Learningを試すために必要なことChainerでDeep Learningを試すために必要なこと
ChainerでDeep Learningを試すために必要なこと
 
CuPy解説
CuPy解説CuPy解説
CuPy解説
 
Nested RNSを用いたディープニューラルネットワークのFPGA実装
Nested RNSを用いたディープニューラルネットワークのFPGA実装Nested RNSを用いたディープニューラルネットワークのFPGA実装
Nested RNSを用いたディープニューラルネットワークのFPGA実装
 
第1回 配信講義 計算科学技術特論A (2021)
第1回 配信講義 計算科学技術特論A (2021)第1回 配信講義 計算科学技術特論A (2021)
第1回 配信講義 計算科学技術特論A (2021)
 
Wavelet matrix implementation
Wavelet matrix implementationWavelet matrix implementation
Wavelet matrix implementation
 
optimal Ate pairing
optimal Ate pairingoptimal Ate pairing
optimal Ate pairing
 
なにわTech20170218(tpu) tfug
なにわTech20170218(tpu) tfugなにわTech20170218(tpu) tfug
なにわTech20170218(tpu) tfug
 
2015年度GPGPU実践プログラミング 第8回 総和計算(高度な最適化)
2015年度GPGPU実践プログラミング 第8回 総和計算(高度な最適化)2015年度GPGPU実践プログラミング 第8回 総和計算(高度な最適化)
2015年度GPGPU実践プログラミング 第8回 総和計算(高度な最適化)
 
CUDA1日(?)体験会 (再アップロード)
CUDA1日(?)体験会 (再アップロード)CUDA1日(?)体験会 (再アップロード)
CUDA1日(?)体験会 (再アップロード)
 
CUDA1日(?)体験会
CUDA1日(?)体験会CUDA1日(?)体験会
CUDA1日(?)体験会
 
第4回 配信講義 計算科学技術特論A (2021)
第4回 配信講義 計算科学技術特論A (2021)第4回 配信講義 計算科学技術特論A (2021)
第4回 配信講義 計算科学技術特論A (2021)
 
Pythonによる並列プログラミング -GPGPUも-
Pythonによる並列プログラミング   -GPGPUも- Pythonによる並列プログラミング   -GPGPUも-
Pythonによる並列プログラミング -GPGPUも-
 
FPGAX2016 ドキュンなFPGA
FPGAX2016 ドキュンなFPGAFPGAX2016 ドキュンなFPGA
FPGAX2016 ドキュンなFPGA
 
深層学習向け計算機クラスター MN-3
深層学習向け計算機クラスター MN-3深層学習向け計算機クラスター MN-3
深層学習向け計算機クラスター MN-3
 
DEEP LEARNING、トレーニング・インファレンスのGPUによる高速化
DEEP LEARNING、トレーニング・インファレンスのGPUによる高速化DEEP LEARNING、トレーニング・インファレンスのGPUによる高速化
DEEP LEARNING、トレーニング・インファレンスのGPUによる高速化
 
第3回機械学習勉強会「色々なNNフレームワークを動かしてみよう」-Keras編-
第3回機械学習勉強会「色々なNNフレームワークを動かしてみよう」-Keras編-第3回機械学習勉強会「色々なNNフレームワークを動かしてみよう」-Keras編-
第3回機械学習勉強会「色々なNNフレームワークを動かしてみよう」-Keras編-
 

Similaire à LUT-Network Revision2

LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)Takeshi Yamamuro
 
第11回 配信講義 計算科学技術特論B(2022)
第11回 配信講義 計算科学技術特論B(2022)第11回 配信講義 計算科学技術特論B(2022)
第11回 配信講義 計算科学技術特論B(2022)RCCSRENKEI
 
openstack_neutron-ovs_osc2014tf_20141019
openstack_neutron-ovs_osc2014tf_20141019openstack_neutron-ovs_osc2014tf_20141019
openstack_neutron-ovs_osc2014tf_20141019Takehiro Kudou
 
Halide による画像処理プログラミング入門
Halide による画像処理プログラミング入門Halide による画像処理プログラミング入門
Halide による画像処理プログラミング入門Fixstars Corporation
 
「FPGA 開発入門:FPGA を用いたエッジ AI の高速化手法を学ぶ」
「FPGA 開発入門:FPGA を用いたエッジ AI の高速化手法を学ぶ」「FPGA 開発入門:FPGA を用いたエッジ AI の高速化手法を学ぶ」
「FPGA 開発入門:FPGA を用いたエッジ AI の高速化手法を学ぶ」直久 住川
 
OpenStack Neutronの機能概要 - OpenStack最新情報セミナー 2014年12月
OpenStack Neutronの機能概要 - OpenStack最新情報セミナー 2014年12月OpenStack Neutronの機能概要 - OpenStack最新情報セミナー 2014年12月
OpenStack Neutronの機能概要 - OpenStack最新情報セミナー 2014年12月VirtualTech Japan Inc.
 
Chainerチュートリアル -v1.5向け- ViEW2015
Chainerチュートリアル -v1.5向け- ViEW2015Chainerチュートリアル -v1.5向け- ViEW2015
Chainerチュートリアル -v1.5向け- ViEW2015Ryosuke Okuta
 
8 並列計算に向けた pcセッティング
8 並列計算に向けた pcセッティング8 並列計算に向けた pcセッティング
8 並列計算に向けた pcセッティングTakeshi Takaishi
 
Brocade SDN Controller -Sample Code for Brocade vRouter-
Brocade SDN Controller -Sample Code for Brocade vRouter-Brocade SDN Controller -Sample Code for Brocade vRouter-
Brocade SDN Controller -Sample Code for Brocade vRouter-Brocade
 
Microsoft Tunnel 概要
Microsoft Tunnel 概要Microsoft Tunnel 概要
Microsoft Tunnel 概要Yutaro Tamai
 
Microsoft tech fielders_cisco_20150126_配布版
Microsoft tech fielders_cisco_20150126_配布版Microsoft tech fielders_cisco_20150126_配布版
Microsoft tech fielders_cisco_20150126_配布版Takao Setaka
 
ICCV 2019 論文紹介 (26 papers)
ICCV 2019 論文紹介 (26 papers)ICCV 2019 論文紹介 (26 papers)
ICCV 2019 論文紹介 (26 papers)Hideki Okada
 
Security workshop 20131213
Security workshop 20131213Security workshop 20131213
Security workshop 20131213Yuuki Takano
 
OpenStack with OpenFlow
OpenStack with OpenFlowOpenStack with OpenFlow
OpenStack with OpenFlowToshiki Tsuboi
 
Open contrailmeetup 20161207
Open contrailmeetup 20161207Open contrailmeetup 20161207
Open contrailmeetup 20161207Daisuke Nakajima
 
A story of porting OpenBSD/luna88k
A story of porting OpenBSD/luna88kA story of porting OpenBSD/luna88k
A story of porting OpenBSD/luna88kKenji Aoyama
 

Similaire à LUT-Network Revision2 (20)

LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
 
第21回「Windows Server 2012 DeepDive!! Hyper-V と VDI を徹底解説」(2012/10/18 on しすなま!)...
第21回「Windows Server 2012 DeepDive!! Hyper-V と VDI を徹底解説」(2012/10/18 on しすなま!)...第21回「Windows Server 2012 DeepDive!! Hyper-V と VDI を徹底解説」(2012/10/18 on しすなま!)...
第21回「Windows Server 2012 DeepDive!! Hyper-V と VDI を徹底解説」(2012/10/18 on しすなま!)...
 
第11回 配信講義 計算科学技術特論B(2022)
第11回 配信講義 計算科学技術特論B(2022)第11回 配信講義 計算科学技術特論B(2022)
第11回 配信講義 計算科学技術特論B(2022)
 
openstack_neutron-ovs_osc2014tf_20141019
openstack_neutron-ovs_osc2014tf_20141019openstack_neutron-ovs_osc2014tf_20141019
openstack_neutron-ovs_osc2014tf_20141019
 
Halide による画像処理プログラミング入門
Halide による画像処理プログラミング入門Halide による画像処理プログラミング入門
Halide による画像処理プログラミング入門
 
「FPGA 開発入門:FPGA を用いたエッジ AI の高速化手法を学ぶ」
「FPGA 開発入門:FPGA を用いたエッジ AI の高速化手法を学ぶ」「FPGA 開発入門:FPGA を用いたエッジ AI の高速化手法を学ぶ」
「FPGA 開発入門:FPGA を用いたエッジ AI の高速化手法を学ぶ」
 
OpenStack Neutronの機能概要 - OpenStack最新情報セミナー 2014年12月
OpenStack Neutronの機能概要 - OpenStack最新情報セミナー 2014年12月OpenStack Neutronの機能概要 - OpenStack最新情報セミナー 2014年12月
OpenStack Neutronの機能概要 - OpenStack最新情報セミナー 2014年12月
 
Chainerチュートリアル -v1.5向け- ViEW2015
Chainerチュートリアル -v1.5向け- ViEW2015Chainerチュートリアル -v1.5向け- ViEW2015
Chainerチュートリアル -v1.5向け- ViEW2015
 
8 並列計算に向けた pcセッティング
8 並列計算に向けた pcセッティング8 並列計算に向けた pcセッティング
8 並列計算に向けた pcセッティング
 
Prosym2012
Prosym2012Prosym2012
Prosym2012
 
Brocade SDN Controller -Sample Code for Brocade vRouter-
Brocade SDN Controller -Sample Code for Brocade vRouter-Brocade SDN Controller -Sample Code for Brocade vRouter-
Brocade SDN Controller -Sample Code for Brocade vRouter-
 
仮想化技術の今後の動向
仮想化技術の今後の動向仮想化技術の今後の動向
仮想化技術の今後の動向
 
Microsoft Tunnel 概要
Microsoft Tunnel 概要Microsoft Tunnel 概要
Microsoft Tunnel 概要
 
Microsoft tech fielders_cisco_20150126_配布版
Microsoft tech fielders_cisco_20150126_配布版Microsoft tech fielders_cisco_20150126_配布版
Microsoft tech fielders_cisco_20150126_配布版
 
PCL
PCLPCL
PCL
 
ICCV 2019 論文紹介 (26 papers)
ICCV 2019 論文紹介 (26 papers)ICCV 2019 論文紹介 (26 papers)
ICCV 2019 論文紹介 (26 papers)
 
Security workshop 20131213
Security workshop 20131213Security workshop 20131213
Security workshop 20131213
 
OpenStack with OpenFlow
OpenStack with OpenFlowOpenStack with OpenFlow
OpenStack with OpenFlow
 
Open contrailmeetup 20161207
Open contrailmeetup 20161207Open contrailmeetup 20161207
Open contrailmeetup 20161207
 
A story of porting OpenBSD/luna88k
A story of porting OpenBSD/luna88kA story of porting OpenBSD/luna88k
A story of porting OpenBSD/luna88k
 

Plus de ryuz88

LUT-Network その後の話(2022/05/07)
LUT-Network その後の話(2022/05/07)LUT-Network その後の話(2022/05/07)
LUT-Network その後の話(2022/05/07)ryuz88
 
Rust で RTOS を考える
Rust で RTOS を考えるRust で RTOS を考える
Rust で RTOS を考えるryuz88
 
Fast and Light-weight Binarized Neural Network Implemented in an FPGA using L...
Fast and Light-weight Binarized Neural Network Implemented in an FPGA using L...Fast and Light-weight Binarized Neural Network Implemented in an FPGA using L...
Fast and Light-weight Binarized Neural Network Implemented in an FPGA using L...ryuz88
 
Verilator勉強会 2021/05/29
Verilator勉強会 2021/05/29Verilator勉強会 2021/05/29
Verilator勉強会 2021/05/29ryuz88
 
FPGA勉強会資料 20210516
FPGA勉強会資料 20210516FPGA勉強会資料 20210516
FPGA勉強会資料 20210516ryuz88
 
Deep Learning development flow
Deep Learning development flowDeep Learning development flow
Deep Learning development flowryuz88
 
LUT-Network Revision2 -English version-
LUT-Network Revision2 -English version-LUT-Network Revision2 -English version-
LUT-Network Revision2 -English version-ryuz88
 

Plus de ryuz88 (7)

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 を考える
 
Fast and Light-weight Binarized Neural Network Implemented in an FPGA using L...
Fast and Light-weight Binarized Neural Network Implemented in an FPGA using L...Fast and Light-weight Binarized Neural Network Implemented in an FPGA using L...
Fast and Light-weight Binarized Neural Network Implemented in an FPGA using L...
 
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 Revision2

  • 2. 本資料について • 前回資料「fpgax 2019/02/02発表資料 (Web公開版) 」から のアップデートです。 • https://www.slideshare.net/ryuz88/lut-network- fpgx201902 • BinaryBrain Version3 の公開と、確率的LUTモデルの追加で 劇的に学習効率が上がっております。 2
  • 3. LUT-Network公開の履歴 • BinaryBrain Version 1 (2018/8/1 ~) • 「LUT-Network」 と名づけました。 • 原理検証用のベタ書きプログラムのgithubへの公開でした • バイナリLUTをSIMD(AVX2)で記述して256並列で計算しました(メモリ配置 CHWN) • 学習モデルは力技での総当りに近いものでした • この時点でバイナリ変調の概念を取り込んでいました • BinaryBrain Version 2 (2018/9/2~) • レイヤー構造を有したプログラム構造に移行しました • 誤差逆伝播による学習を可能としました • 最初は単純な疎行列のモデルでした • 途中からmicro-MLPモデルとして、内部に隠れ層を素子を基本としたモデルに移行しました • 畳み込み(CNN)をサポートしました • Verilog-RTLの出力機能をつけました。同時にFPGAデモも公開しました • BinaryBrain Version 3 (March 19, 2019 ~) • フレームバッファ/テンソルバッファを導入し、GPGPU(CUDA)対応を行いました • 確率的LUTのモデルを考案し、forward演算もFP32となり高速/高精度になりました • バイナリ変調による回帰分析への適用を実験し、sampleを追加しました 3 https://github.com/ryuz/BinaryBrain
  • 5. Real-Time Binary-DNN architecture for FPGA memory processor input device output device fpsは基本的にベストエフォート 対メモリでの計算 性能は出ても遅延が大きい ノイマン型アーキテクチャ リアルタイムプロセッシング(データフロー型プログラム) memory processor input device output device オンザフライ演算で低遅延 ハードリアルタイム保証可能 メモリは過去の情報を使うためのもの 5 このアーキテクチャに合うAI計算機としてLUT-Networkを考案
  • 6. LUT-Network の概要 • 通常のDNN 1. ニューロ素子を配置して結線を定義 2. 学習を実施 3. 各ニューロ素子の重み係数が得られる • LUT-Network 1. LUT素子を配置して結線を定義 2. 学習を実施 3. 各LUTのテーブルが得られる θ x1 x2 x3 xn ・・・ w1 w2 w3 wn y 6
  • 7. LUT-Network の性能紹介 7 xc7z020clg400-1 微小リソースで実装可能 超低遅延でリアルタイム認識 MNIST MLP 分類はコア単独なら318,877fpsで動作 1ミリ秒遅延, 1000fps スループット
  • 8. 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のデザインフロー 【Conventional】 【LUT-Network】 8 学習結果がそのままFPGAに
  • 9. LUT-Networkの特徴 • 基本的にはエッジでのPredictionの効率化技術 • バイナリ・ニューラル・ネットワークの一種である • BDNNで可能なものは(原理的には)学習可能(な筈) • LUT単位の学習なので高密度&高速(300~400MHz) • ネットワーク定義時に回路規模が決まる • FPGA内のリソースを決めてから、その範囲での最大の認識率が 探れる • つまりリアルタイム保証を先に行える 通常DNNのFPGA適用 LUT Network 認識率 学習時に決定 出来高払い (ベストエフォート) 性能 合成結果で出来高払い (ベストエフォート) 学習に先立って決定 9
  • 10. どうやってLUTを学習させるのか? 1. 力技総当り学習 • Trainデータに対して、損失関数が最小化するように直接LUTテーブルを最適化 • 学習可能な構成に制約 • MLPのみ学習可能 • 単独で大きなネットの直接学習は困難(別のBDNNから層単位で模倣学習は可能) • 勾配を用いないので非Trainデータに対する特性が従来DNNと異なる可能性がある (Adversarial Examplesなどに効果ないか?) 2. micro-MLPモデル • 従来のバイナリDNNの技法の応用 • 順伝播(Forward)はBinaryで実施し、誤差逆伝播(backward)のみ実数型(FP32)で行う • 学習はGPU上で可能だが、確率的試行が必要で較的遅い。 FPGAでの推論は高速. 3. learning with Stochastic-LUT model • 順伝播も誤差逆伝播実数型(FP32)で行う • 学習はGPU上で可能で、高速且つ高精度。FPGAでの推論はもちろん同様に高速. 3つのアイデア 10
  • 11. 力技総当り学習 入力値 発生回数 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の入力値毎に損失関数の総和を取っておき、損失が減る方向にテーブルを 更新 11 このやり方でちゃんと未知データの推論が可能でmicro-MLPより高精度
  • 12.                 yxwvu tsrqp onmlk jihgf edcba                 000 000 000 000 000 wv ts ok gf db Dense-Affine (Fully Connection) Sparse-Affine (my 1st idea) ・ ・ ・ synthesis LUT LUT LUT LUT LUT LUT LUTmapping BatchNormalization Binary-Activation BatchNormalization Binary-Activation Deep Logic XORは学習できない 素子1つで速い(300MHz~400MHz) XORが学習できないのは 従来のパーセプトロンモデル同様 多段なので遅い(100MHz~200MHz) micro-MLP stack(my 2nd idea) LUTmapping BatchNormalization Binary-Activation 単独素子モデルでXORが解ける → 演算密度が高い 素子1つで速い(300MHz~400MHz) ・ ・ ・ Simple Logic LUT includes BN LUT includes hidden layer This unit is “micro-MLP” Micro-MLPモデル 12 Simple Logic
  • 13. Micro-MLPモデルのActivation • forward • Sign() • 𝑦 = 1 𝑖𝑓 𝑥 ≥ 0, 0 𝑜𝑡ℎ𝑒𝑟𝑤𝑖𝑠𝑒, • backward • hard-tanh() • 𝑔 𝑥 = 1 𝑥 ≤1 Binary Connect と同じもの Batch Normalization は従来と同じものが利用できる 13 BatchNormalization Binary-Activation ・ ・ ・ mapping LUT
  • 14. 確率的LUTモデルによる学習 [new] 14 - * - 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も不要
  • 16. 学習 推論 行列 Matrix 重み Weight 活性化 Activation 畳み込み Convolution Deep Network CPUs/GPUs FPGA Binary Connect 密行列 (Dense) 2値 (Binary) 実数 (FP32) OK Binarized Neural Network 密行列 (Dense) 2値 (Binary) 2値 (Binary) OK XNOR- Network 密行列 (Dense) 2値 (Binary) 2値 (Binary) OK LUT- Network 疎行列 (Sparse) 実数 (FP32) 不要 OK good excellent 1 node → many adders 1 node → many XNOR 1 node → many XNOR 1 node → 1 LUT excellent 他のBinary Networkとの比較 16 good 確率的LUTモデルの登場で、学習時のデメリットが大きく解消しました またLUTテーブルの整数型へのパッキングでCPU/GPUでの推論可能性も出てきました
  • 17. 動作事例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 17 YouTube動画: https://www.youtube.com/watch?v=NJa77PZlQMI
  • 18. MNIST MLP 1000fps LUT: 1182 input:784 layer0: 256 layer1: 256 layer2: 128 layer3: 128 layer4: 128 layer5: 128 layer6: 128 layer7: 30 Total Utilization(include Camera/OLED control)Utilization of DNN part 250MHz / (28x28) = 318,877fps
  • 19. 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) 19 動作事例2 [MNIST CNN 1000fp] YouTube movie : https://www.youtube.com/watch?v=aYuYrYxztBU
  • 20. 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 20
  • 21. MNIST CNN (システム全体) include Camera and OLED control 21 result of: RTL-simulation
  • 22. MNIST CNN 学習ログ [micro-MLP] 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 22micro MLP-model on BinaryBrain version2
  • 23. MNIST CNN 学習ログ [確率的LUT] fitting start : MnistStochasticLut6Cnn 72.35s epoch[ 1] test accuracy : 0.9508 train accuracy : 0.9529 153.70s epoch[ 2] test accuracy : 0.9581 train accuracy : 0.9638 235.33s epoch[ 3] test accuracy : 0.9615 train accuracy : 0.9676 316.71s epoch[ 4] test accuracy : 0.9647 train accuracy : 0.9701 398.33s epoch[ 5] test accuracy : 0.9642 train accuracy : 0.9718 479.71s epoch[ 6] test accuracy : 0.9676 train accuracy : 0.9731 ・ ・ ・ 2111.04s epoch[ 26] test accuracy : 0.9699 train accuracy : 0.9786 2192.82s epoch[ 27] test accuracy : 0.9701 train accuracy : 0.9788 2274.26s epoch[ 28] test accuracy : 0.9699 train accuracy : 0.9789 2355.97s epoch[ 29] test accuracy : 0.9699 train accuracy : 0.9789 2437.39s epoch[ 30] test accuracy : 0.9696 train accuracy : 0.9791 2519.13s epoch[ 31] test accuracy : 0.9698 train accuracy : 0.9793 2600.71s epoch[ 32] test accuracy : 0.9695 train accuracy : 0.9792 fitting end parameter copy to LUT-Network lut_accuracy : 0.9641 export : verilog/MnistStochasticLut6Cnn.v 23 Stochastic-LUT model on BinaryBrain version3
  • 24. 線形回帰計算ログ [確率的LUT] (scikit-learnのdiabetesデータを利用) fitting start : DiabetesRegressionStochasticLut6 [initial] test MSE : 0.0571 train MSE : 0.0581 0.97s epoch[ 1] test MSE : 0.0307 train MSE : 0.0344 1.42s epoch[ 2] test MSE : 0.0209 train MSE : 0.0284 1.87s epoch[ 3] test MSE : 0.0162 train MSE : 0.0270 2.32s epoch[ 4] test MSE : 0.0160 train MSE : 0.0261 ・ ・ ・ 27.11s epoch[ 59] test MSE : 0.0146 train MSE : 0.0245 27.55s epoch[ 60] test MSE : 0.0195 train MSE : 0.0256 27.99s epoch[ 61] test MSE : 0.0145 train MSE : 0.0231 28.43s epoch[ 62] test MSE : 0.0133 train MSE : 0.0232 28.87s epoch[ 63] test MSE : 0.0940 train MSE : 0.0903 29.30s epoch[ 64] test MSE : 0.0146 train MSE : 0.0233 fitting end parameter copy to LUT-Network LUT-Network accuracy : 0.0340518 export : DiabetesRegressionBinaryLut.v 24Stochastic-LUT model on BinaryBrain version3
  • 25. 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 Multiplier + adder 23.8 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 1.37 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) 他方式との比較(リソース見積り) 25 確率的LUTモデルの登場で、主に学習時の計算量が改善しています
  • 26. オーバーサンプリングによるバイナリ変調モデル • オーバーサンプリングと量子化による変調 • PWM(Pulse Width Modulation)変調 • ⊿Σ変調 • ディザ, etc • 例えば高速度カメラはそれ自身がノイズを多く含むのでディザかけたのと同じ → LPF掛けると元の露光時間の長い綺麗な画像に戻る • 計算はバイナリだが、LPFでノイズは取り除かれ階調が回復する • 階調が回復するので回帰分析にフィッティングができる • LPFは無くてもよいし、IIR/FIRフィルタや、カルマンフィルタなどいろいろ考えられる 変調 量子化された DNN ノイズや 局部発振器 LPF 26 人間で代替も可能 (人の感覚自体がLPFとしても機能する)
  • 28. 次のステップに向けて • 疎結合の接続ルールの改善 • 現在基本的にランダム結線 • CNNがそうであるように、データには局所性がある • 実は今も少しチャンネル方向に制限入れて改善している • 接続先をノード距離でガウス関数などで確率的に決める手はある • ピラミッド構造的に積層化接続したい • 自動的な枝狩りも候補 • 全線結合からスタートしないといけないのでいろいろ難しい • 過去に試したが極端に接続が減ってくると効果が微妙になってくる模様 • DNNプラットフォームとしての進化 • TFとかChainerとかを追いかける気は無いけど、もう少しマシにはしたい。 • とりあえずSequential以外のモデルも必要 • 今の延長で通用するのはVGG16ぐらいまでかな? 28
  • 29. リファレンス • 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 29
  • 30. 自己紹介 • 学生時代からいろいろなオープンソース公開している趣味の人 • 1976年生まれ, 福岡在住 • 1998~ HOS (Real-Time OS [uITRON]) 公開 • https://ja.osdn.net/projects/hos/ (ARM,H8,SH,MIPS,x86,Z80,AM,V850,MicroBlaze, etc.) • 2008~ Jell (FPGA用MIPS互換ソフトコアCPU) 公開 • https://github.com/ryuz/jelly • http://ryuz.my.coocan.jp/jelly/toppage.html • 2018~ LUT-Network 公開 • https://github.com/ryuz/BinaryBrain • 電脳メガネ計画実施中(今の取り組み) • Real-Time glasses (camera [IMX219] & OLED 1000fps) https://www.youtube.com/watch?v=wGRhw9bbiik • Real-Time GPU (no frame buffer architecture) https://www.youtube.com/watch?v=vl-lhSOOlSk • Real-Time DNN (LUT-Network) https://www.youtube.com/watch?v=aYuYrYxztBU 30 娘に描いてもらいました ※ これらはすべてサンデープログラミング(趣味)で開発しています
  • 31. 著者連絡先 • 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 31