返回文章列表

Introduction

在上个月的时候,谈了一下自己做了半年图像降噪任务的感想 浅谈图像降噪,正好最近在做降噪模型的落地轻量化,也接近年关,写个随笔谈谈自己的工作和感想。
在轻量化的领域里,最经典的几个方法,基本不外乎以下几个:
  • 知识蒸馏
  • 量化
  • 剪枝
  • 重参
本文会从以下几个角度,从我涉及的,调研过的,以及一些猜想,谈谈关于这几个任务在实际使用中的经验和遇到的坑。

知识蒸馏

说到知识蒸馏,这是我工作之后遇到的第一个任务,就是做一个蒸馏框架,初做时信心满满,因为之前就了解过不少蒸馏的工作,当时甚至就在写一篇关于蒸馏的paper(有点丢人,投了AAAI6553被拒了,上班时候时间赶写的不好,rebuttal竭尽全力但是好像并没有人看,准备过年好好修一下转投,如果中了回头来推销一下)。当时充满了信心,感觉年末绩效在向我招手。可惜第一个任务就差点给我直接抬走,还好放弃的早不然怕是过不了试用期。
在做High-level的时候,有一个基本上公认的蒸馏起效果的原因,就是teacher模型会提供一个概率分布,和冷冰冰的one-hot的target比,会有潜在的知识让学生模型更好学。但是这一个公认的信息,在降噪,或者说low-level中,失效了,teacher输出的是一个和gt一摸一样的逐像素结果,中间没有概率分布,模型输出的就是结果。也就是说,从本质上讲,teacher的监督和gt是一样的,teacher=bad gt。这个性质有多可怕呢?可怕到,我们在制作gt数据集的时候,追求的是gt越精细越真实越好。但是如果蒸馏有效,就代表差的gt让模型训练性能更好。这显然是违背认知的。但是我的蒸馏还确实有一点点效果,但不多,聊胜于无。
我对此的解释只能是,teacher和student是同构的,teacher的结果代表了模型结构对于不同特征的学习能力,这隐式的传递了这一知识,让student更好学。异构蒸馏由于模型结构不同,就没有这个性质了。(这里就涉及到到底啥是同构了,宽度深度都试过,有的有用有的没用,具体我也记不清了,最后整个半天没用上。)更别说一堆feature蒸馏,基本试了前年去年cvpr,eccv,iccv出现的绝大部分蒸馏方式,最后起效果的基本没有,要么聊胜于无。
做了一个多月后,看见了 @黄哲威 hzwer 的一个回答为何感觉“知识蒸馏”这几年没有什么成果,然后深以为然,光速和领导说准备换个东西做。

量化

量化应该是最近一个月看的最多的东西了,论文看了小五十篇,最大的感悟就三个:
  • LLM的量化是真的多,但我用不了
  • High-level的量化也是真的多,但是依旧用不了
  • Low-level的量化是真的难,就是没啥人做。
现在的量化基本就3种,LLM的量化,图像分类的量化,超分的量化,第三个数量很少,LLM火了之后更是基本没有,一年能有两篇不得了了。
先说LLM的量化,这类量化最大的特点就是,只care权重,不care激活,所以有一大堆A16W2的工作,听着很美好,但是对我的帮助没啥用,事实上我做图像任务,更重要的是实时性的要求,要量化的是激活希望能速度快一点,权重量化更大的作用是减小参数量,有用但是对加速没啥效果,事实上我自己试验的结果就是,16bit的数据,我权重量化到8bit,4bit,结果上几乎没有区别,性能基本不会掉,但是激活只要一动影响就超级大,疯狂掉点,所以对于我现在的实时模型来说,LLM的量化是真的多,但我用不了。
其次第二多的论文,是图像分类的量化,量化主要集中在imagenet和cifar数据集的准确率上,对于low-level的工作来说,有用,但又没这么有用。大概来说这几年的工作不外乎如下几个。自从lsq把scale作为可学习参数之后,量化公式里涉及到的能学的参数被学了个遍。对STE进行花式传梯度,每篇论文图一画就让人感觉这传的梯度和原来的一毛一样。灵活使用tash函数构造各种公式丰富梯度形式。可能每个都有点用,但是一起用的边际收益非常低,甚至可以说没有,最后发现直接用lsq就能达到90%以上的效果,再之后的方法放上去,就是很难区分是训练误差还是方法效果的工作了。只能感叹High-level的量化也是真的多,但是依旧用不了。
在此之后,就是专门针对Low-level的量化了,说是low-level,其实就是局限于超分了,别的基本没做的。接下来也会详细说说自己在做low-level量化时遇到的各种坑,不知道有多少朋友也遇到的。

Low-level量化

做low-level量化上来要面对的东西其实就有2个,一个是low-level是像素级的,所以虽然在分类里准确率可能就差一点,但是在图上可能差距甚远。还有一个是low-level没有BN层,导致中间特征离散,这个是参考论文DAQ: Channel-Wise Distribution-Aware Quantization for Deep Image Super-Resolution Networks。同时,正如之前说的,由于做low-level量化,大部分都是实时性的要求,所以要做激活量化,这就导致量化非常困难,和浮点能差非常多。
按照我自己在做量化的经验来说,大体的经验(坑)分成几个方向:
  1. 算力分布不同
  1. 硬件限制巨多
  1. 模型结构设计困难

