[DL Hacks]FPGA入門

>100 Views

June 27, 18

スライド概要

2018/06/25
Deep Learning JP:
http://deeplearning.jp/hacks/

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

(ダウンロード不可)

関連スライド

各ページのテキスト
1.

FPGA入門 システム情報学専攻 修士2年 上野 洋典

2.

FPGAとは • Field Programmable Gate Array • 動作を書き換えられるデジタル回路の集合体 • 大雑把に言うとANDとかORとかが数万個~数百万個詰まってる • 並列計算が得意 • 自分だけの高速並列計算機が作れる • 機械学習と相性良し ◯ × CPU ソフト開発者たくさん。クロック最速(数GHz) 汎用品の限界。ノイマンボトルネック。ク ロックもう伸びない GPU 大量の数値演算なら最強。ソフト開発者が扱える。クロック速い(1GHz位) 汎用品の限界。電力食い過ぎ(200W) ASIC 自由に専用設計できる。低消費電力(uW~W) 修正できないので開発が大がかり。1~2年+ 数億円かかる。コストの8割が検証作業 FPGA 自由に専用設計できる。低消費電力(mW~W)。いつでも仕様変更・バグ修 正できる。1万円で試せる手軽さ ソフト開発者には難しい。クロック遅い(数 100MHz)。集積度低い https://qiita.com/kazunori279/items/a9e97a4463cab7dda8b9

3.

FPGAのインパクト • 2015年,IntelがFPGA大手のAlteraを2兆円で買収 • MicrosoftのBing検索がFPGAによって2倍高速化 • 杉山研佐藤先生の成果もFPGA

4.

今回使うボード • Xilinx Zynq-7000 ZC702 • ARM Cortex-A9 周波数: ~1GHz • 1GB DDR3 memory • 28mm programmable Logic • • • • Configurable Logic Block 36Kb RAM Digital signal processor (乗算器等) etc • ツール込みで900ドルくらい

5.

なぜ早い? CPU 数GHz y[0] = x[0] * x[0]; y[1] = x[1] * x[1]; FPGA * y[0] x[1] * y[1] * y[999] y[999] = x[999] * x[999]; ・・・ ・・・ x[0] x[999]

6.

開発手順 • システム設計 • 機能設計 • RTL設計 • 目的の回路を表すHDL(HW記述言語)を書く • 論理設計 • 物理設計 開発ソフトのCAD が自動で行う • FPGA上にマッピング

7.

HDLによる開発 • 考えること • • • • データパス スケジューリング 状態遷移 etc… 2値化CNNなDQNをFPGAで動かしてみた 中原啓貴 https://www.slideshare.net/HirokiNakahara1/tensor-flow-usergroup-2016

8.

高位合成 • C/C++等の高級言語からHDLを生 成する技術 • コンパイルには時間がかかる • 関数単位で行う • アプリケーションの内,一部はCPU で,一部はPLで実行 FPGA化 • FPGA化する関数は色々な制約あり • ダブルポインタ使えない • グローバル変数使えない • 引数の配列サイズの明示 など

9.

関数単位のFPGA化 CPUのみ 関数2のみFPGA化 CPUが処理する空間 逐次的 数GHz CPUが処理する空間 逐次的 数GHz 関数1 関数1 関数2 関数2へのアクセスコード 関数3 関数3 FPGAが処理する空間 高い並列性 数百MHz 関数2

10.

実装 • 右の書籍に沿って行う • 3層CNNをC言語で実装しFPGA化 • 犬猫の2クラス分類 • Train: 100枚, Test: 20枚 関数構成 main() ├ ReadBMP() ├ CNN() │ ├ CNNLayer() │ │ ├ Convolution() │ │ │ └ CalcConvolution() │ │ └ Pooling() │ │ └ MaxPooling() │ └Perceptron() ├ HiddenLearning() └ OutLearning() ソースコード https://github.com/aquaxis/CNNFPGA

11.

実行時間: CPUのみで実行 • CPU(Zynq上のARM)のみで実行した場合 • 40ms / dataの実行時間 • FPGA化によってこれを処理時間を 早くしたい 関数構成 main() ├ ReadBMP() ├ CNN() │ ├ CNNLayer() │ │ ├ Convolution() │ │ │ └ CalcConvolution() │ │ └ Pooling() │ │ └ MaxPooling() │ └Perceptron() ├ HiddenLearning() └ OutLearning()

