Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

EasyQuant 技术细节答疑 #3

Open
wonderDiWu opened this issue Jul 1, 2020 · 41 comments
Open

EasyQuant 技术细节答疑 #3

wonderDiWu opened this issue Jul 1, 2020 · 41 comments
Labels
good first issue Good for newcomers

Comments

@wonderDiWu
Copy link

wonderDiWu commented Jul 1, 2020

EQ 技术细节答疑

我们最近收到了很多朋友对 EQ 的咨询建议,对大家的关心和建议表示感谢。论文目前不太完善,Motivation 实验对比有所欠缺。我们会考虑在后续的版本做进一步优化,欢迎大家提出更多的建议, 我们会仔细评估后做出修订。我们希望 EQ 能给学术界带来在线性离线量化方案上带来有意义的启发,给工业界在实际的量化部署上带来精度和速度的提升。

EQ 的 Contributions

  1. 我们提出了一种全新的,有效的同时也非常简单易用的对激活和权重 Scale 优化的策略。对比传统的 TRT 量化方案(这里只讨论Scale 计算部分),我们认为权重和激活的 Scale 调优是有很大提升空间的。我们提出对权重和激活的 Scale 做联合的迭代优化,这里的联合体现在我们交替地对权重和激活scale值进行优化,并且优化的目标对象是卷积后的结果,区别与 TRT 的方案(激活scale单独优化,权重和激活的优化都不考虑卷积的影响的)。最后在整体上,我们对 CNN网络采用了从第一层到最后一层的逐层优化的方案。

  2. 鉴于 EQ 在 INT7 离线量化下非常好的精度保持,我们提出了 INT7 的推理方案。减少的1 bit 在基于 ARM 平台上的推理中给了我们更大的指令级别的优化空间。我们实现了基于 NCNN 的 INT7 的推理方案。基于我们测试的结果可以在原始 INT8 NCNN 的基础上额外提速 30% 左右(实际不同网络结构会有差异)。

  3. 我们基于各种模型结构( VGG16, ResNet18, MobileNet v1 )在不同的任务上(分类,检测,识别)对 EQ 进行验证,都取得了很好的效果。我们的实验验证不仅包括论文中公开的公开模型和数据集,同时也有大量的企业级别实际应用的模型和数据集。这充分证明了 EQ 的有效性。

EQ 的疑问有几点做统一回复:

  1. Q:相似度度量的问题:在优化激活和权重的 Scale 时, KL 散度、余弦相似度、MSE 到底哪个好?
    A:我们并没有应用过 K L散度,因为 EQ 是对卷积后的特征图进行相似度的比较,KL 散度并不是很合适,也不直观。余弦相似度和 MSE 在我们实验中效果很相似,我们之所以选择余弦相似度是因为他统一了量纲在 -1 和 1 之间,方便我们对每层的情况进行比对分析。我们的初衷是希望 EQ 能很好的证明激活和权重的 Scale 在优化上有很大的提升空间,而不仅仅在于度量的选择上的比较。

  2. Q:EQ 的 Scale 优化怎么应用到实际的推理框架中?
    A:EQ 的 Scale 优化方法非常的简单有效,几乎可以零成本的嵌入到各种线性离线量化的工具中。这是 EQ 非常大的优势。实际上我们也是这么做的,我们很方便的将优化后的 Scale 嵌入到了 NCNN 的 Scale 文件(即 Calibration.table)中, TRT 等离线量化工具也暴露了相关的接口。

@BUG1989 BUG1989 pinned this issue Jul 1, 2020
@BUG1989 BUG1989 changed the title 关于EQ的几点说明 EasyQuant 技术细节答疑 Jul 1, 2020
@xieydd
Copy link

xieydd commented Jul 1, 2020