算力分布

为了达成算力目标,一般会使用混合精度量化,毕竟有时候其实和交付的差距就一点点,直接全往下量化一个bit位太浪费了,所以普遍来说都会混着来。但是众所周知,正常的模型不同的block,都是C*2,(H,W)/2,这就导致越深层的层算力越小,下采一次计算量就会降很多,而high-level的任务中,重要的是语义特征,一般处于比较深层的位置,所以这些重要的深层层用高精度,计算量不会提升很多,但是可以保留很大的性能。然而Low-level,由于是像素级任务,对于浅层纹理特征的要求非常大,反而深层没有这么重要,所以尴尬的地方就来了,我需要节省算力的地方,和保证模型性能的层重合了,这就导致混合精度非常难选,选深了没效果,选浅了掉点太多。

硬件限制

在做量化的时候,遇到最大的问题,或者说对量化来说最大的限制,应该就是硬件的限制了,在刚接触量化的时候,我以为量化的难点只是说round导致的舍入误差,看各种方法如何拉近这个误差就完了。但是没想到实际上,最大的困难和性能的gap,来自于硬件限制。例如就拿我自己遇到的硬件来说,比如硬件只支持移位,不支持乘除法,这就导致我的量化scale等结果必须是log2的指数,直接出门丧失许多精度。诸如此类各种违反了量化框架的限制,有一个就能打死一大批论文,这就导致了量化出生残疾,先天不足。

模型结构

模型结构设计,简单来说就是,一个浮点训的很好的模型,在形式上不一定好量化,并不是一个同向的过程。而到底是要浮点好让量化掉的多,还是浮点烂一点让量化掉的少点,这就很难把握了。特别是混合精度的时候,有的时候会遇到很神奇的事儿,有的层4bit量化的结果比8bit好,因为模型到了这个层的时候,激活分布更聚拢,不需要这么宽的量化位宽,给多了反而值重合的多。这种层就很适合往下量化,但是到底如何设计出这种层,暂时我自己的浅薄经验是,靠经验,好像没遇到专门说这种的论文。
就我自己的经验来说,把模型结构弄好,让模型适合量化一些,对结果的影响,超越了所有的量化方法,其他各种方法用了可能只会好一点点,但是结构不行,可能会导致差非常多!

组合

这一节主要说的是量化和其他方法的组合,重参和剪枝会专门放到这一节说,因为这也是我遇到并没有使用这些方法的原因。
在轻量化落地的时候,基本上量化是必须经历的一个步骤,不可或缺,毕竟大部分硬件只支持整数运算,所以这里要说的是各种轻量化方法和量化的组合问题。

知识蒸馏

推荐指数: ⭐⭐⭐⭐⭐
知识蒸馏的目的是为了提升浮点学生模型的性能,和量化本身关系不大,对结构也没影响,所以基本只要有效,就能随意使用。特别的,如果把浮点学生模型当teacher,量化模型当st,好像也会有点用(high-level不少paper都有用,low-level试过,好像在loss上有点用,但是看图看不出区别)

重参

推荐指数: ⭐⭐
说到重参,大致的思想就是训练的时候用好几个层,在推理的时候合成一个。这种方式在浮点的时候问题不大,但是在合并的时候就会遇到,不同分支的层都有不同的scale,合并非常复杂,掉点严重。比如美团在前年的paper:Make RepVGG Greater Again: A Quantization-aware Approach 讲的就是重参量化的问题,但是解决的办法如果没记错,是对bn进行的处理,很不幸,low-level没有bn层,其他关于重参量化的论文就非常少了,而且使用了还要考虑和原来方案的适配性,只能说不是很建议和量化同时使用。

剪枝

推荐指数: ⭐⭐
剪枝我碰的不多,同事有研究过两个礼拜也就听了一嘴,若有错漏希望大家能多家指正。剪枝落地要用基本必须要进行结构化剪枝,思想基本就是假定模型在训练阶段需要很多参数,但是有许多参数只是为了训练用的,在推理的过程中就显得冗余了。当前各种论文许多都集中在重要性判断,也就是如何筛选要减掉的参数。但是low-level对于像素级的要求比较高,在high-level中只是差距一点点的gap,在low-level中可能就是完全没法用(点名那些什什么网格毛刺问题,明明loss,psnr都一毛一样,有网格就直接没法看)。在我粗浅的理解里,我感觉剪枝可能是训练后最后一步做的事情,貌似比较适合PTQ。就是不确定最后剪一下会不会对scale有比较大的影响。

小结

年末了,也是对自己的工作做了一些小结,具体问题的具体解决办法肯定没法说,落地的东西结构不同遇到的问题肯定也都不一样。主要还是集中在对不同任务的感悟上把,收拾收拾准备rebuttal cvpr了,也不知道忘记交补充材料对审稿结果的影响到底大不大,当时工作太忙交完正文忘了把补充材料传上去了,写个心愿,别让我过年改ICCV。