Open1

Pulsar2のjson設定

nnn112358nnn112358

https://pulsar2-docs.readthedocs.io/en/latest/user_guides_config/config.html#

設定ファイルの詳細

はじめに

このセクションでは、pulsar2 buildで使用する設定ファイルについて詳しく説明します。

プロファイル概要

ツールチェーンがサポートするすべてのコンパイルパラメータの定義については、《proto設定定義》を参照してください。基本的なデータ構造はBuildConfigです。

ユーザーは以下の形式で設定ファイルを作成できます:

  • prototxt
  • relaxed json
  • yaml
  • toml

これらの設定ファイルは、コマンドラインパラメータ--configで指定します。

注意事項:

  • Relaxed json形式では、js-styleまたはpython-styleのコメントを含むJSONファイルをサポートしています。
  • 一部のコンパイルパラメータはコマンドラインからの入力をサポートしており、設定ファイルよりも優先されます。
  • サポートされているコマンドラインコンパイルパラメータはpulsar2 build -hで確認できます。
  • 例えば、コマンドラインパラメータ--quant.calibration_methodは、QuantConfig構造体のcalibration_methodフィールドの設定と同等です。

完全なJSON設定リファレンス

{
  // 入力モデルファイルパス。タイプ:string。必須:true
  "input": "/path/to/lenet5.onnx",
  // axmodel出力ディレクトリ。タイプ:string。必須:true
  "output_dir": "/path/to/output_dir",
  // 出力axmodelの名前変更。タイプ:string。必須:false。デフォルト:compiled.axmodel
  "output_name": "compiled.axmodel",
  // 一時データ出力ディレクトリ。タイプ:string。必須:false。デフォルト:${output_dir}と同じ
  "work_dir": "",
  // 入力モデルタイプ。タイプ:enum。必須:false。デフォルト:ONNX。オプション:ONNX, QuantAxModel, QuantONNX
  "model_type": "ONNX",
  // ターゲットハードウェア。タイプ:enum。必須:false。デフォルト:AX650。オプション:AX650, AX620E, M76H
  "target_hardware": "AX650",
  // NPUモード。${target_hardware}がAX650の場合、NPU1/NPU2/NPU3。AX620Eの場合、NPU1/NPU2
  "npu_mode": "NPU1",
  // 入力モデルの入力形状を変更。input_processors設定の前に適用。形式:input1:1x3x224x224;input2:1x1x112x112
  "input_shapes": "input:1x1x28x28",
  
  "onnx_opt": {
    // ONNXの最適化を無効化。タイプ:bool。必須:false。デフォルト:false
    "disable_onnx_optimization": false,
    // https://github.com/daquexian/onnx-simplifierによるONNX簡略化を有効化
    "enable_onnxsim": false,
    // モデルチェックを有効化
    "model_check": false,
    // 変換チェックを無効化
    "disable_transformation_check": false,
    // メモリ使用量最適化のためにテンソルデータを保存
    "save_tensors_data": false
  },

  "quant": {
    "input_configs": [
      {
        // 元のモデルの入力テンソル名。"DEFAULT"はすべての入力テンソルに対する設定
        "tensor_name": "input",
        // 量子化キャリブレーションデータセットアーカイブファイルパス
        "calibration_dataset": "/path/to/dataset",
        // 量子化キャリブレーションデータ形式
        "calibration_format": "Image",
        // キャリブレーションデータサイズ。-1は全データセットを使用
        "calibration_size": 32,
        // 正規化の平均パラメータ
        "calibration_mean": [127],
        // 正規化の標準偏差パラメータ
        "calibration_std": [1]
      }
    ],
    "layer_configs": [
      {
        // レイヤーの量子化精度を設定
        "layer_name": "Conv_0",
        // 量子化データタイプ
        "data_type": "U8",
        // Conv演算子の出力データタイプ
        "output_data_type": "U8",
        // Conv演算子の重みデータタイプ
        "weight_data_type": "S8"
      },
      {
        // 演算子タイプによる量子化精度の設定
        "op_type": "MaxPool",
        "data_type": "U8"
      },
      {
        // レイヤー名による量子化精度の設定
        "layer_names": ["Conv_2"],
        "data_type": "U8",
        "output_data_type": "U8",
        "weight_data_type": "S8"
      },
      {
        // 演算子タイプによる量子化精度の設定
        "op_types": ["Gemm"],
        "data_type": "U8"
      },
      {
        // サブグラフ量子化設定の開始テンソル名
        "start_tensor_names": ["13"],
        // サブグラフ量子化設定の終了テンソル名
        "end_tensor_names": ["15"],
        "data_type": "U16"
      }
    ],
    // 量子化キャリブレーション方法
    "calibration_method": "MinMax",
    // 量子化精度分析を有効化
    "precision_analysis": true,
    // 精度分析方法
    "precision_analysis_method": "PerLayer",
    // 精度分析モード
    "precision_analysis_mode": "Reference",
    // 精度分析用の入力サンプルデータディレクトリ
    "input_sample_dir": "",
    // 最高混合精度量子化を有効化
    "highest_mix_precision": false,
    // Convバイアスデータタイプ
    "conv_bias_data_type": "S32",
    // LayerNormalizationスケールデータタイプ
    "ln_scale_data_type": "FP32",
    // 重み閾値の調整。1e-6のような有効な浮動小数点数。-1で機能を無効化
    "refine_weight_threshold": 1e-6,
    // conv 1x1のスムース量子化戦略を有効化
    "enable_smooth_quant": false,
    // Transformerの最適化レベル(0-2)
    "transformer_opt_level": 0,
    // 量子化チェックレベル。0:チェックなし、1:ノードデータ型チェック
    "check": 0,
    // 重みスケールと入力スケールの自動調整を無効化
    "disable_auto_refine_scale": false
  },

  "input_processors": [
    {
      // 元のモデルの入力テンソル名。"DEFAULT"はすべての入力テンソルに対する設定
      "tensor_name": "input",
      // 元のモデルの入力テンソル形式
      "tensor_format": "AutoColorSpace",
      // 元のモデルの入力テンソルレイアウト
      "tensor_layout": "NCHW",
      // 実行時の入力形式
      "src_format": "AutoColorSpace",
      // 実行時の入力レイアウト
      "src_layout": "NHWC",
      // 実行時の入力データ型
      "src_dtype": "U8",

      // この入力の追加コンパイラ形状。各入力のsrc_extra_shapesサイズは同じである必要がある
      "src_extra_shapes": [],

      // カラースペースモード
      "csc_mode": "NoCSC",
      // カラースペース変換行列(3x4行列を表す12要素の配列)
      "csc_mat": [1.1, 1.2, 1.3, 1.4, 2.1, 2.2, 2.3, 2.4, 3.1, 3.2, 3.3, 3.4],
      // 実行時の正規化平均パラメータ
      "mean": [],
      // 実行時の正規化標準偏差パラメータ
      "std": [],
      // パディング時の各軸の開始・終了パッド値のリスト
      "padding": [],
      // パディングモード
      "padding_mode": "constant",
      // パディング定数値
      "padding_constant_value": 0,
      // スライス時の各軸の開始・終了値のリスト
      "slicing": []
    }
  ],

  "output_processors": [
    {
      // 元のモデルの出力テンソル名。"DEFAULT"はすべての出力テンソルに対する設定
      "tensor_name": "output",
      // 出力テンソルの並べ替え
      "dst_perm": [0, 1],
      // 出力データ型
      "output_dtype": "FP32"
    }
  ],

  "const_processors": [
    {
      // 元のモデルの定数テンソル名
      "name": "fc2.bias",
      // 定数テンソルデータ配列
      "data": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
      // 定数テンソルデータファイルパス(.bin/.npy/.txtをサポート)
      "data_path": "replaced_data_file_path"
    }
  ],

  "quant_op_processors": [
    {
      // 元のモデルの演算子名
      "op_name": "MaxPool_3",
      // パッチを適用する演算子属性
      "attrs": {
        "ceil_mode": 0
      }
    },
    {
      "op_name": "Flatten_4", // AxReshape
      "attrs": {
        "shape": [0, 800]
      }
    }
  ],

  "compiler": {
    // 静的バッチサイズ
    "static_batch_sizes": [],
    // 最大動的バッチ
    "max_dynamic_batch_size": 0,
    // IR修正を無効化(マルチバッチコンパイル時のみ有効)
    "disable_ir_fix": false,
    // コンパイラチェックレベル
    "check": 0,
    // プロファイリング用のNPUパフォーマンス情報をダンプ
    "npu_perf": false,
    // コンパイラチェックモード
    "check_mode": "CheckOutput",
    // チェックレベル1の相対許容誤差
    "check_rtol": 1e-5,
    // チェックレベル1の絶対許容誤差
    "check_atol": 0,
    // チェックレベル3のコサイン類似度閾値
    "check_cosine_simularity": 0.999,
    // レイヤーごとのチェック用テンソルブラックリスト(正規表現サポート)
    "check_tensor_black_list": [],
    // コンパイラチェック用の入力サンプルデータディレクトリ
    "input_sample_dir": ""
  }
}