12.

CalcConvolution()のみをFPGA化 • 「何も考えずに」Calc~()をFPGA化 • 2130ms / data • 50倍遅い! • メモリ転送がネックになっている • 周波数が遅い分より効いている 関数構成 FPGAによる 処理実行時間 メモリ filter[0] filter[1] filter[2] filter[3] ・・・ main() ├ ReadBMP() ├ CNN() │ ├ CNNLayer() │ │ ├ Convolution() │ │ │ └ CalcConvolution() │ │ └ Pooling() │ │ └ MaxPooling() │ └Perceptron() ├ HiddenLearning() └ OutLearning()

13.

CalcConvolution()のみをFPGA化 • 「少し考えて」Calc~()をFPGA化 • 243ms / data • さっきよりマシだがまだ遅い • 配列をまとめて転送 • #pragma SDS data access_pattern(filter:SEQUENTIAL) 関数構成 FPGAによる 処理実行時間 メモリ filter[0] filter[1] filter[2] filter[3] ・・・ main() ├ ReadBMP() ├ CNN() │ ├ CNNLayer() │ │ ├ Convolution() │ │ │ └ CalcConvolution() │ │ └ Pooling() │ │ └ MaxPooling() │ └Perceptron() ├ HiddenLearning() └ OutLearning()

14.

CNNLayer()をFPGA化 • CNNLayer()を「そのまま」FPGA化 • 171ms / data • 早くなったけど遅い… • 原則として下層の関数からFPGA化 • コンパイラはPLが足りるように試行錯誤 • いきなり上層の関数から行うとPL足りないかも 関数構成 main() ├ ReadBMP() ├ CNN() │ ├ CNNLayer() │ │ ├ Convolution() │ │ │ └ CalcConvolution() │ │ └ Pooling() │ │ └ MaxPooling() │ └Perceptron() ├ HiddenLearning() └ OutLearning()

15.

CNNLayer()をFPGA化 • CNNLayer()を「よく考えて」FPGA化 • 111ms / data • 「よく考えて」=「処理全体でのデータの流れを考えて」 • FPGA内の処理でメモリを使わないようにする 関数構成 Before After メモリ メモリ Convolution Pooling Convolution Pooling main() ├ ReadBMP() ├ CNN() │ ├ CNNLayer() │ │ ├ Convolution() │ │ │ └ CalcConvolution() │ │ └ Pooling() │ │ └ MaxPooling() │ └Perceptron() ├ HiddenLearning() └ OutLearning()

16.

最終的に • 処理をパイプライン化する ことでスループットを高める • #pragma HLS PIPELINE 処理1 処理2 処理3 処理4 • ループアンローリングを 使って並列性を高める • #pragma HLS UNROLE 処理1 処理2 処理1 処理1 処理2 処理2 処理3 処理4 処理3 処理4 • とかをやっても (この本の内容では) 93msが限界 処理3 処理4

17.

感想 • FPGA化すれば何でも早くなるというのは幻想 • 職人技が必要 • そもそもFPGAが不向きな計算もある • 結局高速化にはハードウェアの知識は最低限必要 • 高位合成のおかげでだいぶ軽減はされている • 別件でHDLで4bit CPU作ってみたけど楽しかった

18.

Pynqボード • Pythonで高位合成ができるボード! • ARMチップとPLあり • ARM上のLinuxでjupyter notebookも動く • LAN経由でアクセス可能 • 右上のコードだけでLチカできる! • 229ドル+送料 • アカデミック割で65ドル+送料

19.

まとめ • SW寄りの人も知っておく価値はあり • HDLは書けなくても大丈夫だと思う… • DLのソフトだけやっててもなあ…って人はぜひ • Pynqボード面白そう • 需要ありそうなら動かした感想をLTで

20.

参考文献 • そろそろプログラマーもFPGAを触ってみよう! • https://qiita.com/kazunori279/items/a9e97a4463cab7dda8b9 • 2値化CNNなDQNをFPGAで動かしてみた • https://www.slideshare.net/HirokiNakahara1/tensor-flowusergroup-2016 • ソフトウェア技術者から見たFPGAの魅力と可能性 • https://www.slideshare.net/MITSUDA_Kenichiro/fpga2018 • ソフトウェア技術者のためのFPGA入門 石原ひでみ • https://nextpublishing.jp/book/9219.html