●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に実装します。おそらく回路規模を減らす技術、遅延を減らす技術が必要になると思われます。
最初のページへ
目次へ戻る