Q1: EQ INT7 加速推理实现没有公开?eq-ncnn 不是的吗,我看上面说的是 ncnn-int8-e2e 是基于ncnn int8社区版本低比特(小于8bit)量化魔改版
Q2: 后面会直接 e2e (ncnn model -> ncnn model)而不是用 caffe 转来转去的?
Q3: Jointly optimize 怎么保证是最优的呢?是不是可以认为有的模型可以微调 scale 到相对 origin int8 会有所提升,有些不行?
Q4: Search Space 是不是有点太大了,层*2(weight + activate)*bins?

@wonderDiWu
Copy link
Author

wonderDiWu commented Jul 1, 2020

Q1: EQ INT7 加速推理实现没有公开?eq-ncnn 不是的吗,我看上面说的是 ncnn-int8-e2e 是基于ncnn int8社区版本低比特(小于8bit)量化魔改版
Q2: 后面会直接 e2e (ncnn model -> ncnn model)而不是用 caffe 转来转去的?
Q3: Jointly optimize 怎么保证是最优的呢?是不是可以认为有的模型可以微调 scale 到相对 origin int8 会有所提升,有些不行?
Q4: Search Space 是不是有点太大了,层*2(weight + activate)*bins?

A1:是的。已经公开了一个版本,已修正。
A2:会的,目前用到caffe是基于我们日常流程的设计。
A3:EQ的策略相比TRT的scale计算策略在各个模型和任务上都有精度的提升。我们的优化策略目前是基于逐层贪心的选取scale, 同时每层sclae的选取是通过简单的搜索方式完成的,这里是我们对实际实现的限制做了妥协。
A4:目前的搜索空间是这样的。我们普遍观察到的现象是量化误差经过每层逐渐变大(很少的模型只是单独某些层导致误差突然变大),基于这样的观察我们采取逐层激活和权重scale的搜索策略

@xieydd
Copy link

xieydd commented Jul 1, 2020

R2: 有时间点吗?因为我现在在搞,想白嫖,时间长我就自己搞了😝
R3: 因为我之前也做过搜索,基于 scale 上下10% 分 5 个点,感觉太慢就放弃了。感觉这里应该有可以做的点
R4: alpha=0.5 beta=2 这个是调参后的结果吗? 感觉这个范围太宽了

@BUG1989 BUG1989 added the good first issue Good for newcomers label Jul 1, 2020
@hereislife
Copy link

Q1:论文算法流程中的收敛条件是什么,不是取cos 最大对应的 scale 吗,收敛是什么意思?
Q2:优化 scale 时,使用量化后的权重和激活进行卷积,会不会带来类似过拟合的问题?
Q3:如果 TRT 方案,激活 scale 优化也使用量化后的权重和激活进行卷积,结果会不会更好?

@wonderDiWu
Copy link
Author

  1. 这个实现基于现在的EQ应该只要做很小的改动就行。caffe我们只是用来算KLD和转模型用的(业务问题)。EQ的的时间点可以咨询下项目现在主要维护者,yunglechao 和 BUG1989
  2. scale的搜索调优确实有很大提升空间可以做。目标函数上,搜索的方式,空间,次序和搜索加速上等等。
  3. 是调参后发现的比较好的值。

@wonderDiWu
Copy link
Author

Q1:论文算法流程中的收敛条件是什么,不是取cos 最大对应的 scale 吗,收敛是什么意思?
Q2:优化 scale 时,使用量化后的权重和激活进行卷积,会不会带来类似过拟合的问题?
Q3:如果 TRT 方案,激活 scale 优化也使用量化后的权重和激活进行卷积,结果会不会更好?

A1:这里的收敛主要是量化前后卷积后的特征图余弦相似度不再提升稳定到某个值。
A2:理论上是有可能的,但是我们测试的数据集上(测试数据本身没有用于量化过程)并没有表现出类似过拟合的现象。
A3:我个人觉得是会有提升的。

@hereislife
Copy link

