• 问答
  • 技术
  • 实践
  • 资源
实践教程 | 模型量化与落地部署总结
技术讨论

实践教程 | 模型量化与落地部署总结

作者 | Zheng@知乎(已授权)
来源 | https://zhuanlan.zhihu.com/p/415168643
编辑 | 极市平台

摘要:

首先,本文对模型落地量化方法和原理的资料进行了总结和整理;其次,对主流量化推理框架,腾讯的NCNN、阿里的MNN、陈天奇团队的TVM、Facebook的QNNPACK等用法也进行了整理(本人主要用过NCNN以及MNN,因此,对TVM和QNNPACK只是简单总结,后续有机会再来补充);最后,介绍了使用adb在手机端测试模型推理速度的详细过程。

一、落地量化原理介绍

(1)Intel低数值精度深度学习推理与训练: https://software.intel.com/zh-cn/articles/lower-numerical-precision-deep-learning-inference-and-training

(2)Google量化模型的训练和推理paper: Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference(目前主流量化部署的参考

(3)浮点数与定点数的区别: https://blog.csdn.net/yh4181739/article/details/50522088

浮点数解析:https://segmentfault.com/a/1190000010841961

定点数解析:http://www-inst.eecs.berkeley.edu/\~cs61c/sp06/handout/fixedpt.html

(4)TensorRT的INT8方案:

1)基于TensorRT方案的INT8量化实现: http://on-demand.gputechconf.com/gtc/2017/presentation/s7310-8-bit-inference-with-tensorrt.pdf

2)TensorRT的INT8量化方案解析

基于tensorRT方案的INT8量化实现: https://note.youdao.com/share/\?id=829ba6cabfde990e2832b048a4f492b3\&type=note#/

TensorRT-INT8校准原理:https://arleyzhang.github.io/articles/923e2c40/

(5) 融合BN量化卷积:

1)神经网络量化入门--Folding BN ReLU:https://zhuanlan.zhihu.com/p/176982058

2)Pytorch实现卷积神经网络训练量化(QAT):https://mp.weixin.qq.com/s/\_3iJCO4gQz7mWcW7G8kimQ

