深層学習のFPGA移植の3通りのアプローチ

深層学習をFPGAに移植しようとするアプローチは大きく言って３つある。
その３つのアプローチについての紹介をする。

## １：深層学習の行列演算の一部に対するアクセラレータを作成する。
　メインはC/C++のプログラムであり、その行列演算の一部をハードウェア実装を利用するC/C++のコードとして実現する。
　このアプローチでは、プログラムをビルドする必要があり、ネットワーク構造を変えた時には、ソースコードの違いがあるため、ビルドし直さなければならない可能性が高い。



### 長所：

- 浮動小数点演算として実装している範囲だと、学習のやり直しが不要である。
    - そのため、推論部分の最適化だけに集中できる。

### 短所：

- 浮動小数点演算に対するアクセラレータである場合、浮動小数点演算の計算コストは高い。
- メイン計算部分と行列演算の一部を行うアクセラレータ間とでデータ転送を行う必要があり、その部分を含めたパフォーマンスの向上が必要になる。

## 情報源の１例：
https://interface.cqpub.co.jp/magazine/201901/

## ２：深層学習の学習済みの重みファイルを他の環境に移植するツールの移植先の一つとしてFPGAの実装がある。
FPGAの実装部分は汎用ツールとして実装してあり、利用する重みファイルを変えることで実現するCNNの種類を変える。
浮動小数点モデルで訓練されたpre-trained モデルをint8などのモデルに変換することは、いくつかのベンダが自社のプラットフォーム上に提供している。それによって、各種model zoo を利用できる。顔照合の目的で、顔を検出して顔のランドマークを求めて、顔の属性推定をする。そういった枠組みの機械学習は、限られたリソースではつくり上げることができない。
だからこそ、既存のpre-trained モデルを利用できることは、重要な要素になっていて、浮動小数点モデルを計算量の少ないモデルに変換して、各プラットフォームで実行できることは重要だ。


### 長所
ツールがそのように作ってあるので、学習済みの重みファイルを元に移植先で実行可能になる。
FPGAで動作させるためのFPGA部分の設定は既にFPGA用にコンパイルしてあってbitstream をFPGAにダウンロードすればよいだけになっている場合もある。

少ない手数で、FPGAへの移植ができる場合がある（そのツールが提供している範囲で）。

CPUでの処理からFPGAに処理を外だしできるので、ARM系のCPUの場合利点がある。

###　短所

再学習なしに、浮動小数点での重みファイルをFPGA用に変えることができるということは、再学習をすれば、bit幅が減らせる可能性をあきらめるということでもある。そのために、再学習をして重みのbit幅を減らして実装するのに比べて計算量が多くなってしまう。

ただし、再学習できるほどのデータセットとbit幅が少ない学習を実行できる環境を持つことは極めて困難なので、この短所が、短所になりうる人は少ないだろう。

### 情報源の１例

#### OpenVino

FP11(Sign、指数5ビット、仮数5ビット) という選択肢がOpenVinoに登場してきている。
> FP11 はINT8/9 よりもメリットがある•再トレーニング不要、より良いパフォーマンス、精度の損失が少ない
https://eventmarketing.blob.core.windows.net/mstechsummit2018-after/DA22_PDF_TS18.pdf

