狠狠撸

狠狠撸Share a Scribd company logo
研究者のための
Python による FPGA 入門
有限会社シンビー
2017/4/10
アジェンダ
? FPGA と HPC(High-Performance Computing)
? FPGA と Deep Learning
? FPGA と HDL(Hardware Description Language)
? Python (スクリプト言語) 入門
? FPGA と jupyter
? Polyphony (高位合成) 入門
はじめに
研究
テーマ
道具人脈
自己紹介
? @ryos36
? ハッシュタグ
#polyphony
FPGA と HPC
自分の研究に必要な道具は何か?CPU か?骋笔鲍か?贵笔骋础か?
FPGA=Field-Programmable Gate Array
http://www.ni.com より
FPGA
Wikipedia より
FPGA の特徴
得意なこと
? 並列計算
? レイテンシを守ること
? ビット計算
? 柔軟性
不得意なこと
? 高速処理?
Clock の比較
Tesla P100
GTX950-2GPYNQ-Z1
1328M1024M~200M
Core i7-7700K
4200M
いろんなところから画像引用。価格は調べた限りでの参考
価格だけでいうと
6,556,568 円!!
Xilinx より
比較
FPGA
PYNQ
GPU
GTX 950
HPC 用
Tesla P100
CPU
i7 7700K
HITACHI
SR16000
Clock ~200M 1024M 1328M 4200M 4000M
FLOPS(単精度) - 1317M 9600G 232G? 8200G x N
FLOPS(倍精度) - 41M 4800G 116G 4100G x N
セル数 85,000 - - - -
SM - 6 24 - -
CUDA コア - 768 3584 - -
CPU Core - - - 4(8) 8 x 24 x N
命令セット拡張 - - - SSE4.1/4.2, AVX 2.0 Altivec VSX
微細? 28nm 28nm 16nm 14nm 45nm
得意なこと 柔軟性のあ
る並列計算
積和演算に特化 逐次処理 逐次処理
2011 当時の最新?スパコン
ノード数不明
比較
FPGA
PYNQ
GPU
GTX 950
HPC 用
Tesla P100
CPU
i7 7700K
HITACHI
SR16000
Clock ~200M 1024M 1328M 4200M 4000M
FLOPS(単精度) - 1317M 9600G 232G? 8200G x N
FLOPS(倍精度) - 41M 4800G 116G 4100G x N
セル数 85,000 - - - -
SM - 6 24 - -
CUDA コア - 768 3584 - -
CPU Core - - - 4(8) 8 x 24 x N
命令セット拡張 - - - SSE4.1/4.2, AVX 2.0 Altivec VSX
微細? 28nm 28nm 16nm 14nm 45nm
得意なこと 柔軟性のあ
る並列計算
積和演算に特化 逐次処理 逐次処理
自由度が高く
入手性もよいので
研究に最適!!
FPGA の特徴(再掲)
得意なこと
? 並列計算
? レイテンシを守ること
? ビット計算
? 柔軟性
不得意なこと
? 高速処理?
FPGA の並列処理
処理
処理
処理
処理
処理
処理
処理
処理
FPGA でパイプライン処理
処理 処理 処理 処理 処理
処理を細分化することで高速化が可能
FPGA で並列処理
処理
処理 処理
処理
処理
並列に処理することで高速化が可能
FPGA の柔軟性(可変長ビット)
64bit
32bit
70bit
49bit
18bit
一般的なレジスタのサイズ
一般的なレジスタのサイズ
レジスタのサイズを変えることができる(混在も可能)
独自表現方法をとることが出来る
8 23
11 52
float
double
よくある浮動小数点
14 55独自表现
浮動小数点:参考
Wikipedia より
研究に必要な
精度の確保
参考:Maxwell (GPU) の中身
超越関数用
64bit 浮動小
数点演算器は
1個!!
32bit 浮動小
数点の演算器
32
入手が容易なGPUは64bit 浮動小数点の性能は1/32になる!!
Load/Store がうまく働き32bit 浮動小数点の積和演算をフル活用
できたときのみカタログスペックの性能が出る
http://pc.watch.impress.co.jp/docs/column/kaigai/752331.html
参考:スパコン
http://www.hitachi.co.jp/Prod/comp/hpc/SR_series/sr16000/feature.html に詳しい
http://www.hitachi.co.jp/Prod/comp/hpc/SR_series/sr16000/feature.html
コンパイラが
頑張っている
らしい
積和演算が早いわけではない。CPU の数分並列動作が期待できる。
SR16000 は 1ノードに 24 のCPU。CPU 1つに 8 つ Power7 コア。
比較(再掲)+
FPGA
PYNQ
GPU
GTX 950
HPC 用
Tesla P100
CPU
i7 7700K
HITACHI
SR16000
Clock ~200M 1024M 1328M 4200M 4000M
FLOPS(単精度) - 1317M 9600G 232G? 8200G x N
FLOPS(倍精度) - 41M 4800G 116G 4100G x N
セル数 85,000 - - - -
SM - 6 24 - -
CUDA コア - 768 3584 - -
CPU Core - - - 4(8) 8 x 24 x N
命令セット拡張 - - - SSE4.1/4.2, AVX 2.0 Altivec VSX
微細? 28nm 28nm 16nm 14nm 45nm
得意なこと 柔軟性のあ
る並列計算
積和演算に特化 逐次処理 逐次処理
CPU の分だけ逐次処
理を並列化。
将棋の分散処理など
に適する
積和演算をやたらと
早く可能。
3D のレンダリング、
Convolution などに適
する
まとめ
? CPU(スパコン) が万能なわけではない
? GPU もまた万能なわけではない(適合分野有)
? FPGA は柔軟性に富むので研究に使える
FPGA とディープラーニング
ディープラーニング
…
…
…
0の確率
3の確率
8の確率
9の確率
……
パーセプトロン
1
?1
?2
? ?
h( )
?
?1
?2
? = ? + ?1?1 + ?2?2
? = ?(?)
典型的なh は
シグモイド関数
? ? =
1
1 + exp ??
シグモイド関数
? ? =
1
1 + exp ??
実際の計算
1
?1
?2
? ?
h( )
?
?1
?2
1.0
0.1
0.5
0.1
0.2
0.45 0.610639234
浮動小数点
どこまで精度
が必要かは
不明
畳み込み演算
1 2 3 0
0 1 2 3
3 0 1 2
2 3 0 1
2 0 1
0 1 2
1 0 2
15 16
6 15
行列演算
GPUが得意
スパコンは苦手(なはず)。
領域分解して並列性をあ
げるなどして対応している
(はず)。
研究者の皆さんどうしているのか?
TensorFlow 等
で
ネットワーク設
計
データを用意
して、レンタル
サーバで計算
検証
できたネットワーク+パラメタ
Cのソース生成
コンパイルして自分の
PCやサーバで実行
FPGA を使う
TensorFlow 等
で
ネットワーク設
計
データを用意
して、レンタル
サーバで計算
検証
できたネットワーク+パラメタ
Cのソース生成
コンパイルして自分の
PCやサーバで実行FPGA 上で
TensorFlow
? Python でネットワーク設計
http://qiita.com/icoxfog417/items/fb5c24e35a849f8e2c5d
が参考になる
? = ?2
+ ?
import tensorflow as tf
def x2_plus_b(x, b):
_x = tf.constant(x)
_b = tf.constant(b)
result = tf.square(_x)
result = tf.add(result, _b)
return result
?
?
square add
FPGA の問題
1
?1
??
? ?
h( )
?
?1
??
…
? =
?=1
?
????
行列演算=積和演算
しかも浮動小数点
?
h( )
二値化NN
?
1
?
?1
?1
??
??
…
?? ?? ??
-1 -1 1
-1 +1 -1
+1 -1 -1
+1 +1 1
?? ?? ??
0 0 1
0 1 0
1 0 0
1 1 1
Binarized Neural Networks
? Binarized Neural Networks: Training Neural
Networks withWeights and Activations
Constrained to +1 or -1
? XNOR-Net: ImageNet Classification Using
Binary Convolutional Neural Networks
Qiita に日本語で解説を書いた人がいる
http://qiita.com/supersaiakujin/items/6adaf9731c9475891911
まとめ
? Binary Neural Networks で FPGA でも高速にし
かも GPU に劣らない早い計算ができる。精度
もそれほど落ちない(らしい)。
? Python がいろんなところで使われている
FPGA とHDL
HDL で何か実装してみよう!?
? 使う言語
– VHDL
– Verilog HDL
LED チカチカ=Lチカ
ハードウェアの
Hello World 的存在
VHDL を使った問題
signal x: std_logic
…
process (clk)
variable y : std_logic;
begin
if clk’event and clk = 1 then
y := x + 1
x <= x + 1
end if;
end process;
Q: x はいま 3 とします。
左辺にある y と x は
いくつになるでしょう?
VHDL を使った問題
signal x: std_logic
…
process (clk)
variable y : std_logic;
begin
if clk’event and clk = 1 then
y := x + 1
x <= x + 1
end if;
end process;
A:
y は 4、
x は 3のまま。
次のクロックで 4。
何を意味してい
るのか?
FPGA でパイプライン処理(再掲)
処理 処理 処理 処理 処理
処理を細分化することで高速化が可能
x + 1
x
x + 1
x
頭の中でオーバラップする時間を
考えながら設計する!!
何を意味してい
るのか?
そもそも15年くらい前は、、、
今でも検証には波形を见る
HDL 開発者のために本を書きました
? ARM Cortex-A9×2! ZynqでワンチップLinux
on FPGA
2014/11/25 に発売された本
Amazonで一瞬だけ1位になった
FPGA を使う(再掲)
TensorFlow 等で
ネットワーク設計
データを用意して、
レンタルサーバで
計算
検証
できたネットワーク+パラメタ
Cのソース生成
コンパイルして自分の
PCやサーバで実行FPGA 上でHLS という
技術でC/C++ を
HDL 化可能
東工大の中原先生の研究(だとおもう)
/HirokiNakahara1/cnn-on-fpgagpu から勝手に想像
HLS(High Level Synthesis)
? Vivado HLS/SDSoC
– C/C++
? Intel FPGA SDK for OpenCL
– OpenCL(C ライク)
? Polypony
– Python
雑誌で记事を书きました。
まとめ
? FPGA の開発には HLS を使おう!!
– 今回のこれからの話は Polyphony (Python Based)
PYTHON 入門
Jupyter をつかって簡単に Python
Python を使う上での注意点
? なぜか Python 2 と 3 がある
– バージョンで微妙に違いあり
– ここでは Version 3.X をお勧め
>>> print 1, 2, 3
1 2 3
>>> print (1, 2, 3)
1 2 3
Version 2.X Version 3.X
スクリプト言語っぽい 普通の言語っぽい
入門者にお勧めの本
定価:本体3,800円+税
= 4,104 円
ただし、Version 2 系
使った限りでは Version 3 でも
大丈夫だった
入門の次のステップ
この手の Python の本多し
Python って数学に強いの?
BLAS
Basic Linear Algebra Subprograms
ベクトルと行列に関する基本線型代数操作
LAPACK
Linear Algebra PACKage
線型計算のための数値解析ソフトウェアライブラリバックエンドで
これらを使用可能
? OpenBLAS
? ATLAS
実際に使ってみる:jupyter を使う
ジュピター
Try it!!
http://jupyter.org/
新规作成(笔测迟丑辞苍3)
Hello World
実行
Hello Word 関数
ここの空白が
本当は重要
Python のプログラム例
g_v0 = 20150529
g_v1 = 20170406
def func(n):
if n % 2:
return g_v0
else:
return g_v1
ここの空白が
本当は重要
TAB=4文字
を推奨
Python のプログラム例
def func(x):
ans = 0
iterLeft = x
while ( iterLeft != 0 ):
ans = ans + x
iterLeft = iterLeft - 1
if True :
print("x = ", x, ", ans = ", ans, ",
iterLeft = ", iterLeft)
return ans
宣言しなくても
よい
代入は
ローカル変数
Python のローカルとグローバル変数
のルールは何ですか?
Python では、関数内で参照されるだけの変数は暗黙的にグローバル
にです。関数の本体のどこかで値が変数に代入されたなら、それは明
示的にグローバルであると宣言されない限り、ローカルであるとみなさ
れます。Python では、関数内で参照されるだけの変数は暗黙的にグ
ローバルにです。関数の本体のどこかで値が変数に代入されたなら、
それは明示的にグローバルであると宣言されない限り、ローカルであ
るとみなされます。
最初はちょっと驚くでしょうが、少し考えると納得できます。一方では、
代入された変数に global を要求することで、意図しない副作用を防げ
ます。他方では、グローバルな参照の度に global が要求されてしまう
と、 global を使ってばかりになってしまいます。ビルトイン関数やイン
ポートされたモジュールの内容を参照するたびにグローバル宣言をし
なければならないのです。その乱雑さは副作用を特定するための
global 宣言の便利さよりも重大です。
http://docs.python.jp/3/faq/programming.html#what-are-the-rules-for-local-and-global-variables-in-python
Global と Local
? 関数内で参照されるだけの変数は暗黙的にグローバル。
? 関数の本体のどこかで値が変数に代入されたなら、ローカルであ
るとみなされます。
def func(x):
ans = g_v + x
return ans
ans: 代入されているのでローカル
g_v: 参照だけなのでグローバル
x: 引数なのでローカル
ルール
Fibonacci Number
#from polyphony import testbench
def fib(n):
if n <= 0: return 0
if n == 1: return 1
r0 = 0
r1 = 1
for i in range(n-1):
prev_r1 = r1
r1 = r0 + r1
r0 = prev_r1
return r1
#@testbench
def test():
expect = [0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610]
for i in range(len(expect)):
result = fib(i)
assert expect[i] == result
print(i, "=>", result)
test()
まとめ
? Python を使おう!!
– 空白に注意
– グローバルとローカルに注意
– jupyter を使うと便利
FPGA と JUPYTER
ここでは単純に FPGA と Python の組み合わせ例を見せます
PYNQ:Python Productivity For Zynq
Zynq という ARM+FPGAの
ボードを Python で
使い倒そうという
コロンビア大学発の
アカデミックな試み(たぶん)
ターゲットは誰?
ソフトウェアの開発者
Key technologies
実際のデモ
? LED を光らせる
? OLED に何か表示する
? センサーをつかう
Binary NN のデモ
? Cifar10
– 画像を10種類に分類するデモ
おまけ:スプラトゥーンの解析ができるらしい
IkaLog
https://www.nintendo.co.jp
@hasegaw
から勝手に引用
K近傍
使っている
らしい
まとめ
? PYNQ を使うと FPGA を知らなくてもハードが
使える
? Binary Neural Network も使える
POLYPHONY (高位合成) 入門
Python でFPGA のプログラミング
まずは Lチカ、、、
? こんな感じでできます
といいたいところですが、デモしません。たぶん方向性が違うので
from polyphony import testbench, module, is_worker_running
from polyphony.io import Bit
@module
class Blink:
def __init__(self):
self.led = Bit(0)
self.append_worker(self.main, led)
def main(self):
led = 1
while is_worker_running():
self.led.wr(led)
led = ~led
self._wait(10000000)
def _wait(self, interval):
for i in range(interval):
pass
blink = Blink()
Polyphony で可能な IoT 的なこと
? SPI のアクセス
? I2C のアクセス
SPI を通してA/Dコンバータから
情報を取得。
LPF (ロウ?パス?フィルター)をかけて
CPUに送る
Arduino や Raspberry Pi でもできます。
A/D に関しては Raspberry
Pi より Arduino
根性があるなら FPGA
準備(1/4)
? Python3 のインストール
> python3 --version
Python 3.4.5
sudo apt-get python3-dev
準備(2/4)
? pip3 のインストール
> pip3 --version
pip 8.1.1 from /lib/python3.4/site-
packages (python 3.4)
sudo apt-get python3-pip
準備(3/4)
? polyphony のインストール
> pip3 install polyphony
> polyphony –V
Polyphony 0.3.0
準備(4/4)
? iverilog のインストール sudo apt-get install iverilog
> iverilog -V
Icarus Verilog version 11.0 (devel) (s20150603-148-g24d1f49)
Copyright 1998-2015 Stephen Williams
Hello World
from polyphony import testbench
def hello():
print("Hello World.")
@testbench
def test():
hello()
test()
hello.py
Hello World を Python3 で実行
> python3 hello.py
Hello World.
Hello World をコンパイル?実行
> polyphony hello.py
> ls *.v
hello.v polyphony_out.v test.v
> iverilog -o hello polyphony_out.v test.v
> ./hello
0:
Hello World.
Hello World.
Hello World.
Hello World.
150:finish
Hello World.
コンパイル
.v ファイルを
確認
iverilog でコンパイル
simu.py をダウンロード
? 前の手順をいっぺんにおこなう Python のスク
リプト
https://github.com/ktok07b6/polyphony/blob/master/simu.py
クリックで
ダウンロード
simu.py を使う
> ../bin/simu.py hello.py
0:
Hello World.
Hello World.
Hello World.
Hello World.
150:finish
Hello World.
Hello World(再掲)
from polyphony import testbench
def hello():
print("Hello World.")
@testbench
def test():
hello()
test()
hello.py
FPGA 側で
実行されるであ
ろうコード
print は実機
では使えない
ポイント
? FPGA 側で実行されるコードは関数
? print は実機では実行されない
– シミュレーションでは実行可能
? 用語
– testbench :テストベンチ
? 要はテスト用プログラム
もう少し実用的なコード
from polyphony import testbench
def mul_plus(a, b, c, d):
return a * b + c * d
@testbench
def test():
assert 17 == mul_plus(1, 2, 3, 4)
assert 62 == mul_plus(4, 5, 6, 7)
test()
Assert
整合性の
チェック
Python3 で実行
> python3 mul_plus.v
Traceback (most recent call last):
File "mul_plus.v", line 11, in <module>
test()
File “…./__init__.py", line 30, in _testbench_decorator
func()
File "mul_plus.v", line 8, in test
assert 17 == mul_plus(1, 2, 3, 4)
AssertionError
エラー!!!
バグを修正
from polyphony import testbench
def mul_plus(a, b, c, d):
return a * b + c * d
@testbench
def test():
assert 14 == mul_plus(1, 2, 3, 4)
assert 62 == mul_plus(4, 5, 6, 7)
test()
バグを修正
Python3 で実行
> python3 mul_plus.v
何も出力されない
けど正しい結果
simu.py で実行
> ../bin/simu.py mul_plus.v
0:mul_plus_0_in_a= x, mul_plus_0_in_b= x, mul_plus_0_in_c= x, mul_plus_0_in_d= x,
mul_plus_0_out_0= x
10:mul_plus_0_in_a= 0, mul_plus_0_in_b= 0, mul_plus_0_in_c= 0, mul_plus_0_in_d= 0,
mul_plus_0_out_0= 0
110:mul_plus_0_in_a= 1, mul_plus_0_in_b= 2, mul_plus_0_in_c= 3, mul_plus_0_in_d= 4,
mul_plus_0_out_0= 0
130:mul_plus_0_in_a= 1, mul_plus_0_in_b= 2, mul_plus_0_in_c= 3, mul_plus_0_in_d= 4,
mul_plus_0_out_0= 14
160:mul_plus_0_in_a= 4, mul_plus_0_in_b= 5, mul_plus_0_in_c= 6, mul_plus_0_in_d= 7,
mul_plus_0_out_0= 14
180:mul_plus_0_in_a= 4, mul_plus_0_in_b= 5, mul_plus_0_in_c= 6, mul_plus_0_in_d= 7,
mul_plus_0_out_0= 62
220:finish
実行時間
Fibonacci Number
from polyphony import testbench
def fib(n):
if n <= 0: return 0
if n == 1: return 1
r0 = 0
r1 = 1
for i in range(n-1):
prev_r1 = r1
r1 = r0 + r1
r0 = prev_r1
return r1
@testbench
def test():
expect = [0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610]
for i in range(len(expect)):
result = fib(i)
assert expect[i] == result
print(i, "=>", result)
test()
jupyter で実行
質疑応答
? @ryos36
? ハッシュタグ
#polyphony
Polyphony の今後
? CPU をつくります
? Deep Learning
? Bayes
? 数値計算
– 精度保証付き?

More Related Content

研究者のための Python による FPGA 入門