oqfa分析

Once Quantized for All: Progressively Searching for Quantized Compact Models分析

  • 论文链接: https://openreview.net/pdf?id=_MxHo0GHsH6
  • 代码链接:https://github.com/LaVieEnRoseSMZ/OQA

该论文是ICLR2021上在投的一个工作。该工作以及韩松组的APQ等工作,说明了业界出现了越来越多试图将Once-for-All的思想与量化剪枝相结合的思路。

Once-for-All的思想主要有两个流派。一个是韩松组的Once-for-All系列,包括:

  • Once for All: Train One Network and Specialize it for Efficient Deployment

  • APQ: Joint Search for Nerwork Architecture, Pruning and Quantization Policy

    • 在Once for All的基础上融入剪枝和量化

另外一个是Slimmable Networks系列,包括:

  • Slimmable Neural Networks三部曲
    • Slimmable Neural Networks
    • Universally Slimmable Networks and Improved Training Techniques
    • AutoSlim: Towards One-Shot Architecture Search for Channel Numbers
  • BigNAS
    • 基于Slimmable Neural Networks的拓展,类似韩松组的ofa,在resolution,kernel size,channel,depth上都做了动态化。

本人读完oqa(Once Quantized for All)后,个人理解就是,分别结合了两个流派的技术,并融入了LSQ:Learned Step Size Quantization的量化方法,实现了ofa和量化的结合,也就是训练一个量化后的超网,不需要任何后处理来进行量化子网的部署。代码工程上,作者在Supplementary Material中发布了代码,只有evaluate部分,超网train部分和search部分貌似没有开源。感觉是在APQ代码的基础上做了改动。

ofa算法分为四步:

  1. 训练一个k bits的网络(论文中就是4bits,3bits,2bits,1bits),联合训练模型权重和量化参数。

  2. 给定一个计算资源约束,搜索出该约束下最好的模型。如果是目标bits下的模型,就退出整个流程。

  3. 使用当前的k bits超网模型权重和量化参数来初始化k-1 bits的超网。

  4. k=k-1,并回到步骤1。

下面对步骤2量化超网的训练和步骤3量化超网的搜索进行分析。

量化超网的训练

超网的训练和Once-for-All的progressive shrinking不同,是把4个维度下的搜索空间都同时加进来了,而渐进式的训练不同bits位宽下的supernet。

具体过程分成以下4点来描述。

  1. 先正常训练一个全精度浮点超网。

  2. 构建一个4bits位宽的超网,利用第一步获得的模型权重进行初始化。并采用BigNAS中的三明治方法(sandwich rules):在一个iteration中,采样最大和最小的子网加两个随机采样的子网一起进行训练。采样最大和最小的子网的目的是提升网络性能的上下界。

  3. 构建一个3bits位宽的超网,利用第二步获得的4bits模型权重进行初始化(权重继承)。同样采用三明治方法进行训练。另外使用了知识蒸馏,利用4bits的网络来作为老师,3bits的超网作为学生进行训练。

  4. 2bits,1bits的操作同第2,第3步。

量化超网的搜索

论文中提到采用了类似BigNAS中粗粒度到细粒度coarse-to-fine搜索的方法。在BigNAS中,就是定义一个粗细粒度的搜索空间,并得到该空间下所有模型的数据。然后在某个计算资源约束下(比如FLOPs)选择精度表现最好的模型进行微调,得到一组模型的性能表现,从中获得一个更优的模型。而在oqa中,类似的,首先从在50M to 300M 的FLOPs范围中随机抽取10K个浮点全精度的子网并测试其精度表现,在这10k个子网的帕累托前沿中获得良好的子网(输入分辨率、深度、宽度)之后,随机扰动卷积核大小以进一步搜索更好的子网。

总结

这是一个结合了ofa和量化的工作。总体感觉是目前主流nas技术和主流量化技术的一个融合,从论文中的实验表现来说很出色,但个人感觉是不是有些不太够novelty?又或者是不是可以尝试混合精度的训练?由于代码只开源了evaluate部分,有些地方只能做到大致的了解,可能与实际的工作有些出入,欢迎大佬们指正批评,也希望论文作者后续能够开源分享代码。

相关链接

  • Once for All代码分析:https://blog.csdn.net/iamxiaoluoli/article/details/112394176
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值