量子化パラメータの説明

input_configsの設定について:

  • tensor_nameは、モデルの実際の入出力ノード名に応じて設定する必要があります。
  • tensor_nameDEFAULTに設定すると、量子化設定がすべての入力に適用されます。
  • モデル入力のカラースペースは、前処理input_processors設定のtensor_formatパラメータで表現されます。
  • ツールチェーンは量子化キャリブレーションセットを読み込む際、input_processorstensor_formatパラメータに従ってキャリブレーションセットデータのカラースペースを自動的に変換します。

layer_configsの設定について:

  • layer_nameop_typeオプションは同時に設定できません。
  • transformer_opt_levelTransformerモデルの最適化オプションを設定します。

量子化精度分析パラメータの説明

精度分析計算方法(precision_analysis_modeフィールド):

  • Referenceモード:

    • コンパイラがサポートするすべてのモデルを実行可能(CPUおよびNPUサブグラフを含むモデルをサポート)
    • 最終的な基板結果と比較して計算結果に小さな誤差が生じます(基本的に差は±1以内で、システム的な誤差はありません)
  • NPUBackendモード:

    • NPUサブグラフのみを含むモデルを実行可能
    • 計算結果は基板結果とビット単位で一致します
      精度分析方法(precision_analysis_methodフィールド):
  • PerLayer方式:各レイヤーが浮動小数点モデルに対応するレイヤー入力を使用し、各レイヤーの出力と浮動小数点モデルの出力との類似度を計算します。

  • EndToEnd方式:最初のレイヤーが浮動小数点モデル入力を採用し、完全なモデルをシミュレートした後、最終出力結果と浮動小数点モデル出力との類似度を計算します。

