如何部署 MobileNetV2

[English]

在本教程中,我们介绍如何使用 ESP-PPQ 对预训练的 MobileNetV2 模型进行量化,并使用 ESP-DL 部署量化后的 MobileNetV2 模型。

准备工作

  1. 安装 ESP_IDF

  2. 安装 ESP_PPQ

模型量化

备注

  • ESP32P4:对 Conv 和 Gemm 算子的权重采用 per-channel 量化策略,其余算子仍使用 per-tensor

  • ESP32S3 及其他芯片:因指令集限制,所有算子均统一采用 per-tensor 量化策略。

由于 per-channel 量化在细节保留上通常优于 per-tensor,因此相同模型在 ESP32P4 上的量化精度往往高于 ESP32S3。

为演示不同的量化方法,下文的示例主要以 ESP32S3 为目标平台进行说明。同时,在 8bit 默认配置量化 章节中也提供了 ESP32P4 的量化结果,以供开发者对比参考。

量化脚本

预训练模型

从 torchvision 加载 MobileNet_v2 的预训练模型,你也可以从 ONNX modelsTensorFlow models 下载:

import torchvision
from torchvision.models.mobilenetv2 import MobileNet_V2_Weights

model = torchvision.models.mobilenet.mobilenet_v2(weights=MobileNet_V2_Weights.IMAGENET1K_V1)

校准数据集

校准数据集需要和你的模型输入格式一致,校准数据集需要尽可能覆盖你的模型输入的所有可能情况,以便更好地量化模型。这里以 ImageNet 数据集为例,演示如何准备校准数据集。

使用 torchvision 加载 ImageNet 数据集:

import torchvision.datasets as datasets
from torch.utils.data.dataset import Subset
dataset = datasets.ImageFolder(
   CALIB_DIR,
   transforms.Compose(
         [
            transforms.Resize(256),
            transforms.CenterCrop(224),
            transforms.ToTensor(),
            transforms.Normalize(
               mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]
            ),
         ]
   ),
)
dataset = Subset(dataset, indices=[_ for _ in range(0, 1024)])
dataloader = DataLoader(
   dataset=dataset,
   batch_size=BATCH_SIZE,
   shuffle=False,
   num_workers=4,
   pin_memory=False,
   collate_fn=collate_fn1,
)

8bit 默认配置量化

ESP32P4 量化

量化设置

import torch.nn as nn

def convert_relu6_to_relu(model):
   for child_name, child in model.named_children():
      if isinstance(child, nn.ReLU6):
            setattr(model, child_name, nn.ReLU())
      else:
            convert_relu6_to_relu(child)
   return model

target="esp32p4"
num_of_bits=8
batch_size=32
quant_setting = QuantizationSettingFactory.espdl_setting() # default setting
# Replace ReLU6 with ReLU. When testing per-channel,
# using ReLU results in higher precision after quantization.
model = convert_relu6_to_relu(model)

量化结果

