●judge.vhdのAINにAffine2層目の出力が入る

 図10-14のAIN信号は判定回路の入力(Affine2層目の出力)です。7+1番目が1番大きいので判定結果は’7’になります。これはMNIST画像の最初の1枚です。


 図10-14 Pythonの結果(図10-17の1行目)と比較してみよう


 図10-15のAIN信号では2+1番目が1番大きいので判定結果は’2’になります。これはMNIST画像の2枚目です。


  図10-15 Pythonの結果(図10-17の2行目)と比較してみよう


 図10-16のAIN信号では9+1番目が1番大きいので判定結果は’9’になります。これはMNIST画像の8枚目です。


  図10-16 Pythonの結果(図10-17の8行目)と比較してみよう


●PythonでもEXCELでもVHDLでも同じ結果になる

 図10-17は
PythonにおけるAffine2層目の出力です。1行目はMNIST1枚目、2行目はMNIST2枚目、8行目はMNIST8枚目です。上のシミュレーションと比べてすべての値がピタリ一致していることを確認します。


 畳み込みニューラルネットワークは複雑に見えますが、所詮は整数の掛け算と足し算です。PythonをVHDLにしたところで結果が変わる理由はありません。図10-17の一番下には正解率がありますが、VHDLにおいてもこの数字(98.28%)になるはずです。


  図10-17 Anaconda jupyter labでPythonを走らせた結果


●スループット100usの効果

 図10-13を見ると8枚の画像の推論結果が1400usで得られています。1画像当たり175usかかることになりますが、画像の枚数が増えると表10-02のようにレイテンシの影響が少なくなり、1画像あたりの演算時間はほぼ100usになります

  表10-02 画像の枚数が多いとレイテンシの影響が少なくなる
画像の枚数 合計推論時間 1枚当たり
8枚 1.4ms 175us
80枚 8.6ms 107.5us
800枚 80.6ms 100.75us
8000枚 800.6ms 100.075us

●FPGAに実装するためのポイント

 第2部では畳み込みニューラルネットワークをVHDL化しました。そのためにキーとなる技術を以下にまとめます。

@係数や変数を整数化する。
A係数を4種類にして乗算をビットシフトで達成する。
 これらはFPGAに実装するために必要な技術です。

B並列化する
Cパイプライン化する
 これらは演算を高速化するための技術です。

DEXCEL+VBAでVHDLを自動生成する。
 これはVHDL化作業を効率化するための技術です。


●10kサイクル毎にMNIST画像の推論が出来る!

 畳み込み1〜6層目、Affine1〜2層目を表10-03にまとめます。パイプライン化する際は一番遅い6層目でスループットが決まります。同表でそれは98usですが、少し余裕を持たせて
100us(10kサイクル@クロック周期10ns)で動作させました。

    表10-03 各層にかかる時間(MNIST画像1枚あたり、1サイクル = 10ns)
畳込1層目 畳込2層目 畳込3層目 畳込4層目 畳込5層目 畳込6層目 Affine1層目 Affine2層目
サイクル数 7.1k 7.1k 7.2k 9.3k 9.7k 9.8k 8.2k 0.8k
時間 71us 71us 72us 93us 97us 98us 82us 8us
乗算器(個) 16 256(ビットシフト型) 128(ビットシフト型) 256(ビットシフト型) 128(ビットシフト型) 256(ビットシフト型) 7 1

 次章からはいよいよFPGAに実装します。おそらく回路規模を減らす技術、遅延を減らす技術が必要になると思われます。


最初のページへ


目次へ戻る