第2回AIエッジコンテストからFPGA実装を考えてみる
概要
現在、SIGNATEより「第2回AIエッジコンテスト(実装コンテスト①)FPGAを使った自動車走行画像認識」が開催されています。
本コンテストの詳しい概要については、EDA-Expressさんのほうで記事になってますので
詳しくはこちらのほうを参照されるのが良いかと思います。
さて、実は本コンテストの「評価方法」にこんな一文があります。
※本ブログの執筆時点(12/17 7:30)の話
※オリジナルのTiny Yoloのネットワークに基づく精度基準は、12月初旬までに情報提供(暫定精度値)し、最終必要精度は年内に確定予定。
ですが、まだ暫定精度値が出てきておりません。
っということで、運営側がどうなっているのか想像ながらFPGA実装について考えていきたいと思います。
コンテスト内容の話
ガッと要約すると、アルゴリズムを開発しハードウェアに実装する。
アルゴリズム開発
1936 x 1216 の車両前方カメラ画像から特定の物体を検出する。(Object Detection)アルゴリズム実装
Avnet社Ultra96-V2(Zynq UltraScale+ MPSoC ZU3EG A484)FPGAボードに実装評価基準
精度、処理性能(fps)、エリア(回路規模) の3点
つまり、精度を確保しながら、処理性能をだし、エリアを小さく実装したものが勝ちというコンテストです。
本題 - FPGA実装の話へ
アルゴリズム開発
本コンテストは 第2回の開催となってます。
つまり、第1回が開催されています。
第1回は同じデータセット?で「オブジェクト検出」と「セグメンテーション」の各アルゴリズムを競うコンテストでした。
すでに、コンテストは終わっており入賞者レポートが掲載されてます。
つまり、このアルゴリズムをFPGAに実装すれば 精度は十分!っていうことです。
公開されているため、少し見ていきたいと思います。
Faster-RCNN で、backboneモデルは ResNeXt101+FPN(Feature Pryamid Networks) です。
多少違うところもありますが、話をしたい部分ではないので省略します。
こちらの図ですが、ILSVRCの歴史とともにCNNレイヤの層が深くなっていっていることがわかるかと思います。
層が深くなることで、パラメータ数や演算コストが増えていきます。
http://cs231n.stanford.edu/slides/2019/cs231n_2019_lecture09.pdf より
また、こちらの図は横軸が演算コスト、縦軸が ImageNetのTop-1の認識率になります。
円グラフはパラメータ数になります。
理想は 認識率が高く 演算コストが低く パラメータ数が小さいものになるかと思います。
Benchmark Analysis of Representative Deep Neural Network Architecturesより
モデルとパラメータ数を少しピックアップすると以下になります。
models | params |
---|---|
AlexNet | 61MB |
VGG19 | 143MB |
GoogLeNet | 13MB |
Resnext50 | 25MB |
MobileNet-v2 | 3.5MB |
resnext101_32x8d | 339MB |
モデル名にもなってますが、モバイル用途で提案されている MobileNetのパラメータが小さいことが分かると思います。
さて、今回のコンテストの基準値になる YOLO(You Only Look Once)についても少し。
上のサイトはYOLO-v3のCOCOデータセットの結果が記載されてます。
一部だけ抜粋すると、こんな感じです。
models | mAP | FLOPS | FPS | コメント |
---|---|---|---|---|
FPN FRCN | 59.1 | - | 6 | 第一回のベースに近い |
YOLOv3-608 | 57.9 | 140.69Bn | 20 | |
YOLOv3-tiny | 33.1 | 5.56Bn | 220 |
更に今回のコンテストを想定した場合だと旧バージョンである「YOLO v2」のVOCデータセットの比較が想定しやすいと思います。
抜粋
models | mAP | FLOPS | FPS | コメント |
---|---|---|---|---|
SSD300 | 63.4 | 40.19Bn | 45 | |
YOLOv2 | 76.8 | 34.90Bn | 67 | |
Tiny YOLO | 57.1 | 6.97Bn | 207 |
というような感じで、整理してみると第一回のアルゴリズムでは処理性能やエリア(回路規模)といった点で
不利かもしれないというのがなんとなく感じることが出来たのではないでしょうか。
更に、上記の測定表は VOCやCOCO, ImageNetといった世界中の人がこれまでやってきたデータでの結果です。
コンテスト用のデータで、VOCやCOCOで結果が出たアルゴリズムが上手くいくはやってみないとわかりません。
特に、画像サイズ(1936 x 1216)デカイし、夜の画像とかかなりヘンタイだと思います。
基準値がまだ出てこないのってもしかしてアルゴリズム開発から・・・みたいな想像もしてみたり。
アルゴリズム実装(本題の本題)
序章が長すぎました。本題のアルゴリズム実装(FPGA実装)についてです。
っということなんですが、こちらに素晴らしい資料がありリンク先を読んでいただくほうが良いと思います(笑)
概要は、リンク先の資料に頼るとして今回のコンテストの対象となるFPGA「ZU3EG」を見ていきたいと思います。
知っている人には当たり前の話ですが、「CPU(SoC)+FPGA」が一体となっているデバイスです。
CPU(ARM Cortex-A53)を PS, FPGA部分を PLという分類分けになってます。
アルゴリズムの実装方法は自由なので、CPUだけに処理をやらせても問題ないのですが、
それであればRasPi 4で実装して確認しても面白いかもしれません。たぶん処理性能(FPS)はそんなに出ないでしょう。
DNN推論を考えた場合、個人的に押さえておくポイントをあげるとすれば
※用途によって異なるため、あくまでの目安
- Memory(Total Block RAM)
- DSP Slices
では、ちょっと実装を考えてみましょう。
一番処理性能が良いのは、DNNモデルをFPGAに実装することでしょう。
しかし、残念ながらそれを実現するには非常に設計工数がかかり専門的な知識と技術が必要になります。
(本コンテストの試験内容およびFPGAデバイスの規模から99%無理だと思いますが)
そのため、ハードウェアアーキテクチャとしては WP514資料内での呼び名「DPUアーキテクチャ」になるかと思います。
また、DNNでは Convolution(畳み込み演算) が支配的とされています。
そのためConvolutionをどうやって高速化するかが肝になります。
参考になるか分かりませんが、ハードウェア実装のイメージを掴んでもらえればなと。
例えば、Convolution 2D(3x3kernel(filter))を想定した場合には、
最低垂直方向2line分のメモリを使います。(1チャネル当たり)
5x5の場合には最低4line分ですね。
+-------------+ | | | - - | 1line目保持用 +-------------+ | | | - - | 2line目保持用 +-------------+ ->
なので、416x416の入力画像を考えた場合
416(pix) x 2(line) x 3(RGB) x 4(byte) = 9,984[byte]
と、約10KBのメモリが必要になります。
なので、チャネル数やカーネルサイズにより並列数をメモリ容量を考える必要があります。
次に積和演算についてです。
積和演算は上で記載したDSP Sliceに割り当てることで低遅延で処理可能です。
DSP Sliceのファンクション的なものは上図の通りです。
真ん中に乗算器があり、前後に+/-演算器があります。
気づく人は気づくと思いますが、27 x 18(bit)
の乗算器です。うまくやりましょう。
ZU3EGはDSP Slices:360
なので、積和演算の並列数の限界もここまでとなってしまいます。
ついこないだ発表された最新のADAS/自動運転に対応するZynq UltraScale+ MPSoC製品 の
「XAZU7EV:1,728
, XAZU11EG:2,928
」と比べると如何に小さいか分かりますね!
設計手法的には、「Vitis-AI」だったり、「Vivado HLS」を使用して設計するのかもしれませんが、いざ設計してみると、デバイスに入らない!!!となってしまう可能性も十分にありえるのではないかと思います。
まとめ
概要レベルのざっくりした内容でしたが、まだコンテスト基準値が公表されてない裏側を想像しつつ、コンテストの難しさやFPGA実装について記載させていただきました。
(そういえば、Ultra96-V2持ってないので欲しい)
本記事は「FPGA Advent Calendar 2019 - 19日目」になります。
空きがいっぱいあるので、良かったら書いてください。