複数の量子化ストラテジの設定用として、vai_q_pytorch は JSON 形式の量子化コンフィギュレーション ファイルをサポートします。
-
使用法
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,
-
コンフィギュレーション ファイルで設定できる設定項目は次のとおりです。
- 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
-
階層的設定
量子化の設定は階層構造になっています。
- torch_quantizer API でコンフィギュレーション ファイルを指定しない場合は、デフォルトの設定が使用されます。デフォルトの設定は DPU デバイスに適用され、power_of_two 量子化方法が使用されます。
- コンフィギュレーション ファイルが指定されている場合は、(グローバルなクオンタイザー設定とグローバルなテンソル量子化設定を含む) モデル設定が必要です。
- コンフィギュレーション ファイルでモデル設定のみを指定した場合は、モデル内のすべてのテンソルに同じ設定が使用されます。
- レイヤー設定を使用して、いくつかのレイヤーを特定の設定パラメーターに設定できます。
-
デフォルト コンフィギュレーション
次にデフォルトの設定の詳細を示します。
"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"
-
モデル設定
サンプル コンフィギュレーション ファイル「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", } }
-
レイヤー設定
レイヤーの量子化設定は、「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