FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

プロセッサHiFive1で機械学習コードを動作させる(3. 推論コードの動作確認)

f:id:msyksphinz:20170821013230p:plain

RISC-V プロセッサHiFive1を使って、機械学習チュートリアルとも言えるMNISTのプログラムを動作させたい。 まずはMNISTの推論コード自身から、HiFive1に移植している。

当たり前と言えば当たり前だが、行列演算の途中のデータとか、全部L1データキャッシュでやりくりする訳だから、あまり大きなプログラムをロードすることはできない。 これまで大きなプログラムを動かして途中でクラッシュしてボードが動かなくなっていたのは、これではないかと予想。 そこで、これまでに関数内で確保していた行列演算の途中の変数を、仮にでもいいのでグローバル変数として確保し、あらかじめ使用するすべての変数を確保しておいた。

github.com

diff --git a/software/mnist/train_twolayernet_fix16.c b/software/mnist/train_twolayernet_fix16.c
index d35e94f..0802eff 100644
--- a/software/mnist/train_twolayernet_fix16.c
+++ b/software/mnist/train_twolayernet_fix16.c
@@ -25,7 +25,7 @@
 #define ALPHA    (10)   // Coefficient of learning
 #define SEED     (65535)  // Seed of random
 #define MAXINPUTNO (60000)  // Max number of learning data
-#define BATCH_SIZE (100)
+#define BATCH_SIZE (10)
 #define LEARNING_RATE (0.1)
 #define WEIGHT_INIT (0.01)
 
@@ -286,6 +286,13 @@ int main ()
   return 0;
 }
 
+fix16_t af0 [BATCH_SIZE * HIDDENNO];
+fix16_t in_data[BATCH_SIZE][INPUTNO];
+fix16_t af1 [BATCH_SIZE * OUTPUTNO];
+fix16_t rel0[BATCH_SIZE * HIDDENNO];
+fix16_t rel1[BATCH_SIZE * OUTPUTNO];
+       
+
 void TestNetwork (const int input_size,
                                  const int output_size,
                                  const int hidden_size,

するとやはり、L1キャッシュには収まりきらずリンク時にエラーが発生する。とりあえず動作させるためにできることと言えば、バッチサイズを減らしてデータサイズを減らすことなので、バッチサイズを1まで減らすとリンクまで成功した。

一応クラッシュしないようになったが、まだデータを入力していないので、そこは修正していかないといけない。 そしてよく考えると各行列ステージで別々に変数を用意する必要もないわけで、もうちょっとデータサイズ減らせないかなあ。

/home/msyksphinz/work/freedom-e-sdk/work/build/riscv-gnu-toolchain/riscv64-unknown-elf/prefix/lib/gcc/riscv64-unknown-elf/7.1.1/../../../../riscv64-unknown-elf/bin/ld: mnist セクション `.bss' は領域 `ram' 内に入りません
/home/msyksphinz/work/freedom-e-sdk/work/build/riscv-gnu-toolchain/riscv64-unknown-elf/prefix/lib/gcc/riscv64-unknown-elf/7.1.1/../../../../riscv64-unknown-elf/bin/ld: section .stack VMA [0000000080003800,0000000080003fff] overlaps section .bss VMA [0000000080000a48,0000000080009817]
/home/msyksphinz/work/freedom-e-sdk/work/build/riscv-gnu-toolchain/riscv64-unknown-elf/prefix/lib/gcc/riscv64-unknown-elf/7.1.1/../../../../riscv64-unknown-elf/bin/ld: 領域 `ram' が 0 バイト溢れました
collect2: error: ld returned 1 exit status
/home/msyksphinz/work/freedom-e-sdk/bsp/env/common.mk:44: ターゲット 'mnist' のレシピで失敗しました
make[1]: *** [mnist] エラー 1
make[1]: ディレクトリ '/home/msyksphinz/work/freedom-e-sdk/software/mnist' から出ます
Makefile:199: ターゲット 'software' のレシピで失敗しました
make: *** [software] エラー 2

f:id:msyksphinz:20170824011043p:plain