Analysing Graphwise Quantization Error::
Layer                                            | NOISE:SIGNAL POWER RATIO
/features/features.16/conv/conv.2/Conv:          | ████████████████████ | 28.455%
/features/features.15/conv/conv.2/Conv:          | ██████████████████   | 24.981%
/features/features.17/conv/conv.0/conv.0.0/Conv: | ███████████████      | 21.120%
/features/features.14/conv/conv.2/Conv:          | ██████████████       | 20.162%
/features/features.17/conv/conv.2/Conv:          | █████████████        | 18.303%
/features/features.18/features.18.0/Conv:        | ████████████         | 17.422%
/features/features.13/conv/conv.2/Conv:          | ████████████         | 16.590%
/features/features.16/conv/conv.0/conv.0.0/Conv: | ███████████          | 15.886%
/features/features.16/conv/conv.1/conv.1.0/Conv: | ███████████          | 15.033%
/features/features.12/conv/conv.2/Conv:          | ██████████           | 13.968%
/features/features.15/conv/conv.0/conv.0.0/Conv: | █████████            | 12.973%
/features/features.6/conv/conv.2/Conv:           | █████████            | 12.624%
/features/features.15/conv/conv.1/conv.1.0/Conv: | █████████            | 12.366%
/features/features.10/conv/conv.2/Conv:          | █████████            | 12.207%
/features/features.14/conv/conv.1/conv.1.0/Conv: | ███████              | 10.319%
/features/features.11/conv/conv.2/Conv:          | ███████              | 10.139%
/features/features.5/conv/conv.2/Conv:           | ███████              | 9.430%
/features/features.9/conv/conv.2/Conv:           | ██████               | 9.324%
/features/features.3/conv/conv.2/Conv:           | ██████               | 9.298%
/features/features.14/conv/conv.0/conv.0.0/Conv: | ██████               | 8.819%
/features/features.7/conv/conv.2/Conv:           | ██████               | 8.649%
/features/features.1/conv/conv.1/Conv:           | ██████               | 8.423%
/features/features.4/conv/conv.2/Conv:           | ██████               | 7.972%
/classifier/classifier.1/Gemm:                   | █████                | 7.204%
/features/features.13/conv/conv.1/conv.1.0/Conv: | █████                | 6.975%
/features/features.12/conv/conv.1/conv.1.0/Conv: | █████                | 6.867%
/features/features.13/conv/conv.0/conv.0.0/Conv: | █████                | 6.626%
/features/features.10/conv/conv.1/conv.1.0/Conv: | ████                 | 6.296%
/features/features.7/conv/conv.0/conv.0.0/Conv:  | ████                 | 6.113%
/features/features.8/conv/conv.2/Conv:           | ████                 | 6.068%
/features/features.6/conv/conv.1/conv.1.0/Conv:  | ████                 | 6.044%
/features/features.12/conv/conv.0/conv.0.0/Conv: | ████                 | 5.839%
/features/features.11/conv/conv.0/conv.0.0/Conv: | ████                 | 5.814%
/features/features.11/conv/conv.1/conv.1.0/Conv: | ████                 | 5.790%
/features/features.8/conv/conv.1/conv.1.0/Conv:  | ████                 | 5.580%
/features/features.9/conv/conv.1/conv.1.0/Conv:  | ████                 | 5.575%
/features/features.5/conv/conv.1/conv.1.0/Conv:  | ████                 | 5.476%
/features/features.10/conv/conv.0/conv.0.0/Conv: | ████                 | 5.182%
/features/features.3/conv/conv.1/conv.1.0/Conv:  | ████                 | 5.157%
/features/features.2/conv/conv.2/Conv:           | ████                 | 5.115%
/features/features.4/conv/conv.0/conv.0.0/Conv:  | ███                  | 5.003%
/features/features.2/conv/conv.0/conv.0.0/Conv:  | ███                  | 4.470%
/features/features.17/conv/conv.1/conv.1.0/Conv: | ███                  | 4.412%
/features/features.6/conv/conv.0/conv.0.0/Conv:  | ███                  | 4.133%
/features/features.9/conv/conv.0/conv.0.0/Conv:  | ███                  | 4.012%
/features/features.4/conv/conv.1/conv.1.0/Conv:  | ██                   | 3.524%
/features/features.2/conv/conv.1/conv.1.0/Conv:  | ██                   | 3.370%
/features/features.8/conv/conv.0/conv.0.0/Conv:  | ██                   | 3.004%
/features/features.7/conv/conv.1/conv.1.0/Conv:  | ██                   | 2.680%
/features/features.5/conv/conv.0/conv.0.0/Conv:  | ██                   | 2.617%
/features/features.3/conv/conv.0/conv.0.0/Conv:  | █                    | 1.962%
/features/features.1/conv/conv.0/conv.0.0/Conv:  |                      | 0.477%
/features/features.0/features.0.0/Conv:          |                      | 0.114%
Analysing Layerwise quantization error:: 100%|██████████████████████████| 53/53 [09:33<00:00, 10.81s/it]
Layer                                            | NOISE:SIGNAL POWER RATIO
/features/features.0/features.0.0/Conv:          | ████████████████████ | 0.879%
/features/features.1/conv/conv.0/conv.0.0/Conv:  | ████████████         | 0.526%
/features/features.16/conv/conv.2/Conv:          | █████                | 0.215%
/features/features.1/conv/conv.1/Conv:           | ████                 | 0.165%
/features/features.15/conv/conv.2/Conv:          | ███                  | 0.127%
/features/features.14/conv/conv.2/Conv:          | ██                   | 0.110%
/classifier/classifier.1/Gemm:                   | █                    | 0.061%
/features/features.4/conv/conv.2/Conv:           | █                    | 0.055%
/features/features.3/conv/conv.2/Conv:           | █                    | 0.048%
/features/features.3/conv/conv.1/conv.1.0/Conv:  | █                    | 0.043%
/features/features.11/conv/conv.2/Conv:          | █                    | 0.039%
/features/features.17/conv/conv.2/Conv:          | █                    | 0.037%
/features/features.2/conv/conv.2/Conv:           | █                    | 0.035%
/features/features.7/conv/conv.2/Conv:           | █                    | 0.034%
/features/features.2/conv/conv.1/conv.1.0/Conv:  | █                    | 0.033%
/features/features.13/conv/conv.2/Conv:          | █                    | 0.027%
/features/features.5/conv/conv.1/conv.1.0/Conv:  |                      | 0.020%
/features/features.11/conv/conv.1/conv.1.0/Conv: |                      | 0.017%
/features/features.12/conv/conv.2/Conv:          |                      | 0.015%
/features/features.5/conv/conv.2/Conv:           |                      | 0.013%
/features/features.6/conv/conv.2/Conv:           |                      | 0.012%
/features/features.8/conv/conv.2/Conv:           |                      | 0.012%
/features/features.10/conv/conv.2/Conv:          |                      | 0.011%
/features/features.17/conv/conv.0/conv.0.0/Conv: |                      | 0.011%
/features/features.9/conv/conv.2/Conv:           |                      | 0.010%
/features/features.8/conv/conv.1/conv.1.0/Conv:  |                      | 0.007%
/features/features.4/conv/conv.0/conv.0.0/Conv:  |                      | 0.007%
/features/features.9/conv/conv.1/conv.1.0/Conv:  |                      | 0.006%
/features/features.16/conv/conv.1/conv.1.0/Conv: |                      | 0.006%
/features/features.6/conv/conv.1/conv.1.0/Conv:  |                      | 0.006%
/features/features.15/conv/conv.1/conv.1.0/Conv: |                      | 0.006%
/features/features.14/conv/conv.0/conv.0.0/Conv: |                      | 0.005%
/features/features.7/conv/conv.0/conv.0.0/Conv:  |                      | 0.005%
/features/features.2/conv/conv.0/conv.0.0/Conv:  |                      | 0.005%
/features/features.16/conv/conv.0/conv.0.0/Conv: |                      | 0.004%
/features/features.12/conv/conv.1/conv.1.0/Conv: |                      | 0.004%
/features/features.4/conv/conv.1/conv.1.0/Conv:  |                      | 0.004%
/features/features.11/conv/conv.0/conv.0.0/Conv: |                      | 0.003%
/features/features.10/conv/conv.1/conv.1.0/Conv: |                      | 0.003%
/features/features.13/conv/conv.1/conv.1.0/Conv: |                      | 0.003%
/features/features.15/conv/conv.0/conv.0.0/Conv: |                      | 0.003%
/features/features.3/conv/conv.0/conv.0.0/Conv:  |                      | 0.002%
/features/features.13/conv/conv.0/conv.0.0/Conv: |                      | 0.002%
/features/features.12/conv/conv.0/conv.0.0/Conv: |                      | 0.002%
/features/features.7/conv/conv.1/conv.1.0/Conv:  |                      | 0.002%
/features/features.18/features.18.0/Conv:        |                      | 0.002%
/features/features.5/conv/conv.0/conv.0.0/Conv:  |                      | 0.001%
/features/features.14/conv/conv.1/conv.1.0/Conv: |                      | 0.001%
/features/features.9/conv/conv.0/conv.0.0/Conv:  |                      | 0.001%
/features/features.8/conv/conv.0/conv.0.0/Conv:  |                      | 0.001%
/features/features.10/conv/conv.0/conv.0.0/Conv: |                      | 0.001%
/features/features.6/conv/conv.0/conv.0.0/Conv:  |                      | 0.001%
/features/features.17/conv/conv.1/conv.1.0/Conv: |                      | 0.000%

