7-01 SSDの並列化の限界を探る(続き)

●とことん並列化するとどうなるか

 CNNサイクル数の下限は「画素数×9サイクル」になりますが、その際に必要な乗算器の数はどうなるでしょうか。図7-03はこのブロック図の畳み込み
1層目のイメージです。このように入力チャネル数×出力チャネル数(3×64=192個)の乗算器があれば「画素数×9サイクル」で出力全チャネルの全画素が計算できます。

 このブロック図の畳み込み
2層目は入力が64チャネル、出力も64チャネルになります。したがって64×64=4096個もの乗算器が必要になります。安価なFPGAにはそんなに乗算器がないので、ここに示すように「ビットシフトによる乗算」を行いますが、それでも4096個となるとたいそうな回路規模になります。



  図7-03 最大限並列化だと乗算器は入力Ch×出力Ch個必要

●1&2層目を最大限並列化してみる

 試しに1,2層目を目いっぱい並列化してみます。1層目3×64=192個(これらは普通の乗算器)、2層目64×64=4096個(これらはビットシフト乗算器)でHDLを設計し、論理合成すると図7-04のようになりました。

 このように1&2層目だけでロジックを31%も消費しています。全部で28層ある事を考えると(ここ参照)、このFPGAには全然入り切りません(*3,4)

(*3)Terasic社Starter Platform for OpenVINO Toolkitに搭載のIntel社CycloneV GT 5CGTFD9D5F27C7Nを想定。
(*4)DSP Blocksを192個使用しているが、これは1層目の乗算器。2層目はビットシフト型なのでロジックに割り当てられる。


図7‐04 1層目&2層目だけでLogicを31%も使っている


●ある程度の「逐次化」が必要

 SSD物体認識を最大限並列化すると画像1枚(300x300画素)を900kサイクル程度で推論できます。しかし上記のようにFPGAに入りきらなくなるため、ある程度は「
逐次処理」させる必要があります。

 さしあたり「
64倍逐次化」として回路を減らします。すなわち同一のリソースを64回時分割で使用するのでサイクル数は64倍、900 x 64 = 約60Mサイクルになります。クロック100MHzで動かすと10ns x 60M = 約600msで画像1枚推論できることになります。


●将来的にはもっと並列化する

 もっと高速にしたい場合は「並列
化」と「FPGA容量」とのトレードオフになります。「並列化度合」を上げるためには現状は高価なFPGAが必要になりそうです。しかし将来的には安価で大容量なFPGAが出てくるでしょうからそれを待つ手もあります。


最初のページへ



目次へ戻る