Q1:论文算法流程中的收敛条件是什么,不是取cos 最大对应的 scale 吗,收敛是什么意思?
Q2:优化 scale 时,使用量化后的权重和激活进行卷积,会不会带来类似过拟合的问题?
Q3:如果 TRT 方案,激活 scale 优化也使用量化后的权重和激活进行卷积,结果会不会更好?

A1:这里的收敛主要是量化前后卷积后的特征图余弦相似度不再提升稳定到某个值。
A2:理论上是有可能的,但是我们测试的数据集上(测试数据本身没有用于量化过程)并没有表现出类似过拟合的现象。
A3:我个人觉得是会有提升的。

Q:其它论文里面看到过更直接的方法,将每层的量化误差(MSE) 直接补偿到 bias 里面,也是只要少量的数据集。请问有做过类似的实验吗?结果如何呢?

@xieydd
Copy link

xieydd commented Jul 2, 2020

Q1:论文算法流程中的收敛条件是什么,不是取cos 最大对应的 scale 吗,收敛是什么意思?
Q2:优化 scale 时,使用量化后的权重和激活进行卷积,会不会带来类似过拟合的问题?
Q3:如果 TRT 方案,激活 scale 优化也使用量化后的权重和激活进行卷积,结果会不会更好?

A1:这里的收敛主要是量化前后卷积后的特征图余弦相似度不再提升稳定到某个值。
A2:理论上是有可能的,但是我们测试的数据集上(测试数据本身没有用于量化过程)并没有表现出类似过拟合的现象。
A3:我个人觉得是会有提升的。

Q:其它论文里面看到过更直接的方法,将每层的量化误差(MSE) 直接补偿到 bias 里面,也是只要少量的数据集。请问有做过类似的实验吗?结果如何呢?

Q: 是针对 post-training 的吗?可以 po 一下论文吗?

@wonderDiWu
Copy link
Author

Q1:论文算法流程中的收敛条件是什么,不是取cos 最大对应的 scale 吗,收敛是什么意思?
Q2:优化 scale 时,使用量化后的权重和激活进行卷积,会不会带来类似过拟合的问题?
Q3:如果 TRT 方案,激活 scale 优化也使用量化后的权重和激活进行卷积,结果会不会更好?

A1:这里的收敛主要是量化前后卷积后的特征图余弦相似度不再提升稳定到某个值。
A2:理论上是有可能的,但是我们测试的数据集上(测试数据本身没有用于量化过程)并没有表现出类似过拟合的现象。
A3:我个人觉得是会有提升的。

Q:其它论文里面看到过更直接的方法,将每层的量化误差(MSE) 直接补偿到 bias 里面,也是只要少量的数据集。请问有做过类似的实验吗?结果如何呢?

A:不知道你说的是不是类似bias correction的方法 (平衡量化所导致的分布中心偏移)。我们有在某些模型和数据集上尝试复现过类似的方法效果没有直接优化scale明显。

@hereislife
Copy link

Q1:论文算法流程中的收敛条件是什么,不是取cos 最大对应的 scale 吗,收敛是什么意思?
Q2:优化 scale 时,使用量化后的权重和激活进行卷积,会不会带来类似过拟合的问题?
Q3:如果 TRT 方案,激活 scale 优化也使用量化后的权重和激活进行卷积,结果会不会更好?

A1:这里的收敛主要是量化前后卷积后的特征图余弦相似度不再提升稳定到某个值。
A2:理论上是有可能的,但是我们测试的数据集上(测试数据本身没有用于量化过程)并没有表现出类似过拟合的现象。
A3:我个人觉得是会有提升的。

Q:其它论文里面看到过更直接的方法,将每层的量化误差(MSE) 直接补偿到 bias 里面,也是只要少量的数据集。请问有做过类似的实验吗?结果如何呢?

Q: 是针对 post-training 的吗?可以 po 一下论文吗?

A:是的,《Data-Free Quantization Through Weight Equalization and Bias Correction》,上面说法有误

@hereislife
Copy link

