其他
一个方案搞定模型量化到端侧部署全流程
量化技术简介
非饱和方式:将浮点数正负绝对值的最大值对应映射到整数的最大最小值。 饱和方式:先计算浮点数的阈值,然后将浮点数的正负阈值对应映射到整数的最大最小值。 仿射方式:将浮点数的最大最小值对应映射到整数的最大最小值。
动态离线量化:此方式不需要样本数据。采用非饱和方式进行权重的量化。 静态离线量化:此方式只需使用少量的样本数据进行模型的前向计算,对激活进行数值采样。使用饱和方式量化权重,非饱和方式量化激活。 量化训练:此方式需要使用大量有标签样本数据。通过非饱和方式进行权重和激活的量化,并在训练过程中更新权重。
全流程量化方案
1. PaddleSlim 产出量化模型
2. Paddle Lite 部署量化模型
三大亮点
1. 支持主流模型量化方法
2. 模型量化全流程打通
3. 模型量化收益显著
模型量化实战
接下来,我们使用百度AI Studio平台和MobileNetV1模型,详细介绍模型量化产出和部署的整个流程。强烈推荐阅读相关说明,并按照说明执行所有代码,具体请参考:
https://aistudio.baidu.com/aistudio/projectdetail/526625
1. 准备环境
pip install paddlelite==2.6.1 -i https://mirror.baidu.com/pypi/simple
2. 准备数据和模型
!tar zxf ./data/mobilenetv1_fp32.tgz -C data/
3. PaddleSlim产出量化模型
import os
import shutil
from work import reader
import paddle.fluid as fluid
from paddleslim.quant import quant_post
# 定义变量
model_fp32_path = "./data/mobilenetv1_fp32/"
model_int8_path = "./data/mobilenetv1_int8/"
data_path = "./data/quant_100imgs/"
use_gpu = False # 如果是GPU环境,可以设置use_gpu=True,加快执行时间
place = fluid.CUDAPlace(0) if use_gpu else fluid.CPUPlace()
executor = fluid.Executor(place)
executor=executor,
model_dir=model_fp32_path,
quantize_model_path=model_int8_path,
sample_generator=sample_generator,
batch_size=10,
batch_nums=10,
save_model_filename=None,
save_params_filename=None)
4. Paddle Lite部署量化模型
1 ) 转换量化模型
--optimize_out_type=naive_buffer \
--valid_targets=arm \
--model_dir=./data/mobilenetv1_int8/ \
--optimize_out=./data/mobilenetv1_opt
2 ) 对比模型存储空间
3 ) 对比模型推理速度
lite_test_path = "./lite_test"
if os.path.exists(lite_test_path):
shutil.rmtree(lite_test_path)
os.mkdir(lite_test_path)
if os.path.exists("./lite_test.tgz"):
os.remove("./lite_test.tgz")
# 下载可执行文件
!wget -c -P ./lite_test https://paddle-inference-dist.bj.bcebos.com/PaddleLite/benchmark_2.6/benchmark_bin_v8
# 整理模型和脚本
!cp ./work/run.sh ./lite_test
!cp -r ./data/mobilenetv1_fp32 ./lite_test
!cp -r ./data/mobilenetv1_opt.nb ./lite_test
!tar zcf ./lite_test.tgz ./lite_test