変換されたネットワークの設定 - DigitalMediaProfessionals/dv-sdk GitHub Wiki
ネットワーク変換ツールはname_gen.cpp
とname_gen.h
を生成します(ここでname
は入力となる*.ini* ファイルの
INPUT` セクションで定義された値で、典型的にはネットワークの名前です)。より詳細な情報を得るためには生成されたソースコードのドキュメントを作成してください。
ソースコード・ドキュメンテーション
変換ツールのドキュメント作成にはDoxygen を利用します。変換ツールを実行しているとき、doc フォルダとDoxygen 設定ファイルが作られます。
- Doxyfile: Doxygen 設定ファイル。
- pages.dox: Doxygen ドキュメントの表紙。ネットワーク変換ツールの概要を含みます。
- name.dot: 変換されたネットワークのグラフを定義しているDot ファイル。Doxygen ドキュメントの表紙に含まれる。
Windows コンソールでドキュメントを作成するためには、doxygen
をインストールしdoc
フォルダから次のコマンドを入力します。
$ cd CaffeMobileNet/doc
$ doxygen
すると、ドキュメントがCaffeMobileNet/doc/html/html/index.html
に生成されます。
ネットワーク設定のソースコード
ネットワーク変換ツールはネットワーク設定のソースコードを生成します。 現在そのコードは畳み込みブロックと全結合ブロックのレジスタ設定を含みます。 これ以降では、CaffeMobileNet を例として、生成されるソースコードの簡単な概要を紹介します。
ネットワークのクラスは次のように定義されます。
#pragma once
#include "dmp_network.h"
class CCaffeMobileNet : public CDMP_Network
{...}
application/common/include/dmp_network.h
で定義されているクラスCDMP_Network
はネットワークレイヤーのユーティリティとして働き、メモリ確保やレジスタ書き込み、ネットワークの実行や入出力の設定を隠蔽します。詳しくはネットワーククラスインターフェース をご参照ください。
クラスCCaffeMobileNet
はネットワーク特有のメソッドのみを定義しています。クラス定義の全体は次の通りです。
class CCaffeMobileNet : public CDMP_Network {
private:
void Layer_0();
void Layer_1();
//...
void Layer_28();
void Layer_29();
public:
virtual bool Initialize();
CCaffeMobileNet();
virtual ~CCaffeMobileNet();
};
initialize()
メソッドはネットワークを初期化します。ネットワークが作成された後に呼ばれなくてはなりません。
Layer_*()
メソッドはすべての層の設定を定義します。例えばCaffeMobileNet_gen.cpp
における最初の層は次のように定義されています。
//Layer_0: Convolution Layer
// ->: conv1
// ->: conv1/bn
// ->: conv1/scale
// ->: relu1
void CCaffeMobileNet::Layer_0() {
dmp_dv_cmdraw_conv_v0& conf = get_layer(0).conv_conf;
conf.header.size = sizeof(conf);
conf.header.device_type = DMP_DV_DEV_CONV;
conf.header.version = 0;
// Topo: 00000000000000000000000000000001
conf.topo = 0x1; // [31:0] Output Destination of each run, 0 = UBUF, 1 = EXTMEM
// Input Configuration:
conf.w = 224; // Input Width
conf.h = 224; // Input Height
conf.z = 1; // Input Depth
conf.c = 3; // Input Channels
conf.input_buf.mem = io_mem_;
conf.input_buf.offs = 0;
// Output Configuration:
conf.output_buf.mem = io_mem_;
conf.output_buf.offs = 802816;
conf.eltwise_buf.mem = NULL;
conf.eltwise_buf.offs = 0; // Input byte address for elementwise add (0 = UBUF Input Buffer)
conf.output_mode = 0; // 0 = concat, 1 = eltwise add
// Runs Configuration:
// ->1 run(s)
//--------------------------------------------------
//RUN : 0
//--------------------------------------------------
//->: conv1
//->: conv1/bn
//->: conv1/scale
//->: relu1
conf.run[0].m = 32; // Output Channels
conf.run[0].conv_enable = 1; // 1 = Enabled, 0 = Disabled
conf.run[0].p = 0x3; // Filter Width and Height
conf.run[0].pz = 1; // Filter Depth
conf.run[0].weight_buf.mem = weights_mem_;
conf.run[0].weight_buf.offs = 0;
conf.run[0].weight_fmt = 3; // Weight format (0 = random access blocks, 1 = compact stream, 3 = 8-bit qunatized stream)
conf.run[0].conv_pad = 0x1010101; // bits [7:0] = left padding, bits [15:8] = right padding, bits [23:16] = top padding, bits [31:24]$
conf.run[0].conv_stride = 0x202; // bits [7:0] = X stride, bits [15:8] = Y stride
conf.run[0].conv_dilation = 0x0; // bits [7:0] = X dilation, bits [15:8] = Y dilation
conf.run[0].pool_enable = 0; // 0 = disabled, 1 = max pooling, 2 = average pooling
conf.run[0].pool_size = 0x0; // bits [7:0] = width, bits [15:8] = height
conf.run[0].pool_stride = 0x101; // bits [7:0] = X stride, bits [15:8] = Y stride
conf.run[0].pool_pad = 0x0; // bits [7:0] = left padding, bits [15:8] = right padding, bits [23:16] = top padding, bits [31:24] = bot$
conf.run[0].pool_avg_param = 0x0; // Usually set to 1/pool_size^2 in FP16 format when using average pooling (average pooling assumes $
conf.run[0].actfunc = 2; // Activation Function: 0 = None, 1 = Tanh, 2 = Leaky ReLU, 3 = Sigmoid, 4 = PReLU, 5 = ELU, 6 = ReLU6
conf.run[0].actfunc_param = 0x0; // Leaky ReLU parameter (NOTE: 0x2E66 is 0.1 in FP16)
conf.run[0].rectifi_en = 0; // Rectification, i.e. max(0, x) (NOTE: Can be applied after non-ReLU activation function)
fpga_layer& layer = get_layer(0);
layer.name = "conv1";
layer.type = LT_CONV;
layer.input_offs = 0;
layer.output_offs = 802816;
layer.output_size = 802816;
layer.input_dim[0] = 224;
layer.input_dim[1] = 224;
layer.input_dim[2] = 3;
layer.input_dim_size = 3;
layer.output_dim[0] = 112;
layer.output_dim[1] = 112;
layer.output_dim[2] = 32;
layer.output_dim_size = 3;
layer.is_output = false;
layer.is_f32_output = false;
layer.is_input_hw_layout = false;
}//end of Layer_0
この設定は単純なデータ構造と対応するフィールドの設定により行われます。畳み込みモジュールのデータ構造dmp_dv_cmdraw_conv_v0
は dv-user-driver/include/dmp_dv_cmdraw_v0.h
で定義されています。
fpga_layer
構造体は変換されたネットワークの情報を定義します。詳細は層のデータ構造 をご覧ください。
実際に生成されたネットワークを使うには変換されたネットワークの利用方法 をご覧ください。