もくじ

V-scale というオープンソースマイコンを拾ってきて FPGA に乗せて遊んでます

_コンソール付きのシミュレータが欲しい 端末 XMODEM
乗算・除算器を改良した話 : github
FPU 拡張を追加したい話
_演算器のモデル記述 FADD FMUL FMADD FDIV FSQRT : github
_組み込み 転送 演算器

[PR]
# by tom01h | 2017-12-31 23:59 | PCとか | Trackback | Comments(0)

入力データ加工

入力データを
0~1の実数→0~255の整数→-255~255の奇数
と変更して試してみた結果、最後のが一番良い結果を見せました。
そもそも認識精度のばたつきが気になっていたのですが、精度そのものもちょっと上がったみたいです。こんなことで…
f0054075_18034763.png
次こそ4値化のアクセラレータ作る。
[PR]
# by tom01h | 2017-10-14 18:04 | Trackback | Comments(0)

4値化?

次はアクセラレータのテナリ化かな?とも思ったのですが、なんで4値じゃなくて3値なんだろうかと疑問を持っています。
まあ、3値だと掛け算しても3値のままだから便利なんだろうけど、ここでは掛け算の相手は2値だから4値でも良いよね。
で、試してみる前に、今まで気になっていた乱高下の原因を突き止めたいです。バイナリネットでは入力データの正規化は必要ないんじゃないかと思いついたので試してみました。
左がウェイトだけ2値化、右はアクティべーションも2値化。
f0054075_20365912.pngf0054075_21181478.png
まぁ多少はましになったのかな?では本番。左が3値化で右が4値化です。
f0054075_22371580.pngf0054075_23483700.png

テスト時の認識精度をまとめてみました。やっぱり4値を使った方が良いみたいですねぇ。人の真似しているだけじゃなくて、自分で考えないと駄目ですねぇ。
f0054075_23511832.png
ちなみにアクティベーション関数は下のような感じです。逆伝搬はどれも STE を使います。
f0054075_23583658.png

[PR]
# by tom01h | 2017-10-12 23:59 | Trackback | Comments(0)
こんな感じでパイプ化しました。これを32個並列実行します。
実際には 1st Stage 前半は一つ上の階層にあります。
毎サイクル 1024bit のパラメータを読むのは電力的に良くないかな?
f0054075_10553750.png
アクセラレータの使い方です。
畳み込み層1階層分の計算例です。左の入力から右の出力を得る手順を説明します。奥行きがチャンネル方向で、面倒なので32の場合で説明します。
f0054075_17570377.png
入力データ幅の32ビットは入力チャンネルサイズなので、入力の青色の1本分のデータを一度に処理できます。面倒なので以降は平面で書きます。
カーネルサイズが3×3で、poolingでX,Y方向をそれぞれ半分にするので、入力16ドットから出力1ドットが得られます。
最初にInitで初期化します。次に、1から9の順にAccを実行して最初の畳み込みを計算します。Poolを実行すると、ACCの値がPOOLにコピーされます。
次に10から18の順にAccを実行し、さらにPoolを実行します。最初の畳み込みよりもACCが大きければPOOLが更新されます。つぎはY方向にずらして以下同様に…
f0054075_17573504.png
4回繰り返して最大値が求まったらNorm、Activの順に実行し、1個の回路から1粒の出力を得ます。回路は32個並列に実装されているので、最初の絵の出力の青色1本分のデータを一度に得る事が出来ます。
1本分の出力が終わったら、X方向に2個ずらして次の16ドットを繰り返します。X方向が終わったらY方向に2ドットずらして繰り返します。
全結合層とかチャンネルサイズが64とかでも上手く行くとは思うのですが、大変そうなので説明は省きます。


[PR]
# by tom01h | 2017-10-09 20:33 | Trackback | Comments(0)
まだ非同期版ですが、とりあえず BNN のアクセラレータが動くようになりました。
全5層のうち第2,3,4層を Verilog 化して、C で書いた第1,5層があるテストベンチと組み合わせて BNN の推論が実行できます。全部 C で書いた推論実行環境と一致しているみたいです。こういうのって、Verilator が便利です。しかも速い。
次はちゃんとハードウェア化を考えて、同期メモリ化とパイプライン化したいと思います。

