HAQ-for-Mobilenetv3-Quantization
代码地址:
https://github.com/Sharpiless/HAQ-for-Mobilenetv3-Quantization
论文地址:
https://arxiv.org/abs/1811.08886?
算法简介:
HAQ(Hardware-Aware Automated Quantization with Mixed Precision)是一个自动化的混合精度量化框架,使用强化学习让每一层都学习到了适合该层的量化位宽。 不同的网络层有不同的冗余性,因此对于精度的要求也不同,当前已经有许多的芯片开始支持混合精度。通常来说,浅层特征提取需要更高的精度,卷积层比全连接层需要更高的精度。如果手动的去搜索每一层的位宽肯定是不现实的,因此需要采用自动搜索策略。
另一方面,一般大家使用FLOPS,模型大小等指标来评估模型压缩的好坏,然后不同的平台表现出来的差异可能很大,因此HAQ使用了新的指标,即芯片的延迟和功耗。
搜索的学习过程是代理Agent接收到层配置和统计信息作为观察,然后输出动作行为即权值和激活的位宽。其中一些概念如下:
- 观测值-状态空间,一个10维变量,如下:
- 动作空间,使用了连续函数来决定位宽,离散的位宽如下:
- 反馈,利用硬件加速器来获取延迟和能量作为反馈信号,以指导Agent满足资源约束
- 量化,直接使用线性量化方法,其中s是缩放因子,clamp是截断函数:
- c的选择是计算原始分布和量化后分布的KL散度,这也是很多框架中的做法:
- 奖励函数,在所有层被量化过后,再进行1个epoch的微调,并将重训练后的验证精度作为奖励信号:
- 智能体,使用了深度确定性策略梯度(DDPG)方法:
- 训练策略:
数据集:
数据及使用DTD数据集,下载后运行:
python lib/utils/make_data.py
预处理数据及路径
预训练模型:
bash run_pretrained.sh
聚类搜索:
bash run_kmeans_quantize_search.sh.sh
搜索完后将搜索到的结果添加到finetune.py中
开始量化:
bash run/run_kmeans_quantize_finetune.sh
实验结果:
(还没跑完,下面是官方结果)
Models | preserve ratio | Top1 Acc (%) | Top5 Acc (%) |
---|
resnet50 (original) | 1.0 | 76.15 | 92.87 | resnet50 (10x compress) | 0.1 | 75.48 | 92.42 |
Models | preserve ratio | Top1 Acc (%) | Top5 Acc (%) |
---|
mobilenetv2 (original) | 1.0 | 72.05 | 90.49 | mobilenetv2 (0.6x latency) | 0.6 | 71.23 | 90.00 |
关注我的公众号:
感兴趣的同学关注我的公众号——可达鸭的深度学习教程:
联系作者:
B站:https://space.bilibili.com/470550823
CSDN:https://blog.csdn.net/weixin_44936889
AI Studio:https://aistudio.baidu.com/aistudio/personalcenter/thirdview/67156
Github:https://github.com/Sharpiless
|