タグ:ニューラルネット ( 33 ) タグの人気記事

zero-riscy 環境では、ブートrom 16KB、命令ram 16KB、データram 128KB を積んでいます。 データram が大きいのは bnn の学習結果を乗せるためです。
そして、アクセラレータ回路は専用のパラメタメモリを 1024bit×568ワード 積んでいます。
他にも細かいのがあるかもしれませんが、全部合わせると 36Kbit のブロックRAMを 69 個使うみたいです。
ちなみに、アクセラレータ回路がなければ 40.5 個使います。
ところが、Arty に載っている Artix7-35 は、ブロックRAMを 50 個しか積んでいません。
アクセラレータを使うときは、データramを減らしても良いと思うのですが、それもいまいち面倒ですし…
そんなわけで、ブロックRAMを140個積んでいる Arty Z7 に移行しようと思います。
ブロックデザインはこんな感じ。
f0054075_23052011.png
さすがにアクセラレータを使うと結構速くなって、もしかすると UART の表示ネックになってるかな?って感じもします。



[PR]
by tom01h | 2018-04-09 00:00 | PCとか | Trackback | Comments(0)
FPGA 上の zero-riscy で SD カードを読めるようになったので、BNN の推論プログラムを動かして見たいと思います。
今までだって、シミュレーションと同じことなら FPGA 上でもできたと思うのですが、せっかく FPGA 上で動かすなら、1画像だけじゃなくて、もっとたくさんの画像で試したいですよね。でも今までは、大量データを FPGA で扱う方法がなかったのです。それが、 SD カードインタフェースの追加で、やっと可能になりました。
さらに、プログラムのロードもメモリ利用効率の悪い XMODEM を使った kozos ブートロードでは出来ないと思い、SD カードからのブートも追加しました。
f0054075_22341209.png
とりあえず、BNN の最適化までを済ませたソフトウェア推論で試してみました。
Core i5 と比べるとものすごく遅いですねぇ。
パラメタメモリを内蔵した BNN アクセラレータを積んだ zero-riscy は、今のサイズのデータメモリと共存するにはメモリ使用量が多すぎて Arty A7 には乗りません。Arty Z7 に引っ越すかな…

[PR]
by tom01h | 2018-04-07 23:27 | PCとか | Trackback | Comments(0)
パラメタメモリのアドレス生成に Imm を加算する機能を追加して、アセンブラレベルのソフト最適化をしてみました。
BNNのACC命令では1個のデータを1度に32個のフィルタにかけるけど、内積では一度に2個のフィルタしかかけないので、やっぱり第1層の時間が支配的です。
f0054075_19401834.png
あと、内積アクセラレータはパイプライン動作出来るはずなのですが、zero-riscy がマルチステップ命令でしか対応できないので、4サイクルのマルチステップ命令になります。9回の内積演算の後にBNNアクセラレータにデータを移して、次のフィルタの準備をしているのが下の波形。
f0054075_19413465.png
大きな変更になるけど、2段パイプ卒業を考えるときかな?

[PR]
by tom01h | 2018-03-01 21:36 | PCとか | Trackback | Comments(0)
17年8月号の焼き直しだそうな… 気づかずに買ってしまった。
まぁ、持っている訳じゃないから良いんだけど、もともと1000円が2600円って…
目次を見ただけだけど、内容は面白そうです。
f0054075_20264269.jpg


[PR]
by tom01h | 2018-02-28 21:26 | 本・映画など | Trackback | Comments(0)
8bit 内積命令を仮実装して、推論プログラムに組み込んで試してみました。
まだ、Imm を使ってパラメタメモリのアドレスを指定する機能も実装していないし、固定小数点の位置も選択できません。そして、演算精度不足なのか、バグなのか、正しい結果が出ているか良く分からない誤差が出ています。
でも、第1層までアクセラレータ対応にすると、結構見栄えの良い結果が出ました。
これでも、データやアドレスを生成するための時間が結構かかっているようなので、Imm を使えるようにしてたうえでソフトを最適化すると、さらに高速になると思います。
[本当はbinアクセラレータをip8アクセラレータよりも前に作ったのですが、絵的に美しくないので鉛筆なめた数値でグラフ化しています;-p]
f0054075_21573695.png


[PR]
by tom01h | 2018-02-27 22:44 | PCとか | Trackback | Comments(0)
せっかくの内積命令が BNN にしか使えないのはもったいないので、もう少し汎用性のある仕様を考えてみます。
普通なら R4-Type を使いたいところですが、R-Type に無理やり詰め込んでみたいと思います。
f0054075_20263836.png
また、BNN アクセラレータと同様に、内蔵メモリからフィルタ用データ(8bit×6セット)を読み出すのを前提とします。

