PYNQについて調査中　 - Pythonを使ってFPGAでDeep Learningをしよう　-

Zynq　のようにFPGAで高速化することについても関心を持っている。ソフトウェア屋としては、あまり余計なことを考えずにさっさと高速化できるアプローチをしたい。FPGAを使う場合でも、OpenCV相当の実装が予め用意されているような使い方を、まずはしてみたい。
しかし、試してみる機会はないままだ。

「Vivado HLS ビデオ ライブラリを使用して Zynq‐7000 All Programmable SoC でOpenCVアプリケーションを高速化」

http://japan.xilinx.com/support/documentation/application_notes/j_xapp1167.pdf

Evaluating Vivado High-Level Synthesis on OpenCV Functions 
http://www.idt.mdh.se/utbildning/exjobb/files/TR1803.pdf


FPGAの部屋 [Vivado HLS 2015.4 で OpenCV を使ってみた1](http://marsee101.blog19.fc2.com/blog-entry-3432.html)
> 今から使用する Vivado HLSのOpenCV の実装方法は、ハードウエアにする関数の入出力部分はAXI4 Stream で行うということだ。テストベンチでは、IplImage2AXIvideo() で IplImage から AXI4 Stream に直して、image_filter() に入れて、処理後には、AXIvideo2IplImage() で AXI4 Stream から IplImage に戻している。

FPGAの部屋 [Vivado HLS 2015.4 で OpenCV を使ってみた7（FAST Corners Detection 1）](http://marsee101.blog19.fc2.com/blog-entry-3438.html)

> 以下のようにhigh level synthesis 用にXilinxが提供しているコードを使っている。
    hls::AXIvideo2Mat(INPUT_STREAM, img_0);
    hls::Duplicate(img_0, img_1, img_1_);
    hls::CvtColor<HLS_BGR2GRAY>(img_1, img_1g);
    hls::FASTX(img_1g, mask, 20, true);
    hls::Dilate(mask, dmask);
    hls::PaintMask(img_1_, dmask, img_3, color);
    hls::Mat2AXIvideo(img_3, OUTPUT_STREAM);


このような使い方をする限り、Verilog HDLについて知らずに、FPGAを使うことができる。
ソフトウェア屋が、さっさと結果を得る目的について言えば、Verilog HDLを書かなくて済むのが一番だ。


-------------------------------------------------
PYNQについて調査中。


- FPGAの部屋[PYNQボード1](http://marsee101.blog19.fc2.com/blog-entry-3595.html)
- FPGAの部屋[PYNQボード2（Linux の起動）](http://marsee101.blog19.fc2.com/blog-entry-3596.html)

　　ここまでだと、RaspberryPiに慣れている人だったら、同じように起動できることでしょう。

- FPGAの部屋[PYNQボード3（Jupyter Notebook）](http://marsee101.blog19.fc2.com/blog-entry-3597.html)
　　
　　PYNQ ボード用に予め用意された例題をupyter Notebook 環境を使いながら実行する例題のようです。

FPGAの部屋のサイトの著者の方は、他にも有用な記事を多数書き続けています。

[手書き数字認識用畳み込みニューラルネットワーク回路の製作1（概要）](http://marsee101.blog19.fc2.com/blog-entry-3841.html)


- [PYNQ-Z1を購入して動かしてみる](http://qiita.com/takushi-m@github/items/54e8c654ae74d786550d)
- Xilinx [PYNQ-Z1](https://japan.xilinx.com/products/boards-and-kits/1-hydd4z.html)
- qiita [FPGAでDeep Learningしてみる](http://qiita.com/ykshr/items/6c8cff881a200a781dc3) 
    
   PYNQボードで　BNN-PYNQを使う例: 既に学習済みの Cifar10 例題があって, Jupyter notebook 環境から実行しています。

- [PythonでZynqを動かす！　　PYNQ = Python + Zynq](http://www.goose-pc.net/pc/1506)
- Xilinx[PYNQ 開発の背景と今後の方向性
](https://drive.google.com/file/d/0B5npNJkHrRbMT3BYUm1QaWRvajQ/view)

- [FPGAによるディープラーニングの実装](https://drive.google.com/file/d/0B6LEPl6Qd7ntbGpYU2haUlRxZFk/view)
- qiita [FPGAでDeep Learningしてみる - きゅうりを選果する](http://qiita.com/ykshr/items/08147098516a45203761)
    - PYNQボードを[BNN-PYNQ](https://github.com/Xilinx/BNN-PYNQ)　を使った実装です。
    - [TensorFlowでディープラーニングによる『キュウリ』の仕分け](http://workpiles.com/2016/02/tensorflow-cnn-cucumber/)　から学習しています。

connpass [FPGAエクストリーム・コンピューティング](https://fpgax.connpass.com/)

connpass[「PYNQ祭り」延長戦 : FPGAディープラーニング実践懇親会](https://fpgax.connpass.com/event/52935/)


Interface 2017年6月号目次 [ハード計算の世界...GPU＆FPGAを使った超高速Python](http://www.kumikomi.net/interface/contents/201706.php)


[機械学習／Deep Learningの仕事が増える2017年、ソフトウェアエンジニアがFPGAを学ぶべき理由](http://www.atmarkit.co.jp/ait/articles/1701/30/news007.html)
>　最近は大学が忙しくてHDLを書く時間が取れず、2015年ごろから高位合成ばかりです。Xilinxの高位合成ツール「Vivado HLS」（High-Level Synthesis）だと一発で合成できる。「こんなに簡単なんだ」と思いました。大学では、（FPGAで通常使うハードウェア記述言語）Verilog HDLは使わず、高位合成しか教えていません。もうソフトウェアのコードを書く感覚でFPGAを使っている学生ばかりです。

> ──ディープラーニングのライブラリは何が使えますか？

> 中原　TensorFlow、それにCaffe、Chainerなどを使えます。それに会社や部署によっていろいろなフレームワークを使うので、複数のフレームワークに対応しています。Pythonでコードを書いて、ある工夫をしてC++に落とし込んで、Xilinxのツールに入れると動きます。

> ──FPGAでディープラーニングを手掛けるのに、Pythonが書ければOKなんですか？

>中原　OKです。C言語すら書けなくていい。

- SlideShare [機械学習に超入門したはずが・・・いつのまにかFPGAを触っていた話](https://www.slideshare.net/shihoasa/fpga-79188871)

- qiita [そろそろプログラマーもFPGAを触ってみよう！](http://qiita.com/kazunori279/items/a9e97a4463cab7dda8b9)

  この記事での、ディープラーニング（CNN）による手書き数字文字認識（MNIST）の動作例でもJupyter notebook　が使われています。そのため、入出力のどちらかが画像であるよう内容で、その内容を確かめやすい。

- SlideShare  中原先生のTensorFlow高位合成デモ [２値化CNNなDQNをFPGAで動かしてみた](https://www.slideshare.net/HirokiNakahara1/tensor-flow-usergroup-2016)
- 東工大　中原先生の開発した検出器の実装は　GUINNESSという名前で githubで公開されています。

github https://github.com/HirokiNakahara/GUINNESS


付記：
YouTubeでPYNQと検索して動画を見つけることができます。

- [（ 調査 ）Deep Learning 計算を、FPGA 専用アクセレレータ 上で 高速 に 行う試み ～ Deep Learning 計算基盤 を、GPU から 自社製FPGA に 切り替える動き が 加速中。今後はさらに、Neuromorphic chip がやってくる？](http://qiita.com/HirofumiYashima/items/ad9c850511e1059b3c9f)


Deep Learning ではかつてのNeural Network のようなsigmoid関数は使わない。そのため、飽和によって感度が乏しくなることがおきにくくなっている。そのことを利用して結合を示す重みをビット幅の少ないデータ型で表現することが可能になっている。INT8 の型をつかえば、浮動小数点を使うのよりも格段にデータの幅が少なくなるし、演算も単純になるので回路化が簡単になる。

- [ザイリンクス　デバイスでの INT8 に最適化した深層学習の実装](https://japan.xilinx.com/support/documentation/white_papers/j_wp486-deep-learning-int8.pdf)


- [DeePhi Deep Learning Platforms: Powered by Xilinx](https://www.xilinx.com/video/corporate/deephi-deep-learning-platforms.html)

- Youtube [ DeePhi Deep Learning Platforms: Powered by Xilinx](https://www.youtube.com/watch?v=y9Cvl7-e74U)


線形代数の[BLAS](https://www.xilinx.com/applications/megatrends/machine-learning.html) ライブラリが提供されており
標準的なライブラリで書かれたアルゴリズムを利用しやすくなっている。
この場合でも、16bit, 8bit のinteger に最適化してある。

- [Machine Learning Inference Solutions from Edge to Cloud](https://www.xilinx.com/applications/megatrends/machine-learning.html)
上記サイトから
Edge Networks

GoogLeNet
SSD
FCN-AlexNet
AlexNet
VGG

の回路を生成するための情報が入手できるようだ。

- YouTube [Machine Learning on FPGAs: Neural Networks](https://www.youtube.com/watch?v=3iCifD8gZ0Q)

- アルテラの記事[CNN実装にFPGAが最適な理由](http://special.nikkeibp.co.jp/atcl/TEC/16/081900037/)
- インテルのニュースリリース[インテル、Microsoftの新しい高速ディープラーニング・プラットフォームの「リアルタイム AI」を実現](https://newsroom.intel.co.jp/news/intel-delivers-real-time-ai-microsofts-accelerated-deep-learning-platform/)
- インテルの記事 2017年：[ミッドレンジFPGAでディープラーニング、NVIDIA「Tesla M4」以上の効率を実現](http://monoist.atmarkit.co.jp/mn/articles/1704/07/news044.html)


----
次の方もFPGA関係で多数の記事を書かれています。
最近はCQ出版の雑誌の記事も書かれています。
[Hidemi's Idea Note](http://www.sweetcafe.jp/)
Github [Hidemi Ishihara](https://github.com/aquaxis/)