[OpenVINO™ Toolkit / FPGA Plugin ](https://docs.openvinotoolkit.org/2019_R3/_docs_IE_DG_supported_plugins_FPGA.html)



https://www.intel.co.jp/content/www/jp/ja/internet-of-things/solution-briefs/openvino-toolkit-product-brief.html

https://software.intel.com/en-us/openvino-toolkit

https://japan.xilinx.com/applications/megatrends/machine-learning.html

#### Vitis (Xilinx) 
https://japan.xilinx.com/products/design-tools/ai-inference.html

- AI オプティマイザー
- AI クオンタイザー
- AI コンパイラ


#### NVidia

[Optimize Model, Build Engine for Inference](https://devblogs.nvidia.com/object-detection-gpus-10-minutes/)
でも次のようにしてINT8にまでモデルを縮小できるにしている。

    Path to UFF file for our model
    Precision for inference engine (FP32, FP16, or INT8)
    Calibration dataset (only needed if you’re running in INT8)
    Batch size used during inference




## 3:量子化CNN、２値化CNN

### 長所：
計算量が少なくできる。任意のbit幅を実現しやすいFPGAならではの利用ができる。そのため、消費電力や回路規模を削減しやすい

### 短所：
既存の学習済みの結果が少ない。浮動小数点での学習結果をそのまま転用することはほぼできない。そのため、学習を実行する必要がある。

### 情報源の１例:

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

Slideshare [２値化CNN on FPGAでGPUとガチンコバトル（公開版） ](https://www.slideshare.net/HirokiNakahara1/cnn-on-fpgagpu)

Slideshare [2値ディープニューラルネットワークと組込み機器への応用: 開発中のツール紹介 ](https://www.slideshare.net/HirokiNakahara1/2-76413103)

Slideshare [ディープラーニングの２値化（Binarized Neural Network） ](https://www.slideshare.net/hideoterada5/binarized-neural-network-83617446)

[ニューラルネットワークの量子化についての最近の研究の進展と、その重要性](https://developer.smartnews.com/blog/2017/03/neural-network-quantization/)


#### ２値化CNNの１例
例題：MNISTのデータの学習
https://github.com/hillbig/binary_net

#### Xilinxでの例
https://github.com/Xilinx/BNN-PYNQ
以下のjupyter notebook を読むと、どのような分類・検出ができているのかがわかる。
https://github.com/Xilinx/BNN-PYNQ/tree/master/notebooks
https://github.com/Xilinx/BNN-PYNQ/blob/master/notebooks/CNV-BNN_Road-Signs.ipynb

---
## 未分類

## 深層学習の推論を実行する回路のハードウェア記述を生成するツール

### NNgen
- [DNNのモデル特化ハードウェアを生成するオープンソースコンパイラNNgenのデモ]
(https://www.slideshare.net/shtaxxx/2019-1112-fpgax-nngen)

- https://github.com/NNgen/nngen

- [コニカミノルタ、東京大学・高前田准教授と共同で画像IoT、AIを実現する
- ディープラーニング向けハードウェアコンパイラを開発、オープンソース化](
https://www.konicaminolta.com/jp-ja/newsroom/2019/1121-02-01.html)

- FPGAエクストリーム・コンピューティング [DNNのモデル特化ハードウェアを生成するオープンソースコンパイラNNgenのデモ](https://qiita.com/code_440/items/af779a8f88af0cb00f76)

- Youtube [コニカミノルタの「画像IoT/AI」とFPGA用OSSコンパイラ「NNgen」の最新情報 2020-8-28 A-6](https://www.youtube.com/watch?v=8UFwcnFwtRc)

---
https://github.com/IBM/AccDNN

### GUINESS

https://github.com/HirokiNakahara/GUINNESS

https://www.avnet.com/wps/portal/japan/products/c/fpga-solutions/xilinx/deep-learning/

https://synkom.co.jp/edge-ai/

https://www.silver-i.co.jp/GUINNESS_20190208.pdf

https://www.jstage.jst.go.jp/article/transinf/E102.D/5/E102.D_2018RCP0002/_article/-char/en

---
[Ultra96ボードでYOLOを高速化](https://www.slideshare.net/HiroyukiOkuhata/ultra96yolo)


---
CNNのモデル削減に関する記事

- [Chainer向けChannel Pruningフレームワークを作った話]
(https://qiita.com/tkat0/items/7dbe337e209856720e58)

- [Chainerモデルのさらなる高速化、デプロイの簡便化、可搬性の向上に向けた実験的な取り組みについて]
(https://research.preferred.jp/2019/01/chainer%e3%83%a2%e3%83%87%e3%83%ab%e3%81%ae%e3%81%95%e3%82%89%e3%81%aa%e3%82%8b%e9%ab%98%e9%80%9f%e5%8c%96%e3%80%81%e3%83%87%e3%83%97%e3%83%ad%e3%82%a4%e3%81%ae%e7%b0%a1%e4%be%bf%e5%8c%96%e3%80%81/)

- [ICLR2018におけるモデル軽量化（ICLR2018読み会@ PFN） ](https://www.slideshare.net/tkatojp/iclr2018iclr2018pfn)

- [エッジデバイス推論向けのTensorFlow最適化を掘り下げてみる #GoogleMLSummit](https://tech-blog.optim.co.jp/entry/2019/07/12/173000)

---

[第4回AIエッジコンテスト（実装コンテスト②） FPGAを使った自動車走行画像認識](
https://signate.jp/competitions/285)が開催されている。
このようなコンテストでどのように実装しているのかを調査したい。

----
追記 2023.10
githubなどにあるソースは、最後に改変してあるのがいつなのか、
いまメンテナンスされているのかどうかを確認しながら、方式の選択を考えよう。