* Prec@1 71.150 Prec@5 89.350

ESP32S3 量化

量化设置

target="esp32s3"
num_of_bits=8
batch_size=32
quant_setting = QuantizationSettingFactory.espdl_setting() # default setting

量化结果

Analysing Graphwise Quantization Error::
Layer                                            | NOISE:SIGNAL POWER RATIO
/features/features.16/conv/conv.2/Conv:          | ████████████████████ | 49.069%
/features/features.17/conv/conv.2/Conv:          | ███████████████████  | 45.605%
/features/features.15/conv/conv.2/Conv:          | ███████████████████  | 45.446%
/features/features.18/features.18.0/Conv:        | ██████████████████   | 43.709%
/features/features.14/conv/conv.2/Conv:          | █████████████████    | 41.199%
/features/features.13/conv/conv.2/Conv:          | ██████████████       | 35.330%
/features/features.17/conv/conv.0/conv.0.0/Conv: | █████████████        | 33.151%
/features/features.16/conv/conv.1/conv.1.0/Conv: | ████████████         | 29.433%
/features/features.12/conv/conv.2/Conv:          | ████████████         | 29.049%
/features/features.16/conv/conv.0/conv.0.0/Conv: | ███████████          | 27.952%
/features/features.7/conv/conv.2/Conv:           | ███████████          | 27.420%
/classifier/classifier.1/Gemm:                   | ███████████          | 27.097%
/features/features.11/conv/conv.2/Conv:          | ███████████          | 26.299%
/features/features.10/conv/conv.2/Conv:          | ███████████          | 26.026%
/features/features.15/conv/conv.0/conv.0.0/Conv: | ██████████           | 25.428%
/features/features.6/conv/conv.2/Conv:           | ██████████           | 25.363%
/features/features.4/conv/conv.2/Conv:           | ██████████           | 24.751%
/features/features.15/conv/conv.1/conv.1.0/Conv: | ██████████           | 24.485%
/features/features.14/conv/conv.1/conv.1.0/Conv: | ████████             | 20.296%
/features/features.9/conv/conv.2/Conv:           | ████████             | 19.854%
/features/features.14/conv/conv.0/conv.0.0/Conv: | ████████             | 18.552%
/features/features.5/conv/conv.2/Conv:           | ███████              | 17.704%
/features/features.12/conv/conv.1/conv.1.0/Conv: | ███████              | 16.861%
/features/features.13/conv/conv.1/conv.1.0/Conv: | ███████              | 16.398%
/features/features.11/conv/conv.1/conv.1.0/Conv: | ██████               | 15.579%
/features/features.2/conv/conv.2/Conv:           | ██████               | 15.369%
/features/features.13/conv/conv.0/conv.0.0/Conv: | ██████               | 15.193%
/features/features.3/conv/conv.2/Conv:           | ██████               | 14.844%
/features/features.10/conv/conv.1/conv.1.0/Conv: | ██████               | 14.811%
/features/features.11/conv/conv.0/conv.0.0/Conv: | ██████               | 14.660%
/features/features.9/conv/conv.1/conv.1.0/Conv:  | ██████               | 13.995%
/features/features.12/conv/conv.0/conv.0.0/Conv: | ██████               | 13.825%
/features/features.8/conv/conv.1/conv.1.0/Conv:  | ██████               | 13.750%
/features/features.8/conv/conv.2/Conv:           | █████                | 13.557%
/features/features.7/conv/conv.0/conv.0.0/Conv:  | █████                | 12.814%
/features/features.6/conv/conv.1/conv.1.0/Conv:  | █████                | 12.610%
/features/features.10/conv/conv.0/conv.0.0/Conv: | █████                | 12.173%
/features/features.17/conv/conv.1/conv.1.0/Conv: | █████                | 11.607%
/features/features.5/conv/conv.1/conv.1.0/Conv:  | █████                | 11.136%
/features/features.9/conv/conv.0/conv.0.0/Conv:  | ████                 | 10.368%
/features/features.4/conv/conv.1/conv.1.0/Conv:  | ████                 | 10.333%
/features/features.6/conv/conv.0/conv.0.0/Conv:  | ████                 | 10.038%
/features/features.4/conv/conv.0/conv.0.0/Conv:  | ████                 | 9.632%
/features/features.3/conv/conv.1/conv.1.0/Conv:  | ████                 | 9.282%
/features/features.1/conv/conv.1/Conv:           | ████                 | 8.970%
/features/features.8/conv/conv.0/conv.0.0/Conv:  | ████                 | 8.947%
/features/features.5/conv/conv.0/conv.0.0/Conv:  | ███                  | 8.389%
/features/features.7/conv/conv.1/conv.1.0/Conv:  | ███                  | 8.067%
/features/features.2/conv/conv.1/conv.1.0/Conv:  | ███                  | 7.462%
/features/features.3/conv/conv.0/conv.0.0/Conv:  | ███                  | 6.513%
/features/features.2/conv/conv.0/conv.0.0/Conv:  | ██                   | 5.537%
/features/features.1/conv/conv.0/conv.0.0/Conv:  |                      | 0.875%
/features/features.0/features.0.0/Conv:          |                      | 0.119%
Analysing Layerwise quantization error:: 100%|██████████████████████████| 53/53 [34:02<00:00, 38.53s/it]
Layer                                            | NOISE:SIGNAL POWER RATIO
/features/features.1/conv/conv.0/conv.0.0/Conv:  | ████████████████████ | 14.306%
/features/features.0/features.0.0/Conv:          | █                    | 0.843%
/features/features.1/conv/conv.1/Conv:           | █                    | 0.667%
/features/features.2/conv/conv.1/conv.1.0/Conv:  | █                    | 0.574%
/features/features.3/conv/conv.1/conv.1.0/Conv:  | █                    | 0.425%
/features/features.15/conv/conv.1/conv.1.0/Conv: |                      | 0.271%
/features/features.9/conv/conv.1/conv.1.0/Conv:  |                      | 0.237%
/features/features.17/conv/conv.1/conv.1.0/Conv: |                      | 0.214%
/features/features.4/conv/conv.1/conv.1.0/Conv:  |                      | 0.180%
/features/features.11/conv/conv.1/conv.1.0/Conv: |                      | 0.151%
/features/features.12/conv/conv.1/conv.1.0/Conv: |                      | 0.148%
/features/features.16/conv/conv.1/conv.1.0/Conv: |                      | 0.146%
/features/features.14/conv/conv.2/Conv:          |                      | 0.136%
/features/features.13/conv/conv.1/conv.1.0/Conv: |                      | 0.105%
/features/features.6/conv/conv.1/conv.1.0/Conv:  |                      | 0.104%
/features/features.8/conv/conv.1/conv.1.0/Conv:  |                      | 0.083%
/features/features.7/conv/conv.2/Conv:           |                      | 0.076%
/features/features.5/conv/conv.1/conv.1.0/Conv:  |                      | 0.076%
/features/features.3/conv/conv.2/Conv:           |                      | 0.075%
/features/features.16/conv/conv.2/Conv:          |                      | 0.073%
/features/features.13/conv/conv.0/conv.0.0/Conv: |                      | 0.072%
/features/features.15/conv/conv.2/Conv:          |                      | 0.066%
/features/features.4/conv/conv.2/Conv:           |                      | 0.064%
/features/features.11/conv/conv.2/Conv:          |                      | 0.063%
/classifier/classifier.1/Gemm:                   |                      | 0.063%
/features/features.2/conv/conv.0/conv.0.0/Conv:  |                      | 0.054%
/features/features.13/conv/conv.2/Conv:          |                      | 0.050%
/features/features.10/conv/conv.1/conv.1.0/Conv: |                      | 0.042%
/features/features.17/conv/conv.0/conv.0.0/Conv: |                      | 0.040%
/features/features.2/conv/conv.2/Conv:           |                      | 0.039%
/features/features.4/conv/conv.0/conv.0.0/Conv:  |                      | 0.034%
/features/features.17/conv/conv.2/Conv:          |                      | 0.030%
/features/features.14/conv/conv.0/conv.0.0/Conv: |                      | 0.025%
/features/features.16/conv/conv.0/conv.0.0/Conv: |                      | 0.024%
/features/features.10/conv/conv.2/Conv:          |                      | 0.022%
/features/features.11/conv/conv.0/conv.0.0/Conv: |                      | 0.021%
/features/features.9/conv/conv.2/Conv:           |                      | 0.021%
/features/features.14/conv/conv.1/conv.1.0/Conv: |                      | 0.020%
/features/features.7/conv/conv.1/conv.1.0/Conv:  |                      | 0.020%
/features/features.5/conv/conv.2/Conv:           |                      | 0.019%
/features/features.8/conv/conv.2/Conv:           |                      | 0.018%
/features/features.12/conv/conv.2/Conv:          |                      | 0.017%
/features/features.6/conv/conv.2/Conv:           |                      | 0.014%
/features/features.7/conv/conv.0/conv.0.0/Conv:  |                      | 0.014%
/features/features.3/conv/conv.0/conv.0.0/Conv:  |                      | 0.013%
/features/features.12/conv/conv.0/conv.0.0/Conv: |                      | 0.009%
/features/features.15/conv/conv.0/conv.0.0/Conv: |                      | 0.008%
/features/features.5/conv/conv.0/conv.0.0/Conv:  |                      | 0.006%
/features/features.6/conv/conv.0/conv.0.0/Conv:  |                      | 0.005%
/features/features.9/conv/conv.0/conv.0.0/Conv:  |                      | 0.003%
/features/features.18/features.18.0/Conv:        |                      | 0.002%
/features/features.10/conv/conv.0/conv.0.0/Conv: |                      | 0.002%
/features/features.8/conv/conv.0/conv.0.0/Conv:  |                      | 0.002%

