FC2カウンター FPGAの部屋 ニューラルネットワークの推論のハードウェア化1(概要編)

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

ニューラルネットワークの推論のハードウェア化1(概要編)

ニューラルネットワークの推論のハードウェア化をやってみようと思う。
original_NN_1_170530.png

以前、ニューラルネットワークのハードウェア化をやっていたが、それは、2層のニューラルネットワークをその形のままFPGAにハードウェア化していた。ニューラルネットワークを画像フィルタとして使用していたが、パイプライン化されたニューラルネットワークから 1 クロックごとに出力することができていた。そして、積和演算をDSPで行ったのでは、DSPが足りなかった。そこで、ニューラルネットワークの形のまま実装するということは、重みは固定で良いので、乗算をシフト+加算の形に変換した。そして、シフト+加算の形でVHDLを書くのはとっても大変なので、重みの表からシフト+加算の形のVHDL を出力するRuby スクリプトを作成した。これによって、FPGAの使用リソースを削減することができた。また、DSPは使わずにロジックだけで実装することができた。

この方式の欠点は、演算器が片方の定数入力に対して最適化されていて重みが変更できないことだ。ディープなニューラルネットワークで、FPGAに入らない場合はどうするか?ということになる。この場合はFPGAのコンフィギャラブルという最大の利点を生かすソリューションを使うと良い。つまりパーシャルリコンフィギュレーションを使うのだ。パーシャルリコンフィギュレーションを使用すると、層単位または複数層でも良いが、適当な区切りで回路を入れ替えて実行することができる。
例えば、10層のニューラルネットワークだったら、2層ごとにパーシャルリコンフィギュレーションで回路を入れ替えながら、5回やれば良い。各層の重みは定数で良いので、DSPを使用する必要もなく、回路も削減できる。パーシャルリコンフィギュレーションを使えるのはFPGAだけの特権だと思う。ただし、パーシャルリコンフィギュレーションの速度が問題になると思うが、これから検証していこうと思う。

これから、オライリーの本「ゼロから作る Deep Learning」の「5章 誤差逆伝播法」のPython コードを元に、量子化をソフトウェアで行って、結果を確認しながらニューラルネットワークのハードウェア化を行っていきたいと思う。なお、「ゼロから作る Deep Learning」のPython コードはオライリー・ジャパンのoreilly-japan/deep-learning-from-scratch にあって、MITライセンスなので改変したものを公表することができる。
重みやバイアスの統計データを「「ゼロから作る Deep Learning」をやってみる4(4章 ニューラルネットワークの学習)」の「W1, W2, b1, b2の統計データ」に書いておいたが、適当な値に分布しているので、使いやすそうだった。
  1. 2017年05月31日 04:38 |
  2. DNN
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
http://marsee101.blog19.fc2.com/tb.php/3812-3d8fb91e
この記事にトラックバックする(FC2ブログユーザー)