FPGA入門
システム情報学専攻 修士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
FPGAのインパクト
• 2015年,IntelがFPGA大手のAlteraを2兆円で買収
• MicrosoftのBing検索がFPGAによって2倍高速化
• 杉山研佐藤先生の成果もFPGA
今回使うボード
• Xilinx Zynq-7000 ZC702
• ARM Cortex-A9 周波数: ~1GHz
• 1GB DDR3 memory
• 28mm programmable Logic
• Configurable Logic Block
• 36Kb RAM
• Digital signal processor (乗算器等)
• etc
• ツール込みで900ドルくらい
なぜ早い?
CPU
数GHz
FPGA
y[0] = x[0] * x[0];
y[1] = x[1] * x[1];
・・・
y[999] = x[999] * x[999];
x[0] * y[0]
x[1] * y[1]
x[999] * y[999]
・・・
開発手順
• システム設計
• 機能設計
• RTL設計
• 目的の回路を表すHDL(HW記述言語)を書く
• 論理設計
• 物理設計
• FPGA上にマッピング
開発ソフトのCAD
が自動で行う
HDLによる開発
• 考えること
• データパス
• スケジューリング
• 状態遷移
• etc…
2値化CNNなDQNをFPGAで動かしてみた 中原啓貴
https://www.slideshare.net/HirokiNakahara1/tensor-flow-usergroup-2016
高位合成
• C/C++等の高級言語からHDLを生
成する技術
• コンパイルには時間がかかる
• 関数単位で行う
• アプリケーションの内,一部はCPU
で,一部はPLで実行
• FPGA化する関数は色々な制約あり
• ダブルポインタ使えない
• グローバル変数使えない
• 引数の配列サイズの明示 など
FPGA化
関数単位のFPGA化
CPUのみ 関数2のみFPGA化
関数1
関数2
関数3
CPUが処理する空間
逐次的
数GHz
関数1
関数2へのアクセスコード
関数3
CPUが処理する空間
逐次的
数GHz
関数2
FPGAが処理する空間
高い並列性
数百MHz
実装
• 右の書籍に沿って行う
• 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
実行時間: CPUのみで実行
• CPU(Zynq上のARM)のみで実行した場合
• 40ms / dataの実行時間
• FPGA化によってこれを処理時間を
早くしたい 関数構成
main()
├ ReadBMP()
├ CNN()
│ ├ CNNLayer()
│ │ ├ Convolution()
│ │ │ └ CalcConvolution()
│ │ └ Pooling()
│ │ └ MaxPooling()
│ └Perceptron()
├ HiddenLearning()
└ OutLearning()
CalcConvolution()のみをFPGA化
• 「何も考えずに」Calc~()をFPGA化
• 2130ms / data
• 50倍遅い!
• メモリ転送がネックになっている
• 周波数が遅い分より効いている
関数構成
main()
├ ReadBMP()
├ CNN()
│ ├ CNNLayer()
│ │ ├ Convolution()
│ │ │ └ CalcConvolution()
│ │ └ Pooling()
│ │ └ MaxPooling()
│ └Perceptron()
├ HiddenLearning()
└ OutLearning()
filter[0]
filter[1]
filter[2]
filter[3]・・・
FPGAによる
処理実行時間
メモリ
CalcConvolution()のみをFPGA化
• 「少し考えて」Calc~()をFPGA化
• 243ms / data
• さっきよりマシだがまだ遅い
• 配列をまとめて転送
• #pragma SDS data access_pattern(filter:SEQUENTIAL)
関数構成
main()
├ ReadBMP()
├ CNN()
│ ├ CNNLayer()
│ │ ├ Convolution()
│ │ │ └ CalcConvolution()
│ │ └ Pooling()
│ │ └ MaxPooling()
│ └Perceptron()
├ HiddenLearning()
└ OutLearning()
filter[0]
filter[1]
filter[2]
filter[3]・・・
FPGAによる
処理実行時間
メモリ
CNNLayer()をFPGA化
• CNNLayer()を「そのまま」FPGA化
• 171ms / data
• 早くなったけど遅い…
• 原則として下層の関数からFPGA化
• コンパイラはPLが足りるように試行錯誤
• いきなり上層の関数から行うとPL足りないかも 関数構成
main()
├ ReadBMP()
├ CNN()
│ ├ CNNLayer()
│ │ ├ Convolution()
│ │ │ └ CalcConvolution()
│ │ └ Pooling()
│ │ └ MaxPooling()
│ └Perceptron()
├ HiddenLearning()
└ OutLearning()
CNNLayer()をFPGA化
• CNNLayer()を「よく考えて」FPGA化
• 111ms / data
• 「よく考えて」=「処理全体でのデータの流れを考えて」
• FPGA内の処理でメモリを使わないようにする
関数構成
main()
├ ReadBMP()
├ CNN()
│ ├ CNNLayer()
│ │ ├ Convolution()
│ │ │ └ CalcConvolution()
│ │ └ Pooling()
│ │ └ MaxPooling()
│ └Perceptron()
├ HiddenLearning()
└ OutLearning()
メモリ
Convolution Pooling
Before
メモリ
Convolution Pooling
After
最終的に
• とかをやっても (この本の内容では) 93msが限界
• ループアンローリングを
使って並列性を高める
• #pragma HLS UNROLE
処理1 処理2 処理3 処理4
処理1
処理2
処理3
処理4
処理1 処理2 処理3 処理4
処理1
処理2
処理3
処理4
• 処理をパイプライン化する
ことでスループットを高める
• #pragma HLS PIPELINE
感想
• FPGA化すれば何でも早くなるというのは幻想
• 職人技が必要
• そもそもFPGAが不向きな計算もある
• 結局高速化にはハードウェアの知識は最低限必要
• 高位合成のおかげでだいぶ軽減はされている
• 別件でHDLで4bit CPU作ってみたけど楽しかった
Pynqボード
• Pythonで高位合成ができるボード!
• ARMチップとPLあり
• ARM上のLinuxでjupyter notebookも動く
• LAN経由でアクセス可能
• 右上のコードだけでLチカできる!
• 229ドル+送料
• アカデミック割で65ドル+送料
まとめ
• SW寄りの人も知っておく価値はあり
• HDLは書けなくても大丈夫だと思う…
• DLのソフトだけやっててもなあ…って人はぜひ
• Pynqボード面白そう
• 需要ありそうなら動かした感想をLTで
参考文献
• そろそろプログラマーもFPGAを触ってみよう!
• https://qiita.com/kazunori279/items/a9e97a4463cab7dda8b9
• 2値化CNNなDQNをFPGAで動かしてみた
• https://www.slideshare.net/HirokiNakahara1/tensor-flow-
usergroup-2016
• ソフトウェア技術者から見たFPGAの魅力と可能性
• https://www.slideshare.net/MITSUDA_Kenichiro/fpga2018
• ソフトウェア技術者のためのFPGA入門 石原ひでみ
• https://nextpublishing.jp/book/9219.html

[DL Hacks]FPGA入門