Q1:论文算法流程中的收敛条件是什么,不是取cos 最大对应的 scale 吗,收敛是什么意思?
Q2:优化 scale 时,使用量化后的权重和激活进行卷积,会不会带来类似过拟合的问题?
Q3:如果 TRT 方案,激活 scale 优化也使用量化后的权重和激活进行卷积,结果会不会更好?

A1:这里的收敛主要是量化前后卷积后的特征图余弦相似度不再提升稳定到某个值。
A2:理论上是有可能的,但是我们测试的数据集上(测试数据本身没有用于量化过程)并没有表现出类似过拟合的现象。
A3:我个人觉得是会有提升的。

Q:其它论文里面看到过更直接的方法,将每层的量化误差(MSE) 直接补偿到 bias 里面,也是只要少量的数据集。请问有做过类似的实验吗?结果如何呢?

A:不知道你说的是不是类似bias correction的方法 (平衡量化所导致的分布中心偏移)。我们有在某些模型和数据集上尝试复现过类似的方法效果没有直接优化scale明显。

谢谢,是你说的这个 bias correction 方法,我说法有误

@xieydd
Copy link

xieydd commented Jul 2, 2020

@wonderDiWu Why I see the vgg example code, for weight not use α,use min=1.0 β=1.0 bins=100 ; for activation α=0.8 β=1.0 bins=100 ? But in paper, In experiments, hyper-parameters α, β and n are robust for various tasks with α = 0.5, β = 2 and n = 100.

@wonderDiWu
Copy link
Author

@wonderDiWu Why I see the vgg example code, for weight not use α,use min=1.0 β=1.0 bins=100 ; for activation α=0.8 β=1.0 bins=100 ? But in paper, In experiments, hyper-parameters α, β and n are robust for various tasks with α = 0.5, β = 2 and n = 100.

As mentioned in the paper, we used α = 0.5, β = 2 and n = 100 in all our experiments, which are robust for various tasks and architectures. I recommend adopting these settings mentioned in our paper. I reckon it is a mistake in the code. Thank you for pointing out. @yunglechao @BUG1989

@xieydd
Copy link

xieydd commented Jul 5, 2020

@wonderDiWu Why i transfer EasyQuant to my face detection task, get a very bad result, i use α = 0.5, β = 2 and n = 100 for weight and activation.Widerface val result :

origin ncnn 0.304 | 0.642 | 0.774
EasyQuant 0.12    |  0.281  | 0.41

Is it convenient to provide Object detection on VOC2007 task for SSD models with bachbone SqueezeNet and MobileNet V1 Example.

@ArchorZ
Copy link

ArchorZ commented Jul 6, 2020

你好,我有几个问题想咨询下:
Q1:论文中提到了收敛值,但是在example中只是计算了量化与原数据cos的最大值?
Q2:论文中提到的许多经典网络的计算数据,是像代码中用ncnn框架跑出来的么?ncnn框架只有运算weights×feature时是定点,之后又dequantization 为浮点数再与浮点型的bias相加。也就是说在层与层之间是传递的f32数据。所以在RK3399上跑的数据,层与层之间是用f32传递还是int16传递。如果是int16传递,那与ncnn结果是否还一致?如果用f32数据在终端上跑,对带宽以及推理速度影响有多大?
Q3:tools中的代码有的有点问题,比如e2e文件中没有声明self.th就直接使用了该变量。
Q4:我运行 example 中vgg16 使用了1000+50张图片的量化方式,之后使用1000张图片作为验证,得出的结果并没有论文中提到的好。top5 0.347 top1 0.187。能否提供一个直接能运行且可跑出论文中类似效果的demo?
Q5:example的EQ量化过程非常慢,我跑了24h以上,且时间主要是用在EQ量化过程中。看代码中可能是inference次数太多,每一层中weigths每个channel100次,activations200次。且原模型与量化模型都要进行inference,如果把原模型每层数据使用存储与读取,会不会对计算量比较大的网络(如vgg16)的速度有所提升?此外,还有没有其他的方法,能使量化过程加快?
谢谢!