* Prec@1 60.325 Prec@5 83.100

量化误差分析

实验结果表明:在 ESP32P4 上采用 per-channel 量化时,量化模型 Prec@1 为 71.150%,与浮点模型(71.878%)接近;而在 ESP32S3 上采用 per-tensor 量化时,Prec@1 仅为 60.5%,相对同一浮点基准差距明显,精度损失较大,有必要结合其他量化手段进一步改进。以下从量化误差角度对 ESP32S3 作简要分析:

  • 累计误差 (Graphwise Error)

    该模型的最后一层为 /classifier/classifier.1/Gemm,该层的累计误差为 27.097%。经验来说最后一层的累计误差小于 10%,量化模型的精度损失较小。

  • 逐层误差 (Layerwise error)

    观察 Layerwise error,发现大部分层的误差都在 1% 以下,说明大部分层的量化误差较小,只有少数几层误差较大,我们可以选择将误差较大的层使用 int16 进行量化。具体请看混合精度量化。

混合精度量化

量化设置

from esp_ppq.api import get_target_platform
target="esp32s3"
num_of_bits=8
batch_size=32

# 以下层使用int16进行量化
quant_setting = QuantizationSettingFactory.espdl_setting()
quant_setting.dispatching_table.append("/features/features.1/conv/conv.0/conv.0.0/Conv", get_target_platform(TARGET, 16))
quant_setting.dispatching_table.append("/features/features.1/conv/conv.0/conv.0.2/Clip", get_target_platform(TARGET, 16))

