ネットワーク変換ツールの内部 - DigitalMediaProfessionals/dv-sdk GitHub Wiki

ツールスクリプトファイルの構成

tool
│  convertor.py            : メインエントリスクリプトです。
│
└─cnn_convertor
    │  __init__.py         : このディレクトリがPython モジュールであることを示す。
    │  caffe_pb2.py        : Protobuf コンパイラを使ってcaffe.proto から自動生成しました。編集しないでください。
    │  cnn_exception.py    : 例外を定義しています。
    │  cnn_layer.py        : 内部の層とネットワークのデータ構造とそのオペレーターを定義しています。
    │  cnn_parser.py       : パーサーのフロントエンドで、入力モデルに従いCaffe パーサーかKeras パーサーを呼び出します。
    │  parser_caffe.py     : ネットワークの内部表現を作成するためのCaffe モデルへのパーサーです。
    │  parser_keras.py     : ネットワークの内部表現を作成するためのKeras モデルへのパーサーです。
    │  fpga_layer.py       : 重みのパッキングとFPGA ネットワークの設定を記述したC++ コードの出力をします。
    └─ cnn_docgen.py       : Doxygen の設定ファイルを生成します。

ネットワーク変換ツールの処理フロー

  1. 入力である .ini 設定ファイルをconvertor.py でパースします。

  2. cnn_parser.pycnn_parser.parse_network() で入力ネットワークをパースします。

    1. Caffe のネットワークにはparser_caffe.pyparser_caffe.parse_caffe_def() を呼び出します。

      Keras のネットワークにはparser_keras.pyparser_keras.parse_keras_network() 呼び出します。

    2. Call network.build_traverse_list() in cnn_layer.py to build the traversal list of nodes for the converted network.

    3. cnn_layer.pynetwork.calc_inout_sizes() で各ノードの入出力バッファの次元を計算します。

    4. Caffe のネットワークであれば、parser_caffe.parse_caffe_data() で重みをノードに添付します。Keras の場合にはネットワークの定義と重みが同じファイルに保存されているので、このステップは不要です。

  3. fpga_layer.FPGANetwork() でネットワークのFPGA 用の表現を作成します。

    fpga_layer.FPGANetwork()FPGANetwork.convert_network() でネットワークをFPGA 形式に変換します。

    1. convert_network() は複数の層を結合します。現在では以下のルールに従います。

      • 最大プーリング層を畳み込み層の後に結合します。この結合は両方のタイルが一つの時に行われます。(タイルはFPGA ハードウェアの設定です。もし入力バッファが大きすぎるなら、内部のメモリは全バッファを格納できないので、バッファを複数のタイルに分割します。)
      • 単純な分岐 を結合します。デプスが2以下の分岐のみが考慮されます。単純な分岐 とは次のようなものです(ネットワークのフローは左から右に流れます)。
               ------ B ------
              /               \
            A                  E
              \               /
               --- C --- D ---
      
    2. connect_layers() を呼び出し、各入出力バッファの生存期間を解析します。その後各層のバッファオフセットを設定し、もはや使われないメモリを再利用するようにします。

  4. fpga_net.output_network() を呼び出し、FPGA ネットワークの設定を記述したC++ ソースファイルとパックされた重みのファイルを出力します。