@wonderDiWu
Copy link
Author

wonderDiWu commented Jul 6, 2020

@wonderDiWu Why i transfer EasyQuant to my face detection task, get a very bad result, i use α = 0.5, β = 2 and n = 100 for weight and activation.Widerface val result :

origin ncnn 0.304 | 0.642 | 0.774
EasyQuant 0.12    |  0.281  | 0.41

Is it convenient to provide Object detection on VOC2007 task for SSD models with bachbone SqueezeNet and MobileNet V1 Example.

Thanks for adopting EQ in your project. In terms of your problem. It’s nearly impossible for us to recognize where the bug is by just knowing the final accuracy. However, there are some guides you could consider.

  1. Precheck your model's activation's maximum values and distributions, some CNN models (usually product-level model ) are very hard for linear post-training quantization method to deployment due to the extremely widespread of activation's distribution.
  2. Make sure the traditional FP32 ncnn model and the INT8 ncnn model parameterized by TRT scales work successfully and show correct results as expected.
  3. Consider some baby steps or unit tests. For instance, you may just optimize the first few layers of CNN, before you run the whole network scales optimization.
  4. Monitor the optimization process by checking the log file.

Could you please open another issue regarding your problem mentioned here? This issue is intended to focus on general questions about EQ. Many thanks. My former colleagues will track it and give you help as much as we can. Actually, we are preparing the other models (MobileNet) and further debugging information for demos.

@wonderDiWu
Copy link
Author

你好,我有几个问题想咨询下:
Q1:论文中提到了收敛值,但是在example中只是计算了量化与原数据cos的最大值?
Q2:论文中提到的许多经典网络的计算数据,是像代码中用ncnn框架跑出来的么?ncnn框架只有运算weights×feature时是定点,之后又dequantization 为浮点数再与浮点型的bias相加。也就是说在层与层之间是传递的f32数据。所以在RK3399上跑的数据,层与层之间是用f32传递还是int16传递。如果是int16传递,那与ncnn结果是否还一致?如果用f32数据在终端上跑,对带宽以及推理速度影响有多大?
Q3:tools中的代码有的有点问题,比如e2e文件中没有声明self.th就直接使用了该变量。
Q4:我运行 example 中vgg16 使用了1000+50张图片的量化方式,之后使用1000张图片作为验证,得出的结果并没有论文中提到的好。top5 0.347 top1 0.187。能否提供一个直接能运行且可跑出论文中类似效果的demo?
Q5:example的EQ量化过程非常慢,我跑了24h以上,且时间主要是用在EQ量化过程中。看代码中可能是inference次数太多,每一层中weigths每个channel100次,activations200次。且原模型与量化模型都要进行inference,如果把原模型每层数据使用存储与读取,会不会对计算量比较大的网络(如vgg16)的速度有所提升?此外,还有没有其他的方法,能使量化过程加快?
谢谢!

A1:论文中的收敛是指迭代地优化激活和权重的scale到收敛,demo中我们只做了一轮优化。
A2:论文中的数据都是基于eq-ncnn得到的实验结果, 论文里的数据是在服务器环境下运行eq-ncnn的结果。我们在代码中限制了不同的比特位宽以确保不会发生加法溢出的问题,原则上FP32和INT16的结果是一致的,实际可能因为底层实现原因有很小的差别(我们在一些产品模型上验证过这个一致性)。如果你还有细节的疑问,建议你在eq-ncnn下提对应issue. @BUG1989
A3:感谢提出问题,我们会审核这个变量的使用。
A4:同样仅仅知道结果,我们很难指出具体bug在什么地方。建议参考如下。同时也建议单独开一个issue,我的同事会跟踪和反馈。

  1. Precheck your model's activation's maximum values and distributions, some CNN models (usually product-level model ) are very hard for linear post-training quantization method to deployment due to the extremely widespread of activation's distribution.
  2. Make sure the traditional FP32 ncnn model and the INT8 ncnn model parameterized by TRT scales work successfully and show correct results as expected.
  3. Consider some baby steps or unit tests. For instance, you may just optimize the first few layers of CNN, before you run the whole network scales optimization.
  4. Monitor the optimization process by checking the log file.