量化结果

Analysing Graphwise Quantization Error::
Layer                                            | NOISE:SIGNAL POWER RATIO
/features/features.16/conv/conv.2/Conv:          | ████████████████████ | 31.995%
/features/features.15/conv/conv.2/Conv:          | ██████████████████   | 29.554%
/features/features.17/conv/conv.0/conv.0.0/Conv: | ████████████████     | 25.400%
/features/features.14/conv/conv.2/Conv:          | ████████████████     | 25.125%
/features/features.17/conv/conv.2/Conv:          | █████████████        | 21.358%
/features/features.18/features.18.0/Conv:        | █████████████        | 20.177%
/features/features.13/conv/conv.2/Conv:          | ████████████         | 19.204%
/features/features.16/conv/conv.0/conv.0.0/Conv: | ████████████         | 18.988%
/features/features.16/conv/conv.1/conv.1.0/Conv: | ████████████         | 18.846%
/features/features.15/conv/conv.0/conv.0.0/Conv: | ██████████           | 15.831%
/features/features.15/conv/conv.1/conv.1.0/Conv: | █████████            | 14.938%
/features/features.12/conv/conv.2/Conv:          | █████████            | 14.918%
/features/features.14/conv/conv.1/conv.1.0/Conv: | █████████            | 13.865%
/features/features.6/conv/conv.2/Conv:           | ████████             | 12.909%
/features/features.10/conv/conv.2/Conv:          | ███████              | 11.843%
/features/features.14/conv/conv.0/conv.0.0/Conv: | ███████              | 10.648%
/features/features.11/conv/conv.2/Conv:          | ██████               | 10.391%
/classifier/classifier.1/Gemm:                   | ██████               | 10.289%
/features/features.9/conv/conv.2/Conv:           | ██████               | 9.940%
/features/features.5/conv/conv.2/Conv:           | ██████               | 8.902%
/features/features.7/conv/conv.2/Conv:           | █████                | 8.745%
/features/features.3/conv/conv.2/Conv:           | █████                | 8.614%
/features/features.4/conv/conv.2/Conv:           | █████                | 7.645%
/features/features.13/conv/conv.1/conv.1.0/Conv: | █████                | 7.501%
/features/features.12/conv/conv.1/conv.1.0/Conv: | █████                | 7.428%
/features/features.13/conv/conv.0/conv.0.0/Conv: | ████                 | 6.915%
/features/features.8/conv/conv.2/Conv:           | ████                 | 6.488%
/features/features.10/conv/conv.1/conv.1.0/Conv: | ████                 | 6.148%
/features/features.11/conv/conv.1/conv.1.0/Conv: | ████                 | 6.042%
/features/features.8/conv/conv.1/conv.1.0/Conv:  | ████                 | 5.955%
/features/features.9/conv/conv.1/conv.1.0/Conv:  | ████                 | 5.904%
/features/features.12/conv/conv.0/conv.0.0/Conv: | ████                 | 5.894%
/features/features.7/conv/conv.0/conv.0.0/Conv:  | ████                 | 5.847%
/features/features.11/conv/conv.0/conv.0.0/Conv: | ████                 | 5.793%
/features/features.6/conv/conv.1/conv.1.0/Conv:  | ████                 | 5.737%
/features/features.17/conv/conv.1/conv.1.0/Conv: | ███                  | 5.293%
/features/features.5/conv/conv.1/conv.1.0/Conv:  | ███                  | 5.022%
/features/features.10/conv/conv.0/conv.0.0/Conv: | ███                  | 5.004%
/features/features.2/conv/conv.2/Conv:           | ███                  | 4.670%
/features/features.3/conv/conv.1/conv.1.0/Conv:  | ███                  | 4.662%
/features/features.4/conv/conv.0/conv.0.0/Conv:  | ███                  | 4.643%
/features/features.1/conv/conv.1/Conv:           | ███                  | 4.320%
/features/features.9/conv/conv.0/conv.0.0/Conv:  | ██                   | 3.878%
/features/features.6/conv/conv.0/conv.0.0/Conv:  | ██                   | 3.740%
/features/features.4/conv/conv.1/conv.1.0/Conv:  | ██                   | 3.420%
/features/features.8/conv/conv.0/conv.0.0/Conv:  | ██                   | 3.306%
/features/features.7/conv/conv.1/conv.1.0/Conv:  | ██                   | 2.734%
/features/features.2/conv/conv.1/conv.1.0/Conv:  | ██                   | 2.639%
/features/features.2/conv/conv.0/conv.0.0/Conv:  | ██                   | 2.603%
/features/features.5/conv/conv.0/conv.0.0/Conv:  | █                    | 2.404%
/features/features.3/conv/conv.0/conv.0.0/Conv:  | █                    | 1.765%
/features/features.1/conv/conv.0/conv.0.0/Conv:  |                      | 0.433%
/features/features.0/features.0.0/Conv:          |                      | 0.119%
Analysing Layerwise quantization error:: 100%|██████████████████████████| 53/53 [09:29<00:00, 10.74s/it]
Layer                                            | NOISE:SIGNAL POWER RATIO
/features/features.1/conv/conv.1/Conv:           | ████████████████████ | 1.099%
/features/features.0/features.0.0/Conv:          | ███████████████      | 0.843%
/features/features.2/conv/conv.1/conv.1.0/Conv:  | ██████████           | 0.574%
/features/features.3/conv/conv.1/conv.1.0/Conv:  | ████████             | 0.425%
/features/features.15/conv/conv.1/conv.1.0/Conv: | █████                | 0.271%
/features/features.9/conv/conv.1/conv.1.0/Conv:  | ████                 | 0.237%
/features/features.17/conv/conv.1/conv.1.0/Conv: | ████                 | 0.214%
/features/features.4/conv/conv.1/conv.1.0/Conv:  | ███                  | 0.180%
/features/features.11/conv/conv.1/conv.1.0/Conv: | ███                  | 0.151%
/features/features.12/conv/conv.1/conv.1.0/Conv: | ███                  | 0.148%
/features/features.16/conv/conv.1/conv.1.0/Conv: | ███                  | 0.146%
/features/features.14/conv/conv.2/Conv:          | ██                   | 0.136%
/features/features.13/conv/conv.1/conv.1.0/Conv: | ██                   | 0.105%
/features/features.6/conv/conv.1/conv.1.0/Conv:  | ██                   | 0.104%
/features/features.8/conv/conv.1/conv.1.0/Conv:  | █                    | 0.083%
/features/features.5/conv/conv.1/conv.1.0/Conv:  | █                    | 0.076%
/features/features.3/conv/conv.2/Conv:           | █                    | 0.075%
/features/features.16/conv/conv.2/Conv:          | █                    | 0.073%
/features/features.13/conv/conv.0/conv.0.0/Conv: | █                    | 0.072%
/features/features.7/conv/conv.2/Conv:           | █                    | 0.071%
/features/features.15/conv/conv.2/Conv:          | █                    | 0.066%
/features/features.4/conv/conv.2/Conv:           | █                    | 0.064%
/features/features.11/conv/conv.2/Conv:          | █                    | 0.063%
/classifier/classifier.1/Gemm:                   | █                    | 0.063%
/features/features.2/conv/conv.0/conv.0.0/Conv:  | █                    | 0.054%
/features/features.13/conv/conv.2/Conv:          | █                    | 0.050%
/features/features.10/conv/conv.1/conv.1.0/Conv: | █                    | 0.042%
/features/features.17/conv/conv.0/conv.0.0/Conv: | █                    | 0.040%
/features/features.2/conv/conv.2/Conv:           | █                    | 0.039%
/features/features.4/conv/conv.0/conv.0.0/Conv:  | █                    | 0.034%
/features/features.17/conv/conv.2/Conv:          | █                    | 0.030%
/features/features.14/conv/conv.0/conv.0.0/Conv: |                      | 0.025%
/features/features.16/conv/conv.0/conv.0.0/Conv: |                      | 0.024%
/features/features.10/conv/conv.2/Conv:          |                      | 0.022%
/features/features.11/conv/conv.0/conv.0.0/Conv: |                      | 0.021%
/features/features.9/conv/conv.2/Conv:           |                      | 0.021%
/features/features.14/conv/conv.1/conv.1.0/Conv: |                      | 0.020%
/features/features.7/conv/conv.1/conv.1.0/Conv:  |                      | 0.020%
/features/features.5/conv/conv.2/Conv:           |                      | 0.019%
/features/features.1/conv/conv.0/conv.0.0/Conv:  |                      | 0.017%
/features/features.12/conv/conv.2/Conv:          |                      | 0.017%
/features/features.6/conv/conv.2/Conv:           |                      | 0.014%
/features/features.7/conv/conv.0/conv.0.0/Conv:  |                      | 0.014%
/features/features.3/conv/conv.0/conv.0.0/Conv:  |                      | 0.013%
/features/features.8/conv/conv.2/Conv:           |                      | 0.012%
/features/features.12/conv/conv.0/conv.0.0/Conv: |                      | 0.009%
/features/features.15/conv/conv.0/conv.0.0/Conv: |                      | 0.008%
/features/features.5/conv/conv.0/conv.0.0/Conv:  |                      | 0.006%
/features/features.6/conv/conv.0/conv.0.0/Conv:  |                      | 0.005%
/features/features.9/conv/conv.0/conv.0.0/Conv:  |                      | 0.003%
/features/features.18/features.18.0/Conv:        |                      | 0.002%
/features/features.10/conv/conv.0/conv.0.0/Conv: |                      | 0.002%
/features/features.8/conv/conv.0/conv.0.0/Conv:  |                      | 0.002%

