そろそろプログラマーもFPGAを触ってみよう！

##そろそろプログラマーもFPGAを触ってみよう！

これは[builderscon tokyo 2016](https://builderscon.io/builderscon/tokyo/2016)の発表スライドです。

<img width="400" src="https://qiita-image-store.s3.amazonaws.com/0/38290/b7a9e646-a500-8d24-9a79-8847ad186a44.png">

---
##自己紹介

@kazunori_279

- クラウドのデベロッパー・アドボケイト
    - エバンジェリストみたいなお仕事
    - コミュニティ支援：GCPUG、bq_sushi、TensorFlow User Group etc
- 趣味のFPGA
    - 2013年くらいからいじり始め
    - [FPGAエクストリーム・コンピューティング](https://connpass.com/series/387/)主宰：合計8回

---
##これまでに書いたFPGA記事

はてなブックマークでバズった記事たち

- [マイクロソフトはどうやってBingをFPGAで実装したか](http://qiita.com/kazunori279/items/6f517648e8a408254a50): 952 users
- [ハード素人が32bit CPUをFPGAで自作して動かすまで読んだ本のまとめ](http://d.hatena.ne.jp/kazunori_279/20140210/1391989012): 576 users
- [文字通り「ネットワークがコンピューター」な金融HFTでのFPGAの使われ方](http://d.hatena.ne.jp/kazunori_279/20130107/1357521548): 517 users
- [JP Morgan Chaseがデリバティブ専用スパコンをFPGAで作った話](http://d.hatena.ne.jp/kazunori_279/20130903/1378160380): 285 users

---
#FPGAをめぐる最近の動き

---
##AWS、FPGAインスタンス提供開始

わお

<img width="400" alt="Screen Shot 2016-12-01 at 11.10.56 AM.png" src="https://qiita-image-store.s3.amazonaws.com/0/38290/d9677db7-a11f-65c6-401f-b13b87f685fa.png">
From: https://aws.amazon.com/blogs/aws/developer-preview-ec2-instances-f1-with-programmable-hardware/

---
##Intel、FPGAを大人買い

1年前にFPGA大手Alteraを2兆円で買収
Xeon＋FPGAチップは2017年出荷

<img width="400" src="https://www.nextplatform.com/wp-content/uploads/2016/03/Broadwell_FPGA.png">
From: https://www.nextplatform.com/2016/03/14/intel-marrying-fpga-beefy-broadwell-open-compute-future/

---
##「2020年までにクラウドサーバの1/3はFPGAを導入」

ニューラルネット、暗号化、データ圧縮など

<img width="400" src="http://images.anandtech.com/doci/9321/FPGA-Integration.png?_ga=1.121840587.1747599332.1480472135">

---
##MicrosoftもFPGAに賭けてる

「Microsoftのデータセンターの新規サーバは、ほぼすべてにFPGAを搭載」

<img width="400" src="https://qiita-image-store.s3.amazonaws.com/0/38290/6cc8b2c1-9267-0086-79a6-14fc7b24e53f.png">
From: https://www.microsoft.com/en-us/research/project/project-catapult/

---
##IBMもFPGA

IBMのクラウドサービスでFPGAをホスティング

<img width="400" alt="Screen Shot 2016-12-02 at 9.46.37 AM.png" src="https://qiita-image-store.s3.amazonaws.com/0/38290/b286821a-0006-710a-574c-81133c676457.png">
From: http://www.electronicsweekly.com/news/xilinx-and-ibm-put-big-data-fpga-design-in-the-cloud-2016-04/

---
#FPGA使うとどうなる？

---
##MicrosoftのBing検索

Webページの特徴量抽出とニューラルモデル推論をFPGA実装
スループットが**2倍**に

<img width="400" src="https://qiita-image-store.s3.amazonaws.com/0/38290/4684d0cb-88bf-066e-f867-1d61056386ad.png">
From: http://qiita.com/kazunori279/items/6f517648e8a408254a50

---
##Azureの翻訳サービス

CPUは14秒→FPGAは**2.6秒**

<img width="400" src="http://japan.zdnet.com/storage/2016/09/27/49c2d09878f35a11d78a73902552ed72/008.jpg">
From: http://japan.zdnet.com/article/35089622/2/

---
##JP Morgan

デリバティブのリスク分析をFPGA実装に移植
全社規模のリスク分析が8時間から**4分**に

<img width="400" alt="Screen Shot 2016-12-02 at 10.10.50 AM.png" src="https://qiita-image-store.s3.amazonaws.com/0/38290/5ed104dc-fd41-7a96-ac25-f5f4674234da.png">
From: http://d.hatena.ne.jp/kazunori_279/20130903/1378160380

---
##IBM Netezza

データウェアハウス・アプライアンス
SQLクエリをFPGA搭載のI/Oコントローラで処理、鬼速

<img width="400" src="https://qiita-image-store.s3.amazonaws.com/0/38290/8579c5e1-8ffd-60fe-82d8-0c8d2fc611bf.png">
From: https://thinkit.co.jp/article/1161/1

---
##25 nsで株価取引

High Frequency Trading (HFT)：マイクロ秒単位で売買。ソフトでは間に合わない
株価パケットの受信中に売買パケットを送り始める（意味不明）

<img width="400" alt="Screen Shot 2016-12-02 at 10.24.42 AM.png" src="https://qiita-image-store.s3.amazonaws.com/0/38290/0d02e8b9-6a61-1b45-4dbf-965f905fd103.png">

From: http://www.slideshare.net/kazunori279/moving-computation-to-the-data-1

---
##ニューラルネットもFPGAで

東工大・中原先生がさくっと作った事例
CNNで画像認識：RasPiのARMでは85.81 ms→FPGAでは**1.56 ms**
消費電力もひと桁くらい低い。電力性能比はたぶん二桁くらいの差

<img width="400" src="https://qiita-image-store.s3.amazonaws.com/0/38290/4a4a6ba7-59b7-8e3a-8bcd-09adae12f4cd.png">
From: http://www.slideshare.net/HirokiNakahara1/tensor-flow-usergroup-2016

---
#なぜいまFPGAか？

---
##ムーアの法則は終わった

CPUクロックは数GHzどまり。コア数増えても活用は限定的
特定用途向けの専用設計ハードウェア、アクセラレータでがんばるしか

<img width="400" src="https://qiita-image-store.s3.amazonaws.com/0/38290/95f8ece8-4da2-d6e3-873a-4e10b293814f.png">
From: http://research.microsoft.com/pubs/212001/Catapult_ISCA_2014.pdf

---
##そもそもノイマン型ってどうなの

ボトルネックじゃね？
シリコンダイの大半がキャッシュで埋まる
演算器あまり並べられない

<img width="400" src="https://qiita-image-store.s3.amazonaws.com/0/38290/7bb1dcf4-05ce-13e9-06fd-0086d0e56bad.png">

---
##ではCPU以外の選択肢は？

以下はおおざっぱな印象
適材適所が肝要

||◯|×|
|:-:|:-:|:-:|
|CPU|ソフト開発者たくさん。クロック最速（数GHz）|汎用品の限界。ノイマンボトルネック。クロックもう伸びない|
|GPU|大量の数値演算なら最強。ソフト開発者が扱える。クロック速い（1GHz位）|汎用品の限界。電力食い過ぎ（200W）|
|[ASIC](https://ja.wikipedia.org/wiki/ASIC)|自由に専用設計できる。低消費電力（uW〜W）|修正できないので開発が大がかり。1〜2年＋数億円かかる。コストの8割が検証作業|
|FPGA|自由に専用設計できる。低消費電力（mW〜W）。いつでも仕様変更・バグ修正できる。1万円で試せる手軽さ|ソフト開発者には難しい。クロック遅い（数100MHz）。集積度低い|

---
## 例：ビットコイン

ハッシュ値の総当りってFPGA/ASIC向き

<img width="400" alt="Screen Shot 2016-12-02 at 11.57.50 AM.png" src="https://qiita-image-store.s3.amazonaws.com/0/38290/8aba3806-4c0d-fd85-4cb7-d3cb710b268e.png">
From: http://www.slideshare.net/kenjiurushima/20140602-bitcoin1-201406031222

---
#FPGAって何？

---
##[Field Programmable Gate Array](https://ja.wikipedia.org/wiki/FPGA)

デジタル回路を自分で設計できるLSI
つまり大人の電子ブロック。数万〜数百万個（値段相応）

<img width="400" src="https://qiita-image-store.s3.amazonaws.com/0/38290/b7a9e646-a500-8d24-9a79-8847ad186a44.png">

---
##FPGAのしくみ

論理ゲートの動作や接続の状態を**SRAM**で持ってる
ソフトに近い手軽さでハードを設計。バグっても直せる

<img width="400" src="https://qiita-image-store.s3.amazonaws.com/0/38290/4f0f94c8-ddce-1965-19f2-28e2857b49d8.png">
From: http://www.slideshare.net/HirokiNakahara1/tensor-flow-usergroup-2016

---
##デジタル回路をHDLで書く
[Hardware Description Language (HDL)](https://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%BC%E3%83%89%E3%82%A6%E3%82%A7%E3%82%A2%E8%A8%98%E8%BF%B0%E8%A8%80%E8%AA%9E)

- Verilog HDLとVHDLが主流
- 光の速さ（数10ns）で動くExcelの式みたい

```verilog
assign X = A & B | ~C;
```
これが、こうなる
![](http://image.itmedia.co.jp/mn/articles/0809/04/ay_drl3_01_fig01.gif)
From: http://monoist.atmarkit.co.jp/mn/articles/0809/04/news122.html

---
##HDL書けるとモテるらしい

<img width="400" src="https://qiita-image-store.s3.amazonaws.com/0/38290/571f9176-206a-943f-8312-c03a67771b53.png">
From: http://news.mynavi.jp/news/2016/11/30/101/

---
##HDLをビルドして、FPGAに流すと動く

<img width="400" src="https://qiita-image-store.s3.amazonaws.com/0/38290/ed9175cf-0d5e-d083-447f-aff3f6b856b3.png">

From: http://www.slideshare.net/HirokiNakahara1/tensor-flow-usergroup-2016

---
#FPGAの得意なこと

---
##特定用途向けの並列計算機をお手軽に作れる

例：1000個のデータに対して「x^2 + x」を計算したい
ループなんていらない。演算器を1000個並べればいいさ
OSのスレッド切替のオーバーヘッドなし。数クロックで完了

<img width="400" src="http://cdn-ak.f.st-hatena.com/images/fotolife/k/kazunori_279/20130821/20130821212110.png">
From: http://www.stanford.edu/class/ee380/Abstracts/110511-slides.pdf

---
##たとえばMicrosoft Bingでは

こんなWebコンテンツの特徴量抽出をソフトでやると600μsかかってた

<img width="400" src="https://qiita-image-store.s3.amazonaws.com/0/38290/ed34c94c-26bf-670b-32b3-e4807b9a170c.png">
From: http://qiita.com/kazunori279/items/6f517648e8a408254a50

---
##たとえばMicrosoft Bingでは

1つのWebコンテンツを54個のステートマシンに同時に流して並列に特徴量抽出
FPGA実装では処理時間が4μsに。**150倍**の高速化

<img width="400" src="https://qiita-image-store.s3.amazonaws.com/0/38290/cfdc8177-5e7f-5053-06b3-5243fba6c915.png">
From: http://qiita.com/kazunori279/items/6f517648e8a408254a50

---
##パイプライン処理・ストリーム処理が得意

大規模整数演算、パターンマッチ、暗号化、フィルタリング等々
いちいちメモリ読み書き不要。内蔵SRAMが鬼速（数TB/s）
東北大・佐野先生の津波シミュレーション：
　　3000段のパイプラインを組んでGPUに勝った

<img width="400" src="https://qiita-image-store.s3.amazonaws.com/0/38290/4a2c712e-d654-5927-49e2-aee8470a2751.png">
From: http://www.slideshare.net/KentaroSano/fpga-gpu

---
##俺たちの知らない非ノイマン型の世界

ハードウェアアルゴリズム
　　クイックソートが最速ではない世界。ソートネットワークならO(log n)
　　シストリックアレイ、データフローなどなど。[FPGAの原理と構成](http://amzn.asia/crtY0T1)を読むべし
　　[JOINやソート、ストリーム処理の専用並列計算機](http://d.hatena.ne.jp/kazunori_279/20130119/1358570662)を自作できる

<img width="400" src="https://qiita-image-store.s3.amazonaws.com/0/38290/4365eac1-8d4a-6445-803f-071989396c04.png">

---
##FPGAが向かない用途

- 大きなデータにランダムアクセスするもの
    - 内部のSRAMに収まる演算なら激速
    - 収まらないとDRAMアクセス発生して遅い
- そもそも並列化の難しい処理
    - クロック遅いので逐次処理はCPUにかなわない
- ソフトやGPUでさっさと用が済む用途
    - FPGA開発のコストと天秤
- いずれASICに乗っ取られる用途
    - 大量の需要が見込め、ASIC開発がペイするもの
    - 仕様が年単位で固定（決まった積和演算とか）

---
#FPGAを使ってみよう

---
##安いFPGAボードを買ってみた

クラウドFPGAもいいけど、RasPiみたいに電子工作するの楽しい
DE0で1万5千円くらい。[入門書](http://d.hatena.ne.jp/kazunori_279/20140210/1391989012)も買った

<img width="400" src="http://www.terasic.com.tw/attachment/archive/364/image/image_74_thumb.jpg">
From: http://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=English&No=364

---
##まずは音を鳴らしてみる

Verilog HDLでカウンタを書く（[詳細](http://d.hatena.ne.jp/kazunori_279/20121204/1354631391)）
50MHzのクロックを数えて5万ごとにスピーカーをオンオフ
50M / 100K = 440Hzの音が鳴るはず

<img width="400" src="https://qiita-image-store.s3.amazonaws.com/0/38290/c09818e6-3cdd-d3f4-0ef7-9c008da7fa07.png">

---
##シミュレータで検証

なんかカッコいいぞ

<img width="400" src="https://qiita-image-store.s3.amazonaws.com/0/38290/d0036113-f685-8bfd-7845-c8cb154db82b.png">

---

##ベンダーツールでビルド

配線だのタイミングチェックだの、重い
ビルドが終わったらDE0に流す

<img width="400" src="http://cdn-ak.f.st-hatena.com/images/fotolife/k/kazunori_279/20121218/20121218232714.png">

---
##なったぜ！

<img width="400" src="https://qiita-image-store.s3.amazonaws.com/0/38290/69fe9beb-9778-91fa-e567-8315bffa6828.png">
From: https://www.youtube.com/watch?v=GFKxnQ_mz1c

---
##キーボードにつないで和音も出た

- MIDIデコード→正弦波生成→エンベロープ制御（[詳細](http://d.hatena.ne.jp/kazunori_279/searchdiary?word=%2A%5B%B2%BB%5D)）

<img width="400" src="https://qiita-image-store.s3.amazonaws.com/0/38290/1cd44c22-2e0e-a54a-fd55-9ac806700b3c.png">
From: https://www.youtube.com/watch?v=gahOvWER_8s

---
##キーボードのMIDIデータをFluentdに流してみた

- MIDIデコード→msgpackエンコード→TCPソケット
- CPUもOSもソフトもなしで、Fluentdを扱える（[詳細](http://qiita.com/kazunori279/items/208e1526367426b39bbb)）

<img width="400" src="https://qiita-image-store.s3.amazonaws.com/0/38290/a43e4c3a-3eb9-4078-ab69-2d67d5422926.png">
From: https://www.youtube.com/watch?v=SEr9_NqvpBM

---
##32bitのMIPS CPUを作ってみた

- Cでfibを書いてgccでMIPSバイナリ生成、動いた（[詳細](http://d.hatena.ne.jp/kazunori_279/20140210/1391989012)）

<img width="400" alt="Screen Shot 2016-12-01 at 12.31.33 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/38290/1e086200-9ffe-689a-dcdf-85742b6e6949.png">
From: https://www.youtube.com/watch?v=CamqAcVlJYQ

---
#...FPGA楽しい！

---
##やってみてわかったこと：HDLを書くのは大変

- HDLは**低レベルすぎ**て気が遠くなる
- 遊ぶのはいいけど、仕事で使うには**検証作業**が大変すぎる
- 全部をFPGA実装はムリなので、バス経由で**CPU連携**するの面倒

<img width="400" src="https://qiita-image-store.s3.amazonaws.com/0/38290/954b683c-5f1a-ad89-ca83-9d169e063f7d.png">

From: http://www.slideshare.net/HirokiNakahara1/tensor-flow-usergroup-2016

---
##そこで高位合成だ

高位合成＝[High Level Synthesis (HLS)](https://en.wikipedia.org/wiki/High-level_synthesis)
ソフトウェア言語でハードのふるまいを記述、HDLを生成
先にソフトで動作チェックでき、検証作業がすっごくラク

- NECの[Cyber Work Bench](http://jpn.nec.com/cyberworkbench/)：C言語。国内業界標準だけど高価すぎて俺には関係ない
- Xilinxの[Vivado HLS](https://japan.xilinx.com/products/design-tools/vivado/integration/esl-design.html)：C/C++/System C。なんと最近無償化された！
- Intel (Altera)の[FPGA SDK for OpenCL](https://www.altera.co.jp/products/design-software/embedded-software-developers/opencl/overview.html): C言語。OpenCLなのでGPUでも動く。ライセンスいくらだろう？
- みよしさんの[Synthesijer](http://wasa-labo.com/wp/?page_id=160)：Java/Scala。オープンソース
- 高前田先生の[PyCoRAM](http://www.slideshare.net/shtaxxx/2015-10-11-pycon-pycoram): 面倒なメモリアクセス部分をPythonで抽象化、肝心なところはHDLでガリガリ書ける。オープンソース

---
##Synthesijerの例

こんなJavaコードを書くと...

<img width="400" src="https://qiita-image-store.s3.amazonaws.com/0/38290/7b9f5cd3-90b1-5560-d1e8-1723feb8b645.png">
From: http://www.sigemb.jp/ESS/2014/files/IPSJ-ESS2014003-1.pdf

---
##Synthesijerの例

こんなHDLが出てくる

<img width="400" src="https://qiita-image-store.s3.amazonaws.com/0/38290/07c2e42f-d509-4be2-af97-1e85b6a6f306.png">
From: http://www.sigemb.jp/ESS/2014/files/IPSJ-ESS2014003-1.pdf

---
##CPUとFPGAの連携は：SoCでラクしよう

[System on Chip (SoC)](https://ja.wikipedia.org/wiki/System-on-a-chip): CPUと周辺回路をワンチップに納めたもの
例: Xilinxの[ZYNQ](https://japan.xilinx.com/products/silicon-devices/soc/zynq-7000.html)。デュアルコアARMとFPGAを混載、L2キャッシュを共有

<img width="400" src="https://qiita-image-store.s3.amazonaws.com/0/38290/8eebadd6-f0bf-31d4-ae97-42681c8d22da.png">
From: https://japan.xilinx.com/products/silicon-devices/soc/zynq-7000.html

---
#デモ

---
##TensorFlow → Vivado HLS → HDL

ディープラーニング（CNN）による手書き数字文字認識（MNIST）
中原先生の[TensorFlow高位合成デモ](http://www.slideshare.net/HirokiNakahara1/tensor-flow-usergroup-2016)をお借りしました。感謝です！

<img width="400" src="https://qiita-image-store.s3.amazonaws.com/0/38290/14f48caf-96e8-0912-0396-8891353444e6.png">
From: http://www.slideshare.net/HirokiNakahara1/tensor-flow-usergroup-2016

---
##Xilinx PYNQで動かす

[Xilinx PYNQ](https://japan.xilinx.com/products/boards-and-kits/1-hydd4z.html): ZYNQをPythonで手軽に使おう、というコンセプト
$229で買える。10日くらいで届いた

<img width="400" src="https://qiita-image-store.s3.amazonaws.com/0/38290/1aa64de9-5757-57c5-ead8-855b576ecff7.png">

---
##電源ONでARM上のLinuxを起動

Jupyter Notebookのサンプルコードで、あっという間にLチカ
JupyterでFPGA開発とは...Xilinxさん分かってらっしゃる

<img width="400" src="https://qiita-image-store.s3.amazonaws.com/0/38290/a592c479-afb6-3d4a-3b5d-1729576e1f86.png">

---
##TensorFlowから生成したビットストリームをコピー

PYNQのフォルダをSMB経由で開いてドラッグ＆ドロップ
なにこのお手軽さ。。

<img width="400" src="https://qiita-image-store.s3.amazonaws.com/0/38290/662f0364-0933-dc01-47b7-f6614bc43cab.png">

---
##中原先生のNotebookもコピーして開く

これであとはNotebookをポチポチするだけ

<img width="400" src="https://qiita-image-store.s3.amazonaws.com/0/38290/49b20e89-7583-b818-00f4-61795c6169a2.png">

---
##FPGAにCNN回路を読み込み

```py
# FPGAのハードウェア部(Programmable Logic(PL))にCNN回路を構成
from pynq import PL
from pynq import Overlay

# Vivado HLS (Cから高位合成)で生成した回路データを読み込み
# CNNのパラメータはTensorFlowで学習済み
# CNNの重みもあらかじめロードします
ol = Overlay("base_with_ip.bit")
ol.download()
```

---
##PythonとFPGAのやりとり部分

手書き数字画像をFPGAのメモリ領域（0x1000）に書いて...

```py
for i in range(0,784):
    w = int(data[idx][i] * 256.0)
    math_ip.write(0x1000+i*4,w) # MNISTのデータ転送
```

CNN回路を起動して認識

```py
math_ip.write(0x0,0x01)
```

---
##PythonとFPGAのやりとり部分

認識結果を読み出す

```py
result=math_ip.read(0x0010)
```

結果を集計すると、認識率95%くらい

```
...
result = 6, label = 6
result = 5, label = 5
result = 8, label = 8
認識率 = 0.950000
```

なにこの手軽さ

---
##Jupyterだからインタラクティブな可視化も得意

FPGAでの認識結果をぱらぱら表示

<img width="400" src="https://qiita-image-store.s3.amazonaws.com/0/38290/32e8452e-13b5-6124-b96d-a4763bcfde50.png">

---
#まとめ

---
##FPGAおもしろいよ

- CPUに縛られないコンピューティング
- ハードなのに手軽に遊べる
- 高位合成やSoC、クラウドなど、環境も整ってきた

---
Disclaimer この記事は個人的なものです｡ここで述べられていることは私の個人的な意見に基づくものであり､私の雇用者には関係はありません｡