36. 関数の次元数
è 最大4次元までの関数を定義可能
f は3次元の関数(e.g. 3D空間、カラー画像)
f は4次元の関数
Func f;
Var c, x, y;
f(c, x, y) = c + x + y;
Func f;
Var c, x, y, z;
f(c, x, y, z) = c + x + y + z;
37. 関数の参照
è 関数の右辺に定義された関数への参照
– 関数合成が可能
意味: 関数 f2 は定義域 x, y に対して f1(x+y) を値域に持つ
Var x, y;
Func f1;
f1(x, y) = x + y;
Func f2;
f2(x, y) = f1(x, y);
Var x, y;
Func f2;
f2(x, y) = x + y;
38. 式
è 式はExpr型の変数として表される
– 関数: Func
– 誘導変数: Var
– 式: Expr
組み立てた計算式を、式としてとっておくことが出来る
Var x, y;
Expr e = x + y;
Func f;
f(x, y) = e;
Var x, y;
Func f;
f(x, y) = x + y;
39. RDomと畳み込み関数
è 畳み込みを表すためのプリミティブ
– リダクションドメイン: RDom
– RDom(min, extent)
• 指定された次元で[min, min+extent-1]の領域を畳み込み
等価なC++ソースコード
rxは[-1, 1]を動く誘導変数
Var x;
Func f;
f(x) = x;
RDom rx(-1, 3);
Func g;
g(x) = sum(f(x + rx));
for (int x=0; x<width; x++) {
T sum = 0;
for (int rx=-1; rx<2; rx++) {
sum += x + rx;
}
g[x] = sum;
}
+
58. Convolutional Neural Network
è 画像認識に頻繁に使用されるニューラルネットワーク
– 前段にConvolution層/Pooling層を重ねるのが特徴
– 後段で全結合層による分類や回帰を行う
è 推論時のボトルネック
– Convoluton層: 演算数が膨大
– FC層: 重みの容量が膨大
Y. LeCun, L. Bottou, Y. Bengio, and P. Haffner. Gradient-based learning
applied to document recognition. Proceedings of the IEEE, november 1998.
60. FPGA向けアルゴリズム最適化: Log-based Quantization[2]
è初段・最終段のConv/FC層
– 二値化すると精度の低下が激しい
è初段・最終段のConv/FC層の入力と重みを
対数量子化
– ラインバッファ・重みの容量を削減
– 積算がシフト演算で計算可能
• 今回はlog2-baseで量子化
Dataset Network
Accuracy
fixed-32 2-base log2-base
MNIST LeNet-5 98% 95% 98%
CIFAR-10 NIN 89% 66% 82%
[2] Miyashita, D. et al., “Convolutional Neural Networks using Logarithmic Data Representation”, https://arxiv.org/abs/1603.01025
61. Halide DSLによる量子化MNIST実装
è 各層は適当に融合してモジュール化
– 低レイテンシ化
– 省リソース化
– パフォーマンスとモジュラリティの両立
è モジュール間はコンパイラの最適化によりストリーム化
– シーケンシャルアクセスになるよう
各モジュール内部でウィンドウレジスタ+ラインバッファでバッファリング
Norm&Quant Conv BN ReLU Pooling BN
Conv ReLU Pooling
Scale Active
BN Scale Active FC ReLU FC
M0 M1 M2 M3 M4 M5 M6
62. Halide DSLによる量子化MNIST実装
è パイプライン全体のスループットは?
– モジュールの演算スループット、モジュール間のI/Oス
ループットのもっとも低い部分に引っ張られる
M0
CU
CU
CU
M1
CU
CU
CU
M2
CU
CU
CU
M3
CU
CU
CU
M4
CU
CU
CU
M5
CU
CU
CU
M6
CU
CU
CU
CU=Computing Unit
63. Halide DSLによる量子化MNIST実装
è 量子化MNISTの場合(バッチサイズ=1)
– デフォルト(スループット未調整)の状態では、
第2層目のConvolutionの演算(M3)がボトルネック
M0
CU
M1
CU
M2
CU
M3
CU
M4
CU
M5
CU
M6
CU
28x28
=784
5x5x20x28x28
=392000
2x2x20x24x24
=46080
20x5x5x50x12x12
=3600000
2x2x50x8x8
=12800
50x4x4x500
=400000
500x10
=5000
3600000cycle=40FPS(150MHz)
(単位:iteration)
64. Halide DSLによる量子化MNIST実装
è 量子化MNISTの場合(バッチサイズ=1)
– 畳み込みの入力チャネル層を2unrollすると
全体性能も倍になる
M0
CU
M1
CU
M2
CU
M3 M4
CU
M5
CU
M6
CU
28x28
=784
5x5x20x28x28
=392000
2x2x20x24x24
=46080
10x5x5x50x12x12
=1800000
2x2x50x8x8
=12800
50x4x4x500
=400000
500x10
=5000
CU
CU
conv2_sum.update().unroll(rc, 2);
1800000cycle=80FPS(150MHz)
(単位:iteration)