* Prec@1 69.225 Prec@5 88.700

量化误差分析

将之前误差最大的层替换为 16 位量化后,可以观察到模型准确度明显提升,量化后的 top1 准确率为 69.225%,和 float 模型的准确率 (71.878%) 比较接近。该模型的最后一层 /classifier/classifier.1/Gemm 的累计误差为 10.289%。

层间均衡量化

该方法在论文 Data-Free Quantization Through Weight Equalization and Bias Correction 中提出。使用此方法时,需要将 MobilenetV2 模型中原来的 ReLU6 替换为 ReLU。

量化设置

import torch.nn as nn

target="esp32s3"
num_of_bits=8
batch_size=32

def convert_relu6_to_relu(model):
   for child_name, child in model.named_children():
      if isinstance(child, nn.ReLU6):
            setattr(model, child_name, nn.ReLU())
      else:
            convert_relu6_to_relu(child)
   return model

# Replace ReLU6 with ReLU
model = convert_relu6_to_relu(model)
# Use layerwise equalization
quant_setting = QuantizationSettingFactory.espdl_setting()
quant_setting.equalization = True
quant_setting.equalization_setting.iterations = 6
quant_setting.equalization_setting.value_threshold = 0.5
quant_setting.equalization_setting.opt_level = 2
quant_setting.equalization_setting.interested_layers = None

