変換されたネットワークの設定 - DigitalMediaProfessionals/dv-sdk GitHub Wiki

ネットワーク変換ツールはname_gen.cppname_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_v0dv-user-driver/include/dmp_dv_cmdraw_v0.h で定義されています。

fpga_layer 構造体は変換されたネットワークの情報を定義します。詳細は層のデータ構造 をご覧ください。

実際に生成されたネットワークを使うには変換されたネットワークの利用方法 をご覧ください。