A0 = 1st 8bit of rs1
A1 = 2nd 8bit of rs1
A2 = 3rd 8bit of rs1

Imm[8:0]={funct7[4:0],4'h0}
B00 = 1st 8bit of @(4th 8bit of rs1+Imm)
B01 = 2nd 8bit of @(4th 8bit of rs1+Imm)
B02 = 3rd 8bit of @(4th 8bit of rs1+Imm)
B10 = 4th 8bit of @(4th 8bit of rs1+Imm)
B11 = 5th 8bit of @(4th 8bit of rs1+Imm)
B12 = 6th 8bit of @(4th 8bit of rs1+Imm)

C0 = 1st 16bit of rs2
C1 = 2nd 16bit of rs2

ShiftMount = (funct7[6:5]==0) ? 0 : 2^(funct7[6:5]-1)
IP0 = ((A0*B00+A1*B01+A2*B02)>>(ShiftMount))+C0
IP1 = ((A0*B10+A1*B11+A2*B12)>>(ShiftMount))+C1
[追記 ここは飽和演算にするのが良い気がしてきた。]

rd = {IP0,IP1}

BNN コアには上の結果を2個のaccレジスタに読み込む命令を追加すれば、その先のプーリングにつながると思います。

[PR]
by tom01h | 2018-02-22 20:27 | PCとか | Trackback | Comments(0)
昨日も書いたように、8bit乗算結果3個を足しこむ内積演算器を使ったアクセラレータ化を考えています。
まずは回路遅延も回路規模も気にせずに正しく計算できることを確かめるバージョン。
内積演算器を32個も積み込んでいます。
演算精度不足なのか、どちらかのバグなのか?
昨日作ったcのプログラムの認識精度は71.8%でアクセラレータを使うと71.9%です。
間違う場所も結構違っている模様…

[PR]
by tom01h | 2018-02-20 23:00 | Trackback | Comments(0)
前回は第1層をアクセラレーション対象外にしたことで、推論アクセラレータの効果が面白くない結果に終わってしまいました。そんなわけで、第1層もアクセラレータに対応すべく、探りを入れてみます。
ハードウエア構成に関しては、あまり細かなところまでは考えていないのですが、32bit乗算器をちょっと改造することで、8bit乗算3個を足しこむ内積演算を2個並列実行できる予定です。
まぁ、zero-riscy は32bit乗算器を持っていない(16bit乗算器を4回使う)ので、まずはそこからの改造になるのですが、その前に第1層を8bit乗算としても精度を維持できるのかを探ってみました。
結果、認識精度は72.3%から71.8%へ低下しました。まあこの程度なら、このまま進めてみようかと思います。

[PR]
by tom01h | 2018-02-19 23:20 | Trackback | Comments(0)
zero-riscy に BNN 命令の追加が終わったので、推論プログラムに組み込んで試してみました。
正しい結果は出てきたけどあまり速くなってない。
そんな訳で、各層ごとの実行サイクルを調べてみた。
BNN 命令を使っているのは 2~4 層だけです。
ソフトの最適化の時点で、1層がここまで支配的になっているとは…
確かに BNN 命令を使っている部分はすごく速くなったけど、どうすんのこれ?
f0054075_21524829.png

[PR]
by tom01h | 2018-01-23 21:54 | PCとか | Trackback | Comments(0)
昨日に引き続き、zero-riscy に BNN を高速化する命令を追加します。
Pool 命令は funct3=2 で、rs2 からデータを入れます。
Norm 命令は funct3=3 で、rs1 からアドレスを入れます。
Active 命令は funct3=4 です。結果を rd に戻すのですが、そこら辺の制御が必要。DIV 命令でも参考にするか。

戻すデータとストールは zeroriscy_multdiv_fast.sv の multdiv_result_o と ready_o をたどっていった先にマージします。
他にも zeroriscy_id_stage.sv でマルチサイクル命令のステートマシン変更したり stall 信号を作る必要がありました。
あとは zeroriscy_decoder.sv で regfile_we を上げておくのかな。
とりあえず下の命令が正しい値を表示するので、次回からは推論プログラムを変形していこうと思います。
putx(bnn_activ());
Verilator はちまちま修正するには時間がかかりますねぇ。Model-Sim との効率よい二刀流を考えねば…
ひとまずは zero-riscy のコア だけ登録しました。

[PR]
by tom01h | 2018-01-22 21:38 | PCとか | Trackback | Comments(0)