Github は ここ

[PR]
# by tom01h | 2017-10-08 21:49 | Trackback | Comments(0)
昨日書いたように、バイナリアクティベーション環境にはないはずのデータ ”0” をパディングに使っていたので修正しました。面倒なことに、学習からやり直す必要がありました。

そしてとりあえず第2層だけ Verilog で書いてみました。
C で作った環境を元に Verilator でテストベンチを作っているのですが、C99 で使える可変長配列?なるものが C++ で使えません。仕方がないので、入力と第1層を可変長配列を使わないように書き直して、第2層に繋げました。
とりあえず出力は C で作った環境と一致している模様。
まずは動作確認のために、組み合わせ回路になっています。メモリも非同期アクセスです。正直、大変なのはテストベンチだけです。
いずれは、ちゃんとパイプライン化して、制御回路もある程度は Verilog にしたいですが…

置き場はここ。Python環境はこっち

[PR]
# by tom01h | 2017-10-07 23:03 | Trackback | Comments(0)
データ型も2値化して結果が合わないと思ったら、パディングに0とかないはずの値を使っていた…
[PR]
# by tom01h | 2017-10-06 23:59 | Trackback | Comments(0)

推論アクセラレータ構想

まずはBNNアクセラレータの妄想をしています。
パラメータは内蔵メモリ内に保持して、与えられたアドレスから読みだします。
入力データは外から与えます。
入力 x とメモリから読みだすウェイト WEIGHT は 32bit 幅で、入力の32チャンネルを一度に処理します。

以下のレジスタセットを持ちます。
  • WEIGHT(MEAN)
  • ACC
  • POOL

以下のコマンドを持ちます。
  • Init()
  • Acc(addr, x)
  • Pool()
  • Norm(addr)
  • Activ()

畳み込み1階層分の計算は以下をストライド繰り返し実行します。
Init
4回(POOL)繰り返す
ーAcc*9 (畳み込み回数=カーネルサイズ^2)
ーPool
Norm
Activ

こんなので上手く行くかな?なんだかデバッグにとっても手間取りそうな予感 (-ー)

[PR]
# by tom01h | 2017-10-04 21:38 | Trackback | Comments(0)

TransBook T304UA

ASUS の TransBook T304UA 買いました。
どこから見ても Surface です。
f0054075_21143526.jpg
ただいま Windows Update 中…
とりあえず、Fall Creators Update 来るまでは Ubuntu 周りのインストールはしないで待つかな。
Python は Windows 上のを使ているのでインストール済です。
買ってすぐ2000円値下がりしたのは内緒。

[PR]
# by tom01h | 2017-10-03 21:18 | PCとか | Trackback | Comments(0)

推論実行環境

Python で学習したパラメータを使った推論環境を作ってみます。
まずは実装の簡単な BNN から。
この先、独自のビット型を実装したいのですが、とりあえず整数化します。後のことを考えて、入力データの並びをC,Y,XからY,X,Cに変更します。この時のためにチャンネル数は32の倍数にしておきました。
1層と出力層は普通はバイナリ化しないって話なので、2,3,4層だけ真面目に実装します。
1層のアクティベーションはバイナリ化しているので2層以降の入力はバイナリデータです。ウェイトもすでにバイナリ化済みなので、畳み込みは{-1,1}の積和になるので出力も整数。Poolingはそのまま最大値を選んで、つぎはNormalizationですが、平均はx.6の固定小数点を使うことにしました。その先がBinaryActivation(符号を取るだけ)なので、分散をそろえるのは無意味なので省略します。
とりあえず、今日はここまでかな。
BNNでぎりぎり70%超えている感じです。
置き場はここ。Python環境はこっち

[PR]
# by tom01h | 2017-10-02 22:37 | Trackback | Comments(0)