Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

11,101 views

Published on

Python をつかった FPGA 入門。Python 初心者でも大丈夫。関数が書ければすぐにできる。

Published in: Software
  • If you want to download or read this book, copy link or url below in the New tab ......................................................................................................................... DOWNLOAD FULL PDF EBOOK here { http://bit.ly/2m6jJ5M } ......................................................................................................................... Download EPUB Ebook here { http://bit.ly/2m6jJ5M } .........................................................................................................................
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • If you want to download or read this book, copy link or url below in the New tab ......................................................................................................................... DOWNLOAD FULL PDF EBOOK here { http://bit.ly/2m77EgH } ......................................................................................................................... Download EPUB Ebook here { http://bit.ly/2m77EgH } .........................................................................................................................
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

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

  1. 1. 研究者のための Python による FPGA 入門 有限会社シンビー 2017/4/10
  2. 2. アジェンダ • FPGA と HPC(High-Performance Computing) • FPGA と Deep Learning • FPGA と HDL(Hardware Description Language) • Python (スクリプト言語) 入門 • FPGA と jupyter • Polyphony (高位合成) 入門
  3. 3. はじめに 研究 テーマ 道具人脈
  4. 4. 自己紹介 • @ryos36 • ハッシュタグ #polyphony
  5. 5. FPGA と HPC 自分の研究に必要な道具は何か?CPU か?GPUか?FPGAか?
  6. 6. FPGA=Field-Programmable Gate Array http://www.ni.com より
  7. 7. FPGA Wikipedia より
  8. 8. FPGA の特徴 得意なこと • 並列計算 • レイテンシを守ること • ビット計算 • 柔軟性 不得意なこと • 高速処理?
  9. 9. Clock の比較 Tesla P100 GTX950-2GPYNQ-Z1 1328M1024M~200M Core i7-7700K 4200M いろんなところから画像引用。価格は調べた限りでの参考
  10. 10. 価格だけでいうと 6,556,568 円!! Xilinx より
  11. 11. 比較 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 当時の最新?スパコン ノード数不明
  12. 12. 比較 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 得意なこと 柔軟性のあ る並列計算 積和演算に特化 逐次処理 逐次処理 自由度が高く 入手性もよいので 研究に最適!!
  13. 13. FPGA の特徴(再掲) 得意なこと • 並列計算 • レイテンシを守ること • ビット計算 • 柔軟性 不得意なこと • 高速処理?
  14. 14. FPGA の並列処理 処理 処理 処理 処理 処理 処理 処理 処理
  15. 15. FPGA でパイプライン処理 処理 処理 処理 処理 処理 処理を細分化することで高速化が可能
  16. 16. FPGA で並列処理 処理 処理 処理 処理 処理 並列に処理することで高速化が可能
  17. 17. FPGA の柔軟性(可変長ビット) 64bit 32bit 70bit 49bit 18bit 一般的なレジスタのサイズ 一般的なレジスタのサイズ レジスタのサイズを変えることができる(混在も可能)
  18. 18. 独自表現方法をとることが出来る 8 23 11 52 float double よくある浮動小数点 14 55独自表現
  19. 19. 浮動小数点:参考 Wikipedia より 研究に必要な 精度の確保
  20. 20. 参考:Maxwell (GPU) の中身 超越関数用 64bit 浮動小 数点演算器は 1個!! 32bit 浮動小 数点の演算器 32 入手が容易なGPUは64bit 浮動小数点の性能は1/32になる!! Load/Store がうまく働き32bit 浮動小数点の積和演算をフル活用 できたときのみカタログスペックの性能が出る http://pc.watch.impress.co.jp/docs/column/kaigai/752331.html
  21. 21. 参考:スパコン 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 コア。
  22. 22. 比較(再掲)+ 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 などに適 する
  23. 23. まとめ • CPU(スパコン) が万能なわけではない • GPU もまた万能なわけではない(適合分野有) • FPGA は柔軟性に富むので研究に使える
  24. 24. FPGA とディープラーニング
  25. 25. ディープラーニング … … … 0の確率 3の確率 8の確率 9の確率 ……
  26. 26. パーセプトロン 1 𝑥1 𝑥2 𝑎 𝑦 h( ) 𝑏 𝑤1 𝑤2 𝑎 = 𝑏 + 𝑤1𝑥1 + 𝑤2𝑥2 𝑦 = ℎ(𝑎) 典型的なh は シグモイド関数 ℎ 𝑥 = 1 1 + exp −𝑥
  27. 27. シグモイド関数 ℎ 𝑥 = 1 1 + exp −𝑥
  28. 28. 実際の計算 1 𝑥1 𝑥2 𝑎 𝑦 h( ) 𝑏 𝑤1 𝑤2 1.0 0.1 0.5 0.1 0.2 0.45 0.610639234 浮動小数点 どこまで精度 が必要かは 不明
  29. 29. 畳み込み演算 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が得意 スパコンは苦手(なはず)。 領域分解して並列性をあ げるなどして対応している (はず)。
  30. 30. 研究者の皆さんどうしているのか? TensorFlow 等 で ネットワーク設 計 データを用意 して、レンタル サーバで計算 検証 できたネットワーク+パラメタ Cのソース生成 コンパイルして自分の PCやサーバで実行
  31. 31. FPGA を使う TensorFlow 等 で ネットワーク設 計 データを用意 して、レンタル サーバで計算 検証 できたネットワーク+パラメタ Cのソース生成 コンパイルして自分の PCやサーバで実行FPGA 上で
  32. 32. 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
  33. 33. FPGA の問題 1 𝑥1 𝑥𝑛 𝑎 𝑦 h( ) 𝑏 𝑤1 𝑤𝑛 … 𝑎 = 𝑖=1 𝑛 𝑤𝑖𝑥𝑖 行列演算=積和演算 しかも浮動小数点
  34. 34. 𝑦 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
  35. 35. 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
  36. 36. まとめ • Binary Neural Networks で FPGA でも高速にし かも GPU に劣らない早い計算ができる。精度 もそれほど落ちない(らしい)。 • Python がいろんなところで使われている
  37. 37. FPGA とHDL
  38. 38. HDL で何か実装してみよう!? • 使う言語 – VHDL – Verilog HDL LED チカチカ=Lチカ ハードウェアの Hello World 的存在
  39. 39. 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 は いくつになるでしょう?
  40. 40. 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。 何を意味してい るのか?
  41. 41. FPGA でパイプライン処理(再掲) 処理 処理 処理 処理 処理 処理を細分化することで高速化が可能 x + 1 x x + 1 x 頭の中でオーバラップする時間を 考えながら設計する!! 何を意味してい るのか?
  42. 42. そもそも15年くらい前は、、、
  43. 43. 今でも検証には波形を見る
  44. 44. HDL 開発者のために本を書きました • ARM Cortex-A9×2! ZynqでワンチップLinux on FPGA 2014/11/25 に発売された本 Amazonで一瞬だけ1位になった
  45. 45. FPGA を使う(再掲) TensorFlow 等で ネットワーク設計 データを用意して、 レンタルサーバで 計算 検証 できたネットワーク+パラメタ Cのソース生成 コンパイルして自分の PCやサーバで実行FPGA 上でHLS という 技術でC/C++ を HDL 化可能 東工大の中原先生の研究(だとおもう) https://www.slideshare.net/HirokiNakahara1/cnn-on-fpgagpu から勝手に想像
  46. 46. HLS(High Level Synthesis) • Vivado HLS/SDSoC – C/C++ • Intel FPGA SDK for OpenCL – OpenCL(C ライク) • Polypony – Python
  47. 47. 雑誌で記事を書きました。
  48. 48. まとめ • FPGA の開発には HLS を使おう!! – 今回のこれからの話は Polyphony (Python Based)
  49. 49. PYTHON 入門 Jupyter をつかって簡単に Python
  50. 50. 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 スクリプト言語っぽい 普通の言語っぽい
  51. 51. 入門者にお勧めの本 定価:本体3,800円+税 = 4,104 円 ただし、Version 2 系 使った限りでは Version 3 でも 大丈夫だった
  52. 52. 入門の次のステップ この手の Python の本多し
  53. 53. Python って数学に強いの? BLAS Basic Linear Algebra Subprograms ベクトルと行列に関する基本線型代数操作 LAPACK Linear Algebra PACKage 線型計算のための数値解析ソフトウェアライブラリバックエンドで これらを使用可能 • OpenBLAS • ATLAS
  54. 54. 実際に使ってみる:jupyter を使う ジュピター Try it!! http://jupyter.org/
  55. 55. 新規作成(Python3)
  56. 56. Hello World 実行
  57. 57. Hello Word 関数 ここの空白が 本当は重要
  58. 58. Python のプログラム例 g_v0 = 20150529 g_v1 = 20170406 def func(n): if n % 2: return g_v0 else: return g_v1 ここの空白が 本当は重要 TAB=4文字 を推奨
  59. 59. 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 宣言しなくても よい 代入は ローカル変数
  60. 60. 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
  61. 61. Global と Local • 関数内で参照されるだけの変数は暗黙的にグローバル。 • 関数の本体のどこかで値が変数に代入されたなら、ローカルであ るとみなされます。 def func(x): ans = g_v + x return ans ans: 代入されているのでローカル g_v: 参照だけなのでグローバル x: 引数なのでローカル ルール
  62. 62. 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()
  63. 63. まとめ • Python を使おう!! – 空白に注意 – グローバルとローカルに注意 – jupyter を使うと便利
  64. 64. FPGA と JUPYTER ここでは単純に FPGA と Python の組み合わせ例を見せます
  65. 65. PYNQ:Python Productivity For Zynq Zynq という ARM+FPGAの ボードを Python で 使い倒そうという コロンビア大学発の アカデミックな試み(たぶん)
  66. 66. ターゲットは誰? ソフトウェアの開発者
  67. 67. Key technologies
  68. 68. 実際のデモ • LED を光らせる • OLED に何か表示する • センサーをつかう
  69. 69. Binary NN のデモ • Cifar10 – 画像を10種類に分類するデモ
  70. 70. おまけ:スプラトゥーンの解析ができるらしい IkaLog https://www.nintendo.co.jp @hasegaw から勝手に引用 K近傍 使っている らしい
  71. 71. まとめ • PYNQ を使うと FPGA を知らなくてもハードが 使える • Binary Neural Network も使える
  72. 72. POLYPHONY (高位合成) 入門 Python でFPGA のプログラミング
  73. 73. まずは 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()
  74. 74. Polyphony で可能な IoT 的なこと • SPI のアクセス • I2C のアクセス SPI を通してA/Dコンバータから 情報を取得。 LPF (ロウ・パス・フィルター)をかけて CPUに送る Arduino や Raspberry Pi でもできます。 A/D に関しては Raspberry Pi より Arduino 根性があるなら FPGA
  75. 75. 準備(1/4) • Python3 のインストール > python3 --version Python 3.4.5 sudo apt-get python3-dev
  76. 76. 準備(2/4) • pip3 のインストール > pip3 --version pip 8.1.1 from /lib/python3.4/site- packages (python 3.4) sudo apt-get python3-pip
  77. 77. 準備(3/4) • polyphony のインストール > pip3 install polyphony > polyphony –V Polyphony 0.3.0
  78. 78. 準備(4/4) • iverilog のインストール sudo apt-get install iverilog > iverilog -V Icarus Verilog version 11.0 (devel) (s20150603-148-g24d1f49) Copyright 1998-2015 Stephen Williams
  79. 79. Hello World from polyphony import testbench def hello(): print("Hello World.") @testbench def test(): hello() test() hello.py
  80. 80. Hello World を Python3 で実行 > python3 hello.py Hello World.
  81. 81. 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 でコンパイル
  82. 82. simu.py をダウンロード • 前の手順をいっぺんにおこなう Python のスク リプト https://github.com/ktok07b6/polyphony/blob/master/simu.py クリックで ダウンロード
  83. 83. simu.py を使う > ../bin/simu.py hello.py 0: Hello World. Hello World. Hello World. Hello World. 150:finish Hello World.
  84. 84. Hello World(再掲) from polyphony import testbench def hello(): print("Hello World.") @testbench def test(): hello() test() hello.py FPGA 側で 実行されるであ ろうコード print は実機 では使えない
  85. 85. ポイント • FPGA 側で実行されるコードは関数 • print は実機では実行されない – シミュレーションでは実行可能 • 用語 – testbench :テストベンチ • 要はテスト用プログラム
  86. 86. もう少し実用的なコード 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 整合性の チェック
  87. 87. 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 エラー!!!
  88. 88. バグを修正 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() バグを修正
  89. 89. Python3 で実行 > python3 mul_plus.v 何も出力されない けど正しい結果
  90. 90. 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 実行時間
  91. 91. 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()
  92. 92. jupyter で実行
  93. 93. 質疑応答 • @ryos36 • ハッシュタグ #polyphony
  94. 94. Polyphony の今後 • CPU をつくります • Deep Learning • Bayes • 数値計算 – 精度保証付き?

×