3)bn融合_量化卷积(bn融合后,同时量化A/W,并做卷积:https://github.com/666DZY666/micronet/blob/master/micronet/compression/quantization/wqaq/iao/quantize.py

二、腾讯NCNN

模型部署与推理加速

NCNN量化详解https://zhuanlan.zhihu.com/p/72375164 (采用TensorRT量化方案)

(1)how to build ncnn: (install g++ cmake protobuf>=2.6.1) https://github.com/Tencent/ncnn/wiki/how-to-build (注:uncomment-“注释”)

(2)how to use ncnn with alexnet:(caffe/mxnet/pytorch/tf --> ncnn) https://github.com/Tencent/ncnn/wiki/how-to-use-ncnn-with-alexnet https://zhuanlan.zhihu.com/p/35387269

(3)ncnn根据模型和样本数据生成转int8所需的table参数文件(包括W和A):

(旧)https://github.com/BUG1989/caffe-int8-convert-tools

(新)https://github.com/Tencent/ncnn/blob/master/docs/how-to-use-and-FAQ/quantized-int8-inference.md

(4)mxnet-->caffe: https://github.com/zuoqing1988/ZQCNN/blob/master/mobilefacenet-mxnet2caffe-ZQ/README.md https://github.com/honghuCode/mobileFacenet-ncnn/tree/feature/mobilefacenet-mxnet2caffe

(5)convert caffe model to ncnn quantized int8 model(caffe2ncnn): https://github.com/Tencent/ncnn/wiki/quantized-int8-inference

(6)pytorch -> onnx-> ncnn(好用): https://github.com/Tencent/ncnn/wiki/use-ncnn-with-pytorch-or-onnx ;mobilenet(v1、v2、v3) form pytorch to ncnn: https://github.com/Tencent/ncnn/issues/1015

注:mobilenetv2的mean操作可以用avgpooling代替: https://github.com/Tencent/ncnn/issues/856

mobilenetv3转换教程: https://blog.csdn.net/hmzjwhmzjw/article/details/94027816

(7)Post-Training Quantization Tools:https://github.com/Tencent/ncnn/tree/master/tools/quantize

(8)benchmark使用教程(arm测速):https://github.com/Tencent/ncnn/blob/master/benchmark/README.md

三、阿里MNN模型部署与推理加速

(一)环境安装 安装protobuf(3.0或以上版本):https://blog.csdn.net/qq\_29936933/article/details/82107861下载带all的源码

(二)使用教程(MNN文档很详细

官方文档:https://www.yuque.com/mnn/cn

实战MNN之量化部署:https://zhuanlan.zhihu.com/p/73207495

[MNN学习二]模型压缩与量化:https://blog.csdn.net/qq\_37643960/article/details/97182962

四、TVM模型部署与推理加速

(一)环境安装

(二)使用教程

官方文档:https://docs.tvm.ai/install/from\_source.html#build-the-shared-library

在CPP下使用TVM来部署mxnet模型(以Insightface为例):https://www.bookstack.cn/read/HyperDL-Tutorial/5.\%E6\%A8\%A1\%E5\%9E\%8B\%E7\%9A\%84\%E9\%83\%A8\%E7\%BD\%B2-\%E5\%9C\%A8CPP\%E4\%B8\%8B\%E4\%BD\%BF\%E7\%94\%A8TVM\%E6\%9D\%A5\%E9\%83\%A8\%E7\%BD\%B2mxnet\%E6\%A8\%A1\%E5\%9E\%8B\%EF\%BC\%88\%E4\%BB\%A5Insightface\%E4\%B8\%BA\%E4\%BE\%8B\%EF\%BC\%89.md

TVM 初体验 - DarkNet 性能测试:https://zhuanlan.zhihu.com/p/91876198

五、QNNPACK模型部署与推理加速

使用教程(2021年我毕业之前QNNPACK还不是很完善,不知道现在如何了)

官方仓库:https://github.com/pytorch/QNNPACK

pytorch --> ONNX --> caffe2在移动端部署深度学习模型全过程: https://zhuanlan.zhihu.com/p/32342366

(1)fp32-->unit8过程:

inline uint8_t QuantizeUint8(float scale, int32_t zero_point, float value) {
  const int32_t qmin = std::numeric_limits<uint8_t>::min();
  const int32_t qmax = std::numeric_limits<uint8_t>::max();
​
  auto r = zero_point + static_cast<int32_t>(Round(value / scale));
  r = std::max(r, qmin);
  r = std::min(r, qmax);
  return static_cast<uint8_t>(r);
}

六、adb + benchmark测试速度(以ncnn为例)

(一)adb安装

linux上adb安装 (不好用):https://zhuanlan.zhihu.com/p/33373504

如何让Win10自动安装ADB驱动(亲测好用): https://www.jianshu.com/p/c3e51d1b5bae

sudo apt update
sudo apt install android-tools-fastboot
adb version  # 检查是否安装成功
# 正常情况下显示:Android Debug Bridge version 1.0.32
# 在终端输入:adb devices
# 正常情况会输出 :
# list of devices attached
# xxxxxx xxxx (你连接到电脑上的android设备)

注意: 小米手机设置:https://blog.csdn.net/qq\_37992738/article/details/87974752

(二)benchncnn安卓重新编译(ncnn测速)

ncnn靠谱教程:https://github.com/Tencent/ncnn/issues/279

ncnn官方教程:https://github.com/Tencent/ncnn/tree/master/benchmark

+(Build for Android)https://github.com/Tencent/ncnn/issues/279

(三)adb使用教程(以ncnn为例)

# 文件路径:D:\ChormeDownloads\adb
D:\ChormeDownloads\adb> .\adb devices
# adb push benchncnn和模型文件到 /data/local/tmp/目录下
 .\adb push .\param\benchncnn /data/local/tmp/
​
# 切换到/data/local/tmp/目录
.\adb shell
cd /data/local/tmp
# chmod 777 benchncnn
​
# 运行测试
 ./benchncnn [ncnn的param文件] [epoch] [n_thread] [powersave] [output_name] [cls{input=(224, 224, 3)}/face{input=(112, 112, 3)}]
# powersave:0=all cores, 1=little cores only(小核), 2=big cores only(大核)
# gpu device: -1=cpu-only, 0=gpu0, 1=gpu1 ...
​
# 示例如下
# Face
./benchncnn mobilefacenet.param 100 1 2 batch_norm_blob50_bn_scale50 face
./benchncnn mobilefacenet_pruned0.25.param 100 1 2 batch_norm_blob50_bn_scale50 face
./benchncnn mobilefacenet_pruned0.5.param 100 1 2 batch_norm_blob50_bn_scale50 face
​
# Cls
./benchncnn mobilenetv1.param 200 1 2 256 cls
./benchncnn mobilenetv1_p0.3.param 200 1 2 256 cls
​
./benchncnn mobilenetv2.param 200 1 2 474 cls
./benchncnn mobilenetv2_p0.3.param 200 1 2 474 cls

注: PyTorch Mobile 模型(全精度)adb推到手机上测试推理时间:https://chenyaofo.com/pytorch-mobile-test-model-inference-time/

  • 0
  • 0
  • 1344
收藏
暂无评论
sophie
大咖

科技园的搬砖汪

  • 18,213

    关注
  • 329

    获赞
  • 54

    精选文章
近期动态
  • 从事AI视觉算法开发多年,主攻目标检测、图像分割方向
文章专栏
  • 优质论文推荐