前処理および後処理パラメータの説明

入出力プロセッサの基本設定

input_processorsおよびoutput_processorsの設定について、以下の重要な点があります:

  1. tensor_nameの設定:

    • モデルの実際の入出力ノード名に応じて設定する必要があります。
    • DEFAULTを設定すると、すべての入出力に設定が適用されます。
  2. パラメータのプレフィックスの意味:

    • tensor_プレフィックスのパラメータは、元のモデルにおける入出力属性を表します。
    • src_プレフィックスのパラメータは、実行時の実際の入出力属性を表します。
  3. ツールチェーンの自動変換:

    • ユーザーの設定に従って、実行時の入出力と元のモデルの入出力間の変換に必要な演算子を自動的に追加します。
    • 例えば、tensor_layoutNCHWsrc_layoutNHWCの場合、ツールチェーンは自動的にTranspose演算子を追加し、[0, 3, 1, 2]のperm属性を設定します。

カラースペース変換の前処理

  1. LimitedRangeまたはFullRangeモード:

    • csc_modeLimitedRangeまたはFullRange
    • src_formatYUVカラースペースの場合
    • ツールチェーンは組み込みテンプレートパラメータに従って変換を行い
    • この場合、csc_matの設定は無効となります
  2. Matrixモード:

    • csc_modeMatrixsrc_formatYUVカラースペースの場合
    • ユーザー設定のcsc_mat行列に従って変換を行います
    • 実行時にYUVデータをBGRまたはRGBデータに変換します
  3. 変換プロセス(Matrixモード):

    • まずYUV/YVUカラースペース入力をYUV444形式に統一的に変換
    • その後csc_mat係数行列を乗算
    • パラメータの値範囲:
      • bias(csc_mat[3]/[7]/[11]):(-9, 8)
      • その他のパラメータ(csc_mat[0-2]/[4-6]/[8-10]):(-524289, 524288)

正規化の前処理

  1. デフォルト設定:

    • input_processorsmean/stdパラメータは、量子化設定のcalibration_mean/calibration_stdパラメータの値をデフォルトで使用します。
  2. カスタム設定:

    • 実行時に異なる正規化パラメータを使用したい場合
    • 明示的な設定のmean/stdパラメータでデフォルト値を上書きできます

