

SpresenseとArduinoの開発環境で、nncで学習したファイルを`dnnrt.forward()`をする時の  
「nnbのファイルサイズの大きさ」についていくつか質問があります。

  1. 大きさは実行させるコア（メインなのか、サブなのか）に依存しますか？  
使えるメモリサイズ（タイル？）に依存しそうな気がしています。

  2. そのときの目安のようなものがありましたら教えてください。  
プログラムはとっても単純で、スタックやヒープなどはほとんど使わないものと仮定して頂いて結構です。

  3. ファイルが推論可能かどうか、事前にプログラム等でチェックする方法はないでしょうか？

どうぞよろしくお願いいたします。


CC BY-SA 4.0
2019-08-21T09:06:51.310
57517
2019-12-03T20:15:44.380
2019-08-21T11:20:44.443
3060
35541
question
spresense
spresenseで推論可能なSony NNC のサイズについて


自分もNNCを使い始めて、NNBファイルのサイズの問題にぶち当たりました。

コードを見る限り、

DNNRT.cpp

のなかので、

[code]

      size = nnbfile.size();
      _network = (nn_network_t *)malloc(size);
    
[/code]

といった感じでmallocしているので、おそらくHeapサイズ次第なのでしょう。  
なので、Cameraを使って、もろもろのアプリを作っていると、かなりサイズが小さくなってしまうようです。

見る限りアプリが使えるエリアは768kBぐらいしかなさそうなので、カメラなどを使わず、もしアプリが小さかったとしても、300kBぐらいしかheapから取れなそうに見えます。  
残りのエリアをうまく活用できるような対応をSONYさんに期待したいですね。


CC BY-SA 4.0
2019-10-07T01:19:16.187
59519
2019-12-03T20:15:44.380
2019-12-03T20:15:44.380
2376
32281
57517
answer


追加で調査しました。

結局、Cameraなどを利用してしまうと、Heapがほとんどなく、結局NNCのnnbファイルを置くエリアが数十バイトになってしまい、思うようなネットワークのAIが組めません。

ですが、Spresenseの1.5MBのメモリのWorker部分には、まだ、空きがあることが多いようです。  
そこで、そのエリアからメモリをとってみました。

<https://developer.sony.com/develop/spresense/docs/sdk_developer_guide_ja.html#_asmp_framework>  
を見てもわかりにくいのですが、exampleを参考に、Shared RAMを取得します。

[code]

      mpshm_t shm;
      int ret = mpshm_init(&shm, 0, 1024*512);
      int8_t* buf = mpshm_attach(&shm, 0);
    
[/code]

このような感じで、512kBの仮想空間のエリアの取得をmalloc代わりに行うと、

[code]

    size = nnbfile.size();
    
[/code]

のサイズが、512kBより小さければ、

[code]

    _network = buf;
    
[/code]

とすれば、512kBのnnbファイルを置くことができるようです。

これで、かなり大きなネットワークのAIが組めますね。


CC BY-SA 4.0
2019-12-03T16:36:23.947
61073
2019-12-03T20:15:21.953
2019-12-03T20:15:21.953
2376
32281
57517
answer