A5:EQ的scale搜索对于vgg16这样的大模型目前比较慢(每次的推理耗时较多)。我们正准备提供一些像MobileNet这样的小模型来保证可以快速复现。FP32模型的中间结果存取确实可以减少一些搜索耗时。其他的方式还有对对weight每个channel做并行处理,推理时在优化层做early stop操作等。我们会关注进一步的提速问题。

@hset911
Copy link

hset911 commented Jul 8, 2020

Q1:sample是以VGG分类网络示例的,其他类别的网络(比如检测或者人脸模型)也是同样使用imageNet中选取3000校准并且挑选50张做微调吗?还是对数据集有要求?

@fwz-fpga
Copy link

Q1: 如果我现在有ncnn的fp32模型+校准数据1k张图片。怎么把这个EQ工具用起来,得到最优的int8 模型scale呢?我看到工程里是基于caffe model的,ncnn的模型能不能方便的跑起来。

@yunglechao
Copy link
Collaborator

Q1: 如果我现在有ncnn的fp32模型+校准数据1k张图片。怎么把这个EQ工具用起来,得到最优的int8 模型scale呢?我看到工程里是基于caffe model的,ncnn的模型能不能方便的跑起来。

你可以把量化工具中有关caffe net的接口替换成ncnn net进行量化https://github.com/deepglint/EasyQuant/blob/master/tools/caffe_quanttable_e2e.py#L577

@itracy19
Copy link

hi,
请问demo的校准、验证数据格式可以简单同步一下么?

@yunglechao
Copy link
Collaborator

hi,
请问demo的校准、验证数据格式可以简单同步一下么?

First, for ImageNet1k classification task, please download ImageNet2012. We random sampled 3000 calibration images from ImageNet val set to data/calib.txt for KLD quantization and select 50 samples from calib to data/list50.txt for EasyQuant scale finetuning. Then we will evaluate quantified models on val set.

@itracy19
Copy link

hi,
请问demo的校准、验证数据格式可以简单同步一下么?

First, for ImageNet1k classification task, please download ImageNet2012. We random sampled 3000 calibration images from ImageNet val set to data/calib.txt for KLD quantization and select 50 samples from calib to data/list50.txt for EasyQuant scale finetuning. Then we will evaluate quantified models on val set.

Thanks very,much

@itracy19
Copy link