パディングとスライス操作の設定

  1. パディング設定:

    • padding:各軸のパディング長を32ビット整数配列で指定
    • padding_mode:パディング方法を指定(現在は"constant"のみサポート)
    • padding_constant_value:定数パディングの値を指定(デフォルト:0)
  2. スライス設定:

    • slicing:各軸のスライス長を32ビット整数配列で指定
    • 設定例:
    {
      "input_processors": [
        {
          "slicing": [0, 0, 0, 0, 0, 1, 0, 1]
        }
      ]
    }
    
   usage: main.py build [-h] [--config] [--input] [--output_dir] [--output_name]

                       [--work_dir] [--model_type] [--target_hardware]

                       [--npu_mode] [--input_shapes]

                       [--onnx_opt.disable_onnx_optimization]

                       [--onnx_opt.enable_onnxsim] [--onnx_opt.model_check]

                       [--onnx_opt.disable_transformation_check]

                       [--quant.calibration_method] [--quant.precision_analysis]

                       [--quant.precision_analysis_method]

                       [--quant.precision_analysis_mode]

                       [--quant.highest_mix_precision]

                       [--quant.conv_bias_data_type]

                       [--quant.refine_weight_threshold]

                       [--quant.enable_smooth_quant]

                       [--quant.transformer_opt_level]

                       [--quant.input_sample_dir] [--quant.ln_scale_data_type]

                       [--compiler.static_batch_sizes [...]]

                       [--compiler.max_dynamic_batch_size]

                       [--compiler.disable_ir_fix] [--compiler.check]

                       [--compiler.debug] [--compiler.input_sample_dir]


  optional arguments:

    -h, --help            show this help message and exit

    --config              config file path, supported formats: json / yaml /

                          toml / prototxt. type: string. required: false.

                          default:.

    --input               input model file path. type: string. required: true.

    --output_dir          axmodel output directory. type: string. required:

                          true.

    --output_name         rename output axmodel. type: string. required: false.

                          default: compiled.axmodel.

    --work_dir            temporary data output directory. type: string.

                          required: false. default: same with ${output_dir}.

    --model_type          input model type. type: enum. required: false.

                          default: ONNX. option: ONNX, QuantAxModel, QuantONNX.

    --target_hardware     target hardware. type: enum. required: false. default:

                          AX650. option: AX650, AX620E, M76H.

    --npu_mode            npu mode. while ${target_hardware} is AX650, npu mode

                          can be NPU1 / NPU2 / NPU3. while ${target_hardware} is

                          AX620E, npu mode can be NPU1 / NPU2. type: enum.

                          required: false. default: NPU1.

    --input_shapes        modify model input shape, this feature will take

                          effect before the `input_processors` configuration.

                          format: input1:1x3x224x224;input2:1x1x112x112. type:

                          string. required: false. default: .

    --onnx_opt.disable_onnx_optimization

                          disable onnx optimization. type: bool. required:

                          false. default: false.

    --onnx_opt.enable_onnxsim

                          enable onnx simplify by

                          https://github.com/daquexian/onnx-simplifier. type:

                          bool. required: false. default: false.

    --onnx_opt.model_check

                          enable model check. type: bool. required: false.

                          default: false.

    --onnx_opt.disable_transformation_check

                          disable transformation check. type: bool. required:

                          false. default: false.

    --quant.calibration_method

                          quantize calibration method. type: enum. required:

                          false. default: MinMax. option: MinMax, Percentile,

                          MSE.

    --quant.precision_analysis

                          enable quantization precision analysis. type: bool.

                          required: false. default: false.

    --quant.precision_analysis_method

                          precision analysis method. type: enum. required:

                          false. default: PerLayer. option: PerLayer, EndToEnd.

    --quant.precision_analysis_mode

                          precision analysis mode. type: enum. required: false.

                          default: Reference. option: Reference, NPUBackend.

    --quant.highest_mix_precision

                          enable highest mix precision quantization. type: bool.

                          required: false. default: false.

    --quant.conv_bias_data_type

                          conv bias data type. type: enum. required: false.

                          default: S32. option: S32, FP32.

    --quant.refine_weight_threshold

                          refine weight threshold, should be a legal float

                          number, like 1e-6. -1 means disable this feature.

                          type: float. required: false. default: 1e-6.

                          limitation: 0 or less than 0.0001.

    --quant.enable_smooth_quant

                          enalbe smooth quant strategy for conv 1x1. type: bool.

                          required: false. default: false.

    --quant.transformer_opt_level

                          tranformer opt level. type: int. required: false.

                          default: 0. limitation: 0~2.

    --quant.input_sample_dir

                          input sample data dir for precision analysis. type:

                          string. required: false. default: .

    --quant.ln_scale_data_type

                          LayerNormalization scale data type. type: enum.

                          required: false. default: FP32. option: FP32, S32,

                          U32.

    --compiler.static_batch_sizes [ ...]

                          static batch sizes. type: int array. required: false.

                          default: [].

    --compiler.max_dynamic_batch_size

                          max dynamic batch. type: int, required: false.

                          default: 0.

    --compiler.disable_ir_fix

                          disable ir fix, only work in multi-batch compilation.

                          type: bool. required: false. default: false.

    --compiler.check      compiler check level, 0: no check; 1: simulate compile

                          result; 2: simulate and check compile result (for

                          debug). type: int. required: false. default: 0.

    --compiler.debug      compiler debug level. type: int. required: false.

                          default: 0.

    --compiler.input_sample_dir

                          input sample data dir for compiler check. type:

                          string. required: false. default: .