量化结果

Analysing Graphwise Quantization Error
Layer                                            | NOISE:SIGNAL POWER RATIO
/features/features.16/conv/conv.2/Conv:          | ████████████████████ | 34.197%
/features/features.15/conv/conv.2/Conv:          | ██████████████████   | 30.936%
/features/features.14/conv/conv.2/Conv:          | ████████████████     | 27.411%
/features/features.17/conv/conv.0/conv.0.0/Conv: | ████████████████     | 27.235%
/features/features.16/conv/conv.0/conv.0.0/Conv: | ████████████         | 21.350%
/features/features.17/conv/conv.2/Conv:          | ████████████         | 20.880%
/features/features.18/features.18.0/Conv:        | ████████████         | 19.900%
/features/features.16/conv/conv.1/conv.1.0/Conv: | ███████████          | 19.559%
/features/features.13/conv/conv.2/Conv:          | ███████████          | 19.325%
/features/features.15/conv/conv.0/conv.0.0/Conv: | ██████████           | 17.006%
/features/features.15/conv/conv.1/conv.1.0/Conv: | █████████            | 15.475%
/features/features.12/conv/conv.2/Conv:          | █████████            | 14.920%
/features/features.14/conv/conv.1/conv.1.0/Conv: | ████████             | 13.397%
/features/features.10/conv/conv.2/Conv:          | ███████              | 12.634%
/features/features.6/conv/conv.2/Conv:           | ███████              | 11.711%
/classifier/classifier.1/Gemm:                   | ██████               | 10.808%
/features/features.11/conv/conv.2/Conv:          | ██████               | 10.234%
/features/features.14/conv/conv.0/conv.0.0/Conv: | ██████               | 10.109%
/features/features.9/conv/conv.2/Conv:           | ██████               | 9.563%
/features/features.3/conv/conv.2/Conv:           | ██████               | 9.448%
/features/features.5/conv/conv.2/Conv:           | █████                | 8.716%
/features/features.7/conv/conv.2/Conv:           | █████                | 8.040%
/features/features.4/conv/conv.2/Conv:           | ████                 | 7.647%
/features/features.12/conv/conv.1/conv.1.0/Conv: | ████                 | 7.205%
/features/features.13/conv/conv.1/conv.1.0/Conv: | ████                 | 7.021%
/features/features.13/conv/conv.0/conv.0.0/Conv: | ████                 | 6.244%
/features/features.8/conv/conv.2/Conv:           | ████                 | 6.205%
/features/features.1/conv/conv.1/Conv:           | ████                 | 6.036%
/features/features.10/conv/conv.1/conv.1.0/Conv: | ███                  | 5.824%
/features/features.9/conv/conv.1/conv.1.0/Conv:  | ███                  | 5.452%
/features/features.11/conv/conv.1/conv.1.0/Conv: | ███                  | 5.408%
/features/features.17/conv/conv.1/conv.1.0/Conv: | ███                  | 5.324%
/features/features.8/conv/conv.1/conv.1.0/Conv:  | ███                  | 5.187%
/features/features.12/conv/conv.0/conv.0.0/Conv: | ███                  | 4.646%
/features/features.2/conv/conv.2/Conv:           | ███                  | 4.576%
/features/features.6/conv/conv.1/conv.1.0/Conv:  | ███                  | 4.493%
/features/features.5/conv/conv.1/conv.1.0/Conv:  | ███                  | 4.364%
/features/features.10/conv/conv.0/conv.0.0/Conv: | ███                  | 4.305%
/features/features.3/conv/conv.1/conv.1.0/Conv:  | ██                   | 4.160%
/features/features.11/conv/conv.0/conv.0.0/Conv: | ██                   | 4.031%
/features/features.7/conv/conv.0/conv.0.0/Conv:  | ██                   | 3.667%
/features/features.4/conv/conv.1/conv.1.0/Conv:  | ██                   | 2.905%
/features/features.4/conv/conv.0/conv.0.0/Conv:  | ██                   | 2.730%
/features/features.9/conv/conv.0/conv.0.0/Conv:  | █                    | 2.202%
/features/features.7/conv/conv.1/conv.1.0/Conv:  | █                    | 2.170%
/features/features.8/conv/conv.0/conv.0.0/Conv:  | █                    | 2.150%
/features/features.6/conv/conv.0/conv.0.0/Conv:  | █                    | 2.117%
/features/features.2/conv/conv.1/conv.1.0/Conv:  | █                    | 2.101%
/features/features.5/conv/conv.0/conv.0.0/Conv:  | █                    | 1.506%
/features/features.2/conv/conv.0/conv.0.0/Conv:  | █                    | 1.238%
/features/features.3/conv/conv.0/conv.0.0/Conv:  | █                    | 0.965%
/features/features.1/conv/conv.0/conv.0.0/Conv:  |                      | 0.357%
/features/features.0/features.0.0/Conv:          |                      | 0.025%
Analysing Layerwise quantization error:: 100%|██████████████████████████| 53/53 [09:22<00:00, 10.61s/it]
Layer                                            | NOISE:SIGNAL POWER RATIO
/features/features.1/conv/conv.0/conv.0.0/Conv:  | ████████████████████ | 1.770%
/features/features.0/features.0.0/Conv:          | ██████████           | 0.844%
/features/features.16/conv/conv.2/Conv:          | ██                   | 0.180%
/features/features.14/conv/conv.2/Conv:          | ██                   | 0.176%
/features/features.1/conv/conv.1/Conv:           | ██                   | 0.153%
/features/features.15/conv/conv.2/Conv:          | █                    | 0.109%
/features/features.2/conv/conv.2/Conv:           | █                    | 0.101%
/features/features.4/conv/conv.2/Conv:           | █                    | 0.092%
/features/features.3/conv/conv.1/conv.1.0/Conv:  | █                    | 0.081%
/classifier/classifier.1/Gemm:                   | █                    | 0.062%
/features/features.11/conv/conv.1/conv.1.0/Conv: | █                    | 0.061%
/features/features.12/conv/conv.2/Conv:          | █                    | 0.050%
/features/features.13/conv/conv.2/Conv:          | █                    | 0.048%
/features/features.17/conv/conv.2/Conv:          |                      | 0.043%
/features/features.7/conv/conv.2/Conv:           |                      | 0.041%
/features/features.8/conv/conv.1/conv.1.0/Conv:  |                      | 0.038%
/features/features.5/conv/conv.1/conv.1.0/Conv:  |                      | 0.035%
/features/features.11/conv/conv.2/Conv:          |                      | 0.033%
/features/features.6/conv/conv.2/Conv:           |                      | 0.032%
/features/features.2/conv/conv.1/conv.1.0/Conv:  |                      | 0.030%
/features/features.3/conv/conv.2/Conv:           |                      | 0.029%
/features/features.5/conv/conv.2/Conv:           |                      | 0.028%
/features/features.6/conv/conv.1/conv.1.0/Conv:  |                      | 0.026%
/features/features.4/conv/conv.0/conv.0.0/Conv:  |                      | 0.026%
/features/features.15/conv/conv.1/conv.1.0/Conv: |                      | 0.025%
/features/features.10/conv/conv.2/Conv:          |                      | 0.022%
/features/features.14/conv/conv.0/conv.0.0/Conv: |                      | 0.020%
/features/features.16/conv/conv.1/conv.1.0/Conv: |                      | 0.019%
/features/features.4/conv/conv.1/conv.1.0/Conv:  |                      | 0.018%
/features/features.13/conv/conv.1/conv.1.0/Conv: |                      | 0.014%
/features/features.13/conv/conv.0/conv.0.0/Conv: |                      | 0.014%
/features/features.16/conv/conv.0/conv.0.0/Conv: |                      | 0.012%
/features/features.17/conv/conv.0/conv.0.0/Conv: |                      | 0.012%
/features/features.12/conv/conv.0/conv.0.0/Conv: |                      | 0.011%
/features/features.12/conv/conv.1/conv.1.0/Conv: |                      | 0.011%
/features/features.9/conv/conv.2/Conv:           |                      | 0.009%
/features/features.8/conv/conv.2/Conv:           |                      | 0.009%
/features/features.2/conv/conv.0/conv.0.0/Conv:  |                      | 0.008%
/features/features.7/conv/conv.0/conv.0.0/Conv:  |                      | 0.007%
/features/features.10/conv/conv.1/conv.1.0/Conv: |                      | 0.006%
/features/features.10/conv/conv.0/conv.0.0/Conv: |                      | 0.006%
/features/features.15/conv/conv.0/conv.0.0/Conv: |                      | 0.006%
/features/features.3/conv/conv.0/conv.0.0/Conv:  |                      | 0.004%
/features/features.6/conv/conv.0/conv.0.0/Conv:  |                      | 0.004%
/features/features.11/conv/conv.0/conv.0.0/Conv: |                      | 0.003%
/features/features.5/conv/conv.0/conv.0.0/Conv:  |                      | 0.003%
/features/features.9/conv/conv.1/conv.1.0/Conv:  |                      | 0.003%
/features/features.14/conv/conv.1/conv.1.0/Conv: |                      | 0.002%
/features/features.7/conv/conv.1/conv.1.0/Conv:  |                      | 0.002%
/features/features.17/conv/conv.1/conv.1.0/Conv: |                      | 0.002%
/features/features.8/conv/conv.0/conv.0.0/Conv:  |                      | 0.001%
/features/features.9/conv/conv.0/conv.0.0/Conv:  |                      | 0.001%
/features/features.18/features.18.0/Conv:        |                      | 0.001%

* Prec@1 69.800 Prec@5 88.400

量化误差分析

注意到对 8bit 量化应用层间均衡有助于降低量化损失,量化后的top1准确率为69.80%,和float模型的准确率(71.878%)更加接近,比混合精度量化的量化精度更高。

备注

如果想进一步降低量化误差,可以尝试使用 QAT (Auantization Aware Training)。具体方法请参考 PPQ QAT example

模型部署

参考示例

图像分类基类

前处理

ImagePreprocessor 类中封装了常用的图像前处理流程,包括 color conversion, crop, resize, normalization, quantize

后处理