ネットワーク変換ツールの内部 - 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 の設定ファイルを生成します。
ネットワーク変換ツールの処理フロー
-
入力である .ini 設定ファイルを
convertor.py
でパースします。 -
cnn_parser.py
のcnn_parser.parse_network()
で入力ネットワークをパースします。-
Caffe のネットワークには
parser_caffe.py
のparser_caffe.parse_caffe_def()
を呼び出します。Keras のネットワークには
parser_keras.py
のparser_keras.parse_keras_network()
呼び出します。 -
Call
network.build_traverse_list()
incnn_layer.py
to build the traversal list of nodes for the converted network. -
cnn_layer.py
のnetwork.calc_inout_sizes()
で各ノードの入出力バッファの次元を計算します。 -
Caffe のネットワークであれば、
parser_caffe.parse_caffe_data()
で重みをノードに添付します。Keras の場合にはネットワークの定義と重みが同じファイルに保存されているので、このステップは不要です。
-
-
fpga_layer.FPGANetwork()
でネットワークのFPGA 用の表現を作成します。fpga_layer.FPGANetwork()
はFPGANetwork.convert_network()
でネットワークをFPGA 形式に変換します。-
convert_network()
は複数の層を結合します。現在では以下のルールに従います。- 最大プーリング層を畳み込み層の後に結合します。この結合は両方のタイルが一つの時に行われます。(タイルはFPGA ハードウェアの設定です。もし入力バッファが大きすぎるなら、内部のメモリは全バッファを格納できないので、バッファを複数のタイルに分割します。)
- 単純な分岐 を結合します。デプスが2以下の分岐のみが考慮されます。単純な分岐 とは次のようなものです(ネットワークのフローは左から右に流れます)。
------ B ------ / \ A E \ / --- C --- D ---
-
connect_layers()
を呼び出し、各入出力バッファの生存期間を解析します。その後各層のバッファオフセットを設定し、もはや使われないメモリを再利用するようにします。
-
-
fpga_net.output_network()
を呼び出し、FPGA ネットワークの設定を記述したC++ ソースファイルとパックされた重みのファイルを出力します。