动态离线量化完整示例

    动态离线量化方法简单易用,不需要校准数据,主要用于减小模型体积,无法明显提升预测速度。更多模型量化的介绍,请参考量化训练文档,,静态离线量化文档

    参考,下载或者编译opt工具,其中可执行文件opt和python版本opt都提供了动态图离线量化功能。

    此处使用可执行文件opt工具。我们可以从release界面下载PaddleLite 2.8版本及其以后版本的opt工具。如果本机是linux操作系统,下载opt_linux文件,如果本机是mac操作系统,下载opt_mac。

    下载并解压。

    使用opt工具,产出优化后的非量化mobilenetv1模型。

    1. --model_dir=mobilenet_v1 \
    2. --optimize_out_type=naive_buffer \
    3. --optimize_out=mobilenet_v1_opt \
    4. --valid_targets=arm

    使用opt工具,开启动态离线量化,设置量化为16比特,产出优化后的mobilenetv1量化模型。

    1. ./opt \
    2. --model_dir=mobilenet_v1 \
    3. --optimize_out_type=naive_buffer \
    4. --optimize_out=mobilenet_v1_int16_opt \
    5. --quant_model=true \
    6. --quant_type=QUANT_INT16

    使用opt工具,开启动态离线量化,设置量化为8比特,产出优化后的mobilenetv1量化模型。

    1. ./opt \
    2. --model_dir=mobilenet_v1 \
    3. --optimize_out_type=naive_buffer \
    4. --valid_targets=arm \
    5. --quant_model=true \
    6. --quant_type=QUANT_INT8
    • mobilenet_v1_opt.nb文件是17M

    • mobilenet_v1_int16_opt.nb文件是8.3M

    • mobilenet_v1_int8_opt.nb文件是4.3M

    2 部署量化模型

    因为需要执行示例,所以需要准备一台armv7或armv8架构的安卓手机。

    在Paddle-Lite根目录,执行编译命令。

    在Paddle-Lite根目录,进入示例文件。

    1. cd build.lite.android.armv8.gcc/inference_lite_lib.android.armv8/demo/cxx/quant_post_dynamic

    执行prepare.sh脚本,会编译可执行文件,同时将测试文件、预测库、测试脚本存放到quant_post_dynamic_demo文件夹。

    1. sh prepare.sh

    手机USB连接电脑,打开设置 -> 开发者模式 -> USB调试 -> 允许(授权)当前电脑调试手机。保证当前电脑已经安装,运行以下命令,确认当前手机设备已被识别:

    1. adb devices
    2. # 如果手机设备已经被正确识别,将输出类似信息
    3. 017QXM19C1000664 device

    (2) 预测部署

    quant_post_dynamic_demo文件夹push到手机端。

    将优化好的模型push到手机端quant_post_dynamic_demo文件夹。

    1. adb push mobilenet_v1_int16_opt.nb /data/local/tmp/quant_post_dynamic_demo
    2. adb push mobilenet_v1_int8_opt.nb /data/local/tmp/quant_post_dynamic_demo

    基于相同的输入、预测库、可执行文件,加载量化前后模型进行预测,得到输出。

    1. adb shell
    2. cd /data/local/tmp/quant_post_dynamic_demo
    3. sh run.sh

    执行量化前的mobilenetv1模型,log信息如下。

    1. max_value:0.936886
    2. max_index:65
    3. max_value_ground_truth:0.936887
    4. max_index_ground_truth:65
    5. ----------Pass Test----------

    执行量化后的mobilenetv1_int16模型,log信息如下。

    1. max_value:0.937905
    2. max_index:65
    3. max_value_ground_truth:0.936887
    4. max_index_ground_truth:65

    从log信息中可以发现,量化前后的模型分类结果相同,实际预测的类别概率和真实的类别概率,数值误差较小。