ソフトウェア全体像

BNN-PYNQのソフトウェアの構成を図にしてみました。

_images/software-overview.png
  • 青色の箱が、モデル毎に実装する必要があるモジュール
  • 緑色の箱は、FINN libraryと呼ばれており、モデルによらず共通
    • ソースは、 bnn/src/library

    • hostは、上位からの呼び出しに対してSW/HWビルドの差異を吸収する
      • ビルド時の定数マクロで、関数を切り替えている
      • SWビルドのときは、高位合成対象のCの関数を直接呼ぶ
      • HWビルドのときは、driverを介してアクセラレータを制御する
    • driverは、アクセラレータ用のメモリ管理やレジスタ制御を行う

    • hlsは、高位合成時にインクルードされる共通ライブラリ

ソフトウェアシーケンス

LFCで単一画像を推論する場合のシーケンスは以下のようになっています。

  • シーケンス上、主要と思われるところを記載。
userPynqBNNmainhostdriver↓初期化。Overlayをロード__init__()↓モデルの学習済みパラメータのロードload_parameters()load_parameters()FoldedMVInit()initPlatform()アクセラレータのレジスタをmemmapFoldedMVLoadLayerMem()FoldedMVMemSet()レジスタ制御学習済の重みをセット。.binファイルを読み込み、レジスタ経由でアクセラレータへセットloop[ 全レイヤー ]return↓推論処理inference()inference()FoldedMVInit()testPrebinarized_nolabel()binarizeAndPack()copyBufferHostToAccel()入力データをアクセラレータ側へコピーFoldedMVOffloadBinarized()writeJamRegAddr()ExecAccel()実行レジスタをキックし、結果をポーリングcopyBufferAccelToHost()推論結果をソフト側へコピーreturnreturn↓終了処理(暗黙的に呼ばれる)__del__()deinit()FoldedMVDeinit()deinitPlatform()returnuserPynqBNNmainhostdriver