量子化ストラテジの設定 - 2.5 日本語

Vitis AI ユーザー ガイド (UG1414)

Document ID
UG1414
Release Date
2022-06-15
Version
2.5 日本語
複数の量子化ストラテジの設定用として、vai_q_pytorch は JSON 形式の量子化コンフィギュレーション ファイルをサポートします。 
  1. 使用法
    torch_quantizer API に量子化コンフィギュレーション ファイルを渡すだけで、カスタマイズされた設定を有効にできます。
    config_file = "./pytorch_quantize_config.json"
    quantizer = torch_quantizer(quant_mode=quant_mode, 
                                module=model, 
                                input_args=(input), 
                                device=device, 
                                quant_config_file=config_file)
    example/resnet18_quant.py にあるサンプル コードのコンフィギュレーション ファイルとして、example/pytorch_quantize_config.json ファイルを使用できます。「--config_file pytorch_quantize_config.json」を指定してコマンドを実行し、モデルを量子化します。
    python resnet18_quant.py --quant_mode calib --config_file pytorch_quantize_config.json
    python resnet18_quant.py --quant_mode test --config_file pytorch_quantize_config.json
    サンプル コンフィギュレーション ファイルでは、「overall_quantizer_config」内のモデル設定は、「entropy」キャリブレーション方法および「per_tensor」量子化に設定されています。
    "overall_quantize_config": {
      ...
      "method": "entropy",
      ...
      "per_channel": false,
      ...
    },
    「tensor_quantize_config」内の重みの設定は、「maxmin」キャリブレーション方法と「per_tensor」量子化になっています。つまり、重みにはモデル設定とは異なるキャリブレーション方法を使用します。
    "tensor_quantize_config": {
      ...
      "weights": {
        ...
        "method": "maxmin",
        ...
        "per_channel": false,
        ...
        }
    また、「layer_quantize_config」リストにレイヤー量子化設定が 1 つあります。この設定は「layer_type」に基づいており、torch.nn.Conv2d レイヤーを「per_channel」量子化に設定します。
    "layer_quantize_config": [
      {
        "layer_type": "torch.nn.Conv2d",
        ...
        "overall_quantize_config": {
          ...
          "per_channel": false,
  2. コンフィギュレーション ファイルで設定できる設定項目は次のとおりです。
    convert_relu6_to_relu
    (グローバルなクオンタイザー設定) ReLU6 を ReLU に変換するかどうか。オプション: True または False。
    include_cle
    (グローバルなクオンタイザー設定) クロス レイヤー イコライゼーションを使用するかどうか。オプション: True または False。
    include_bias_corr
    (グローバルなクオンタイザー設定) バイアス補正を使用するかどうか。 オプション: True または False
    target_device
    (グローバルなクオンタイザー設定) 量子化済みモデルを運用するデバイス。オプション: DPU、CPU、GPU
    quantizable_data_type
    (グローバルなクオンタイザー設定) モデル内で量子化されるテンソルのタイプ。
    bit_width
    (テンソルの量子化設定) 量子化に使用するビット幅。
    method
    (テンソルの量子化設定) キャリブレーション プロセスで使用される方法。オプション: Maxmin、Percentile、Entropy、MSE、diffs。
    round_mode
    (テンソルの量子化設定) キャリブレーション プロセスの丸め方法。 オプション: half_even、half_up、half_down、std_round
    symmetry
    (テンソルの量子化設定) 対称量子化を使用するかどうか。オプション: True または False
    per_channel
    (テンソルの量子化設定) per_channel 量子化を使用するかどうか。オプション: True または False
    signed
    (テンソルの量子化設定) 符号付き量子化を使用するかどうか。オプション: True または False
    narrow_range
    (テンソルの量子化設定) 符号付き量子化に対称整数範囲を使用するかどうか。オプション: True または False
    scale_type
    (テンソルの量子化設定) 量子化プロセスで使用されるスケールのタイプ。オプション: Float、power_of_two
    calib_statistic_method
    (テンソルの量子化設定) キャリブレーション プロセスでのアクティベーション データの統計手法。オプション: modal、max、mean、median
  3. 階層的設定
    量子化の設定は階層構造になっています。
    • torch_quantizer API でコンフィギュレーション ファイルを指定しない場合は、デフォルトの設定が使用されます。デフォルトの設定は DPU デバイスに適用され、power_of_two 量子化方法が使用されます。
    • コンフィギュレーション ファイルが指定されている場合は、(グローバルなクオンタイザー設定とグローバルなテンソル量子化設定を含む) モデル設定が必要です。
    • コンフィギュレーション ファイルでモデル設定のみを指定した場合は、モデル内のすべてのテンソルに同じ設定が使用されます。
    • レイヤー設定を使用して、いくつかのレイヤーを特定の設定パラメーターに設定できます。
    1. デフォルト コンフィギュレーション
      次にデフォルトの設定の詳細を示します。
      "convert_relu6_to_relu": false,
      "include_cle": true,
      "include_bias_corr": true,
      "target_device": "DPU",
      "quantizable_data_type": [
        "input", 
        "weights", 
        "bias", 
        "activation"],
      "bit_width": 8, 
      "method": "diffs", 
      "round_mode": "std_round", 
      "symmetry": true, 
      "per_channel": false, 
      "signed": true, 
      "narrow_range": false, 
      "scale_type": "power_of_two", 
      "calib_statistic_method": "modal"
    2. モデル設定
      サンプル コンフィギュレーション ファイル「example/pytorch_quantize_config.json」では、グローバルなクオンタイザー設定がそれぞれのキーワードの下に設定されます。また、グローバルな量子化パラメーターは、「overall_quantize_config」キーワードの下に設定されます。次に例を示します。
        "convert_relu6_to_relu": false,
        "include_cle": false,
        "keep_first_last_layer_accuracy": false,
        "keep_add_layer_accuracy": false,
        "include_bias_corr": false,
        "target_device": "CPU",
        "quantizable_data_type": [
          "input",
          "weights",
          "bias",
          "activation"],
      "overall_quantize_config": {
          "bit_width": 8, 
          "method": "maxmin", 
          "round_mode": "half_even", 
          "symmetry": true, 
          "per_channel": false, 
          "signed": true, 
          "narrow_range": false, 
          "scale_type": "float", 
          "calib_statistic_method": "max"
      }
      オプションにより、モデル内の複数のテンソルの量子化設定を個別に設定できます。 これらは「tensor_quantize_config」キーワードの下に設定する必要があります。次の例では、サンプル コンフィギュレーション ファイルでアクティベーションの量子化方法を「mse」に変更します。その他のパラメーターは、グローバル パラメーターと同じ設定で使用されます。
      "tensor_quantize_config": {
      
          "activation": {
      
              "method": "mse", 
      
          } 
      }
    3. レイヤー設定
      レイヤーの量子化設定は、「layer_quantize_config」リストで追加する必要があります。2 種類のパラメーター設定方法 (レイヤー タイプおよびレイヤー名) がサポートされます。レイヤー設定を実行する場合、次の 5 つのことに注意してください。
      • 個々のレイヤー設定はディクショナリ形式にする必要があります。
      • 各レイヤー設定には、「quantizable_data_type」および「overall_quantize_config」パラメーターが必要です。「overall_quantize_config」パラメーターには、このレイヤーのすべての量子化パラメーターが含まれている必要があります。
      • レイヤー タイプに基づく設定では、「layer_name」パラメーターを NULL にする必要があります。
      • レイヤー名に基づく設定では、モデルは最初にキャリブレーション プロセスを実行し、次に quantized_result ディレクトリに生成される python ファイルから必要なレイヤー名を取得する必要があります。また、「layer_type」パラメーターを NULL にする必要があります。
      • モデル設定の場合と同じように、レイヤー内の複数のテンソルの量子化設定を個別に設定できます。 これらは「tensor_quantize_config」キーワードの下に設定する必要があります。
      サンプル コンフィギュレーション ファイルには、2 つのレイヤー設定があります。 1 つはレイヤー タイプに基づくもので、もう 1 つはレイヤー名に基づくものです。レイヤー タイプに基づくレイヤー設定では、torch.nn.Conv2d レイヤーを特定の量子化パラメーターに設定する必要があります。重みの「per_channel」パラメーターは「true」に設定され、アクティベーションの「method」パラメーターは「entropy」に設定されています。
      {
        "layer_type": "torch.nn.Conv2d",
        "layer_name": null,
        "quantizable_data_type": [
          "weights",
          "bias",
          "activation"],
        "overall_quantize_config": {
          "bit_width": 8,
          "method": "maxmin",
          "round_mode": "half_even",
          "symmetry": true,
          "per_channel": false,
          "signed": true,
          "narrow_range": false,
          "scale_type": "float",
          "calib_statistic_method": "max"
        },
        "tensor_quantize_config": {
          "weights": {
            "per_channel": true
          },
          "activation": {
            "method": "entropy"
          }
        }
      }
      レイヤー名に基づくレイヤー設定では、「ResNet::ResNet/Conv2d[conv1]/input.2」という名前のレイヤーを特定の量子化パラメーターに設定する必要があります。このレイヤーのアクティベーションの round_mode は「half_up」に設定されます。
      {
        "layer_type": null,
        "layer_name": "ResNet::ResNet/Conv2d[conv1]/input.2",
        "quantizable_data_type": [
          "weights",
          "bias",
          "activation"],
        "overall_quantize_config": {
          "bit_width": 8,
          "method": "maxmin",
          "round_mode": "half_even",
          "symmetry": true,
          "per_channel": false,
          "signed": true,
          "narrow_range": false,
          "scale_type": "float",
          "calib_statistic_method": "max"
        },
        "tensor_quantize_config": {
          "activation": {
            "round_mode": "half_up"
          }
        }
      }
      レイヤー名「ResNet::ResNet/Conv2d[conv1]/input.2」は、サンプル コード「example/resnet18_quant.py」の生成されたファイル「quantize_result/ResNet.py」から取得されます。
      • コマンド「python resnet18_quant.py --subset_len 100」を使用してサンプル コードを実行します。quantize_result/ResNet.py ファイルが生成されます。
      • このファイル内で、最初のたたみ込みレイヤーの名前は「ResNet::ResNet/Conv2d[conv1]/input.2」です。
      • このレイヤーに特定の設定を適用する場合は、量子化コンフィギュレーション ファイルにレイヤー名をコピーします。
      import torch
      import pytorch_nndct as py_nndct
      class ResNet(torch.nn.Module):
        def __init__(self):
          super(ResNet, self).__init__()
          self.module_0 = py_nndct.nn.Input() #ResNet::input_0
          self.module_1 = py_nndct.nn.Conv2d(in_channels=3, out_channels=64, kernel_size=[7, 7], stride=[2, 2], padding=[3, 3], dilation=[1, 1], groups= 1, bias=True) #ResNet::ResNet/Conv2d[conv1]/input.2