Q1: will you share other demo such as resnet18 .etc?
Q2: is it support Accuracy Layer in eq_ncnn,and would you like to share how to deal with this layer while test the ResNet18 (i am interested in Easy Quant, and i'm tring the resnet18 with Easy Quant)

Thanks

@itracy19
Copy link

Q1: will you share other demo such as resnet18 .etc?
Q2: is it support Accuracy Layer in eq_ncnn,and would you like to share how to deal with this layer while test the ResNet18 (i am interested in Easy Quant, and i'm tring the resnet18 with Easy Quant)

Thanks

Or just disable Accuracy Layer while training the scale,and enable it while validating it?

@aitaoquanyi
Copy link

Q1: benchmark里面mobileface 在公开库上测试的指标量化的校准集是训练数据还是和测试数据无关的数据?tpr是否是同样far下得到的

@huqinghao
Copy link

为了累加不溢出的问题,int8量化累加两次的基础是量化到[-127,127]。对于tf等quantizatio-aware的量化训练来说,[-128,127]的量化就不可以了是吧

@aksenventwo
Copy link

Q1: 想问下,如果不使用对称量化,zp 不恒为 0 的情况下,如何同时搜索 scale 和 zp 呢?

@liu6381810
Copy link

您好,最近在复现,有以下几个细节问题,希望得到您的解答
1.paper中提到的MobileNetV1,VGG16,ResNet50都是使用per-channel的方法量化的吗
2.对于8bit量化,weight量化区间是-127-127,activation区间是0,255 是这样吗?
3.该repo中的3000calibration图片的作用是来初始化吗?在paper中只看到用50张图来搜索

@starimpact
Copy link
Collaborator

@liu6381810 我来回答一下2和3吧。
2. 都是-127-+127
3. 用KLD 3k样本来得到初始化值,然后用50张和EQ来得到最终量化结果。

@starimpact
Copy link
Collaborator

starimpact commented Sep 7, 2020

@aksenventwo 非对称或zp不为0,这个我们没有做过相关的考虑和实验,你可以到网上找找有没有相关的论文。个人判断,考虑它们会让问题更复杂,反而会影响最终的加速。

@starimpact
Copy link
Collaborator

@huqinghao 溢出问题需要从训练和量化时的截断等两个方向去进行解决。溢出有时是不可避免的,但是少量的溢出不会影响结果。

@starimpact
Copy link
Collaborator

starimpact commented Sep 7, 2020

@aitaoquanyi EQ只需要50张图片进行量化调优,这50张太少了,以至于并不能反映任何一个数据集的分布,所以这50张是否从训练集或从测试集搞来的,这一点并不重要。
作为实验比较,一定是在相同条件下的比较。

@liu6381810
Copy link

liu6381810 commented Sep 7, 2020

@liu6381810 我来回答一下2和3吧。
2. 都是-127-+127
3. 用KLD 3k样本来得到初始化值,然后用50张和EQ来得到最终量化结果。

多谢您的回答,还有个问题
目前是只对conv的输入x和a做量化,后续的bn和激活函数还是用的fp32?还是说先吸bn再做量化

常规来讲,bn需要能够被conv合并掉,但这只是从应用角度去考虑。如果从EQ算法本身来讲并不关心这些,EQ是提供了一种更好的量化算法,至于如何去用它,是见仁见智的事情。

@liu6381810
Copy link

liu6381810 commented Sep 7, 2020

@liu6381810 我来回答一下2和3吧。
2. 都是-127-+127
3. 用KLD 3k样本来得到初始化值,然后用50张和EQ来得到最终量化结果。

多谢您的回答,还有个问题
目前是只对conv的输入x和a做量化,后续的bn和激活函数还是用的fp32?还是说先吸bn再做量化

常规来讲,bn需要能够被conv合并掉,但这只是从应用角度去考虑。如果从EQ算法本身来讲并不关心这些,EQ是提供了一种更好的量化算法,至于如何去用它,是见仁见智的事情。

谢谢您的回复!还有个问题就是按照paper来说,初始化直接使用最大值和KLD初始化,在性能上的区别大致有多大。

你可以理解EQ是一种搜索算法,如果你给的初始值不准,会导致必需要用更大的搜索空间。这只是其一。其二,KLD是具有统计意义的,原则上它才是一个更好的初始化方法。activation的最大值有时候真的很大,用这样的值没有意义。

@xieyi4650
Copy link

Q1: 安装相关, , 如果下载编译了eq-ncnn后是不是就不用安装ncnn了?
Q2: 在编译python_ncnn中的修改 "Makefile 开头的变量路径;" 这一步, NCNN_INCLUDE_PATH和NCNN_LIB_PATH是eq-ncnn中build好的文件么?
Q3:如果Q2的回答是yes, 我这边在pyton_ncnn中执行make -j时有错误:
error: 'class ncnn::Net' has no member named 'opt'

我自己build 官方的ncnn, 然后继续在python_ncnn中make, 得到的结果还是, 这次得到的错误信息如下,
ncnn/build/install/include/ncnn/net.h:156:5: error: 'ncnn::Net::Net(const ncnn::Net&)' is private
Net(const Net&);
^
In file included from ncnn2python.cpp:31:0:
ncnn.h:43:7: error: within this context
class Net{
^
In file included from /usr/include/boost/preprocessor/iteration/detail/iter/forward1.hpp:52:0,
from /usr/include/boost/python/object/value_holder.hpp:50,
from /usr/include/boost/python/object/class_metadata.hpp:11,
from /usr/include/boost/python/class.hpp:23,
from /usr/include/boost/python.hpp:18,
from ncnn.h:35,
from ncnn2python.cpp:31:
/usr/include/boost/python/object/value_holder.hpp:137:13: note: synthesized method 'Net::Net(const Net&)' first required here
BOOST_PP_REPEAT_1ST(N, BOOST_PYTHON_UNFORWARD_LOCAL, nil)
^
Makefile:14: recipe for target 'all' failed
make: *** [all] Error 1

所以, python_ncnn这一块怎么build, 比较困惑, 希望能解答

把出问题的net.opt = opt;注释后, 可以正常编译了......

用ncnn跑前向很慢, 在最后一步finetune的时候为什么会用ncnn来做,

@xieyi4650
Copy link

Q4:我运行 example 中vgg16 使用了1000+50张图片的量化方式,之后使用1000张图片作为验证,得出的结果并没有论文中提到的好。top5 0.347 top1 0.187。能否提供一个直接能运行且可跑出论文中类似效果的demo?
Q5:example的EQ量化过程非常慢,我跑了24h以上,且时间主要是用在EQ量化过程中。看代码中可能是inference次数太多,每一层中weigths每个channel100次,activations200次。且原模型与量化模型都要进行inference,如果把原模型每层数据使用存储与读取,会不会对计算量比较大的网络(如vgg16)的速度有所提升?此外,还有没有其他的方法,能使量化过程加快?

你好, 请问这两个问题怎么解决的, 尤其是Q4, 我这边测出来的结果是
fp32_res_dict length: 50000
top5 count: 27595.0
top 1 count: 15595.0
acc_top5: 0.5519
acc_top1: 0.3119

跟未finetune的结果几乎一致.

@Broad-sky
Copy link

Q4:我运行 example 中vgg16 使用了1000+50张图片的量化方式,之后使用1000张图片作为验证,得出的结果并没有论文中提到的好。top5 0.347 top1 0.187。能否提供一个直接能运行且可跑出论文中类似效果的demo?
Q5:example的EQ量化过程非常慢,我跑了24h以上,且时间主要是用在EQ量化过程中。看代码中可能是inference次数太多,每一层中weigths每个channel100次,activations200次。且原模型与量化模型都要进行inference,如果把原模型每层数据使用存储与读取,会不会对计算量比较大的网络(如vgg16)的速度有所提升?此外,还有没有其他的方法,能使量化过程加快?

你好, 请问这两个问题怎么解决的, 尤其是Q4, 我这边测出来的结果是
fp32_res_dict length: 50000
top5 count: 27595.0
top 1 count: 15595.0
acc_top5: 0.5519
acc_top1: 0.3119

跟未finetune的结果几乎一致.

同问

@andeyeluguo
Copy link

用过tensorrt的量化方案,也是圈圈虫同学写的,不过似乎只是对原始的卷积进行量化还可以,对于吸收了bn层的进行量化的话则掉点很严重,不知道这个方案是不是也是这种情况。

@andeyeluguo
Copy link

还有是不是也把bias的量化考虑进去了

@starimpact
Copy link
Collaborator

用过tensorrt的量化方案,也是圈圈虫同学写的,不过似乎只是对原始的卷积进行量化还可以,对于吸收了bn层的进行量化的话则掉点很严重,不知道这个方案是不是也是这种情况。

先要理解EQ原理。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
good first issue Good for newcomers
Projects
None yet
Development

No branches or pull requests