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

使用CPU执行时报错 #53

Closed
Menace-Dragon opened this issue Apr 13, 2022 · 18 comments
Closed

使用CPU执行时报错 #53

Menace-Dragon opened this issue Apr 13, 2022 · 18 comments

Comments

@Menace-Dragon
Copy link

我又来了。我尝试在CPU跑ONNX官网model zoo 的 efficientnet-lite4-11.onnx 模型有报错。calibration策略为kl、mse时,quantization/optim/refine.py #582行触发assert,说某算子没有被正确quantize。
我用minmax策略的时候就不会出现这个问题。上述都是在CPU条件下进行的(我这边条件没有GPUhhhh),,

我能通过改动某些代码来解决这个报错吗,还是说我只能先在CPU条件下用minmax策略勒

@ZhangZhiPku
Copy link
Collaborator

不会吧不会吧,2022年了该不会还有人还没有gpu吧

你可以使用云服务器上的gpu,毕竟它便宜的就好像免费的一样
https://www.bilibili.com/video/BV1WS4y1N7Kn

关于这个错误,容我debug一下看看,这好像是不应该发生的错误。refine的第582行执行了强制联合定点,对于concat, add这样的算子,合并定点信息自然要求算子的输入和输出都已经被正确量化了,报错则说明前面的量化流程存在问题。所以你可能不能手动修改refine.py的代码来跑通...

@ZhangZhiPku
Copy link
Collaborator

ZhangZhiPku commented Apr 13, 2022

完了兄弟,在我这里这个网络咋跑都可以...

from ppq import *
from ppq.api import *

d = [torch.rand(1, 224, 224, 3) for _ in range(32)]
setting = QuantizationSetting()
setting.quantize_parameter_setting.calib_algorithm = 'minmax'
setting.quantize_activation_setting.calib_algorithm = 'kl'

ir = quantize_onnx_model(
onnx_import_file='Models/cls_model/efficientnet-lite4-11.onnx',
calib_dataloader=d,
calib_steps=32,
input_shape=[1,224,224,3],
collate_fn=lambda x: x.to('cpu'),
do_quantize=True,
setting=setting,
device='cpu',
platform=TargetPlatform.PPL_CUDA_INT8
)

甚至跑percentile都可以,你之前的错误是因为torch不能处理过多的数据量,你可以把batchsize改成1,这样它就不会有16777216个数了

@Menace-Dragon
Copy link
Author

OHHHHH,忘记说了,我跑的是Extension,就是自定义的MyQuantizer。量化策略很存粹,默认就是Symmetric、POT Scale、Linear、PerTensor、8bit、-128~127、Round_half_up

@ZhangZhiPku
Copy link
Collaborator

ZhangZhiPku commented Apr 13, 2022

你可能是盗版量化器的受害者,你这个策略我还是跑的很开心...

附件是我修改的Myquantier代码
myquantizer.txt

在默认的流程中,TensorQuantizationConfig的状态由Quantizer初始化为Inital, 由CalibrationPass调用Observer将状态激活为ACTIVATE, 由refine.py执行联合定点将部分Config状态转换为slave。

你的报错似乎指向CalibrationPass调用Observer的过程存在问题,或者Quantizer初始化错误。

@Menace-Dragon
Copy link
Author

我的情况有点复杂,目前能用的就是CPU...
由于我是实习生,权限不够接触公司服务器(GPU集群),自己的办公电脑只有集显(跑不了CUDA)... 😞

@ZhangZhiPku
Copy link
Collaborator

我也是cpu跑的,不过你这个情况是不是需要换一个公司

https://www.sensetime.com/cn/join-us

@Menace-Dragon
Copy link
Author

hahaha😱

@ZhangZhiPku
Copy link
Collaborator

或者你可以换几个模型试试
import torchvision
(torchvision.models.alexnet, 'alexnet'),
(torchvision.models.inception_v3, 'inception_v3'),
(torchvision.models.mnasnet0_5, 'mnasnet0_5'),
(torchvision.models.mnasnet1_0, 'mnasnet1_0'),
(torchvision.models.squeezenet1_0, 'squeezenet1_0'),
(torchvision.models.squeezenet1_1, 'squeezenet1_1'),
(torchvision.models.shufflenet_v2_x1_0, 'shufflenet_v2_x1_0'),
(torchvision.models.resnet18, 'resnet18'),
(torchvision.models.resnet34, 'resnet34'),
(torchvision.models.resnet50, 'resnet50'),
(torchvision.models.resnext50_32x4d, 'resnext50_32x4d'),
(torchvision.models.wide_resnet50_2, 'wide_resnet50_2'),
(torchvision.models.googlenet, 'googlenet'),
(torchvision.models.vgg11, 'vgg11'),
(torchvision.models.vgg16, 'vgg16'),
(torchvision.models.mobilenet.mobilenet_v2, 'mobilenet_v2'),

@Menace-Dragon
Copy link
Author

兄弟,我找到问题所在了,问题出在api/setting.py里的per_layer_calibration上。我设为True后,跑漫长的量化就会出问题,,我换了其他onnx模型试的。

然后我设为False后,快速量化,就没有这个问题了。你的Myquantizer 内容和我的几乎一致的

前两天忙别的去了,刚刚才开始调这个issue。基本配置还是CPU,calibration 用的kl

@ZhangZhiPku
Copy link
Collaborator

哦豁,我去看看这个per_layer_calibration是不是出了什么问题,但是你真的知道这个pass在干嘛吗?

@Menace-Dragon
Copy link
Author

emmm,就是逐层calibration,一层一层确定好量化参数吧,,,

@ZhangZhiPku
Copy link
Collaborator

ZhangZhiPku commented Apr 15, 2022

这么高端的技巧都被你发现了?
不过我们还没有发现逐层calibration能够提升精度的网络,虽然此前这个pass没出过啥错误。

@Menace-Dragon
Copy link
Author

还好瞄了一眼,我差点下班开溜了hhhh😲

我跑了minmax 的 per_layer_calibration后analysis显示我量化误差更大... per_layer_calibration是根据学术文章复现的吗,或者个人觉得这有点贪心的意味,局部最优取代全局最优?逐层贪心可能表现得不好hhh

emmmm,所以这个per_layer_calibration会导致谬误吗,还是说还是我自己的问题(我可能昨天改了啥不该改的...)

@ZhangZhiPku
Copy link
Collaborator

如果不打开这个layerwise的calibration,那么每个层会根据浮点结果计算同时得到量化参数,对于网络中的第一层而言,这个估计是合理的;然而对于网络后面的层而言,由于前面的层已经被量化的影响,使用浮点结果估计他们的量化参数是有偏的,layerwise calibration是为了解决这个有偏的问题,它甚至不需要证明,是显而易见的。

至于你设想的全局最优...这两种方法都做不到

@Menace-Dragon
Copy link
Author

ohhhhhhh原来是这样,受教了😀,
再最后叨扰你一下,per_layer_calibration会带来报错吗,我还没解决我的报错,有可能是我自己改动了其他代码导致的

@ZhangZhiPku
Copy link
Collaborator

还不清楚,还没来得及看...

@ZhangZhiPku
Copy link
Collaborator

在使用kl作为observer时,perlayer calibration的确会出现这个问题,虽然我还是不知道为什么,min-max似乎没有这个问题。
但是我认为这个per-layer calibration的逻辑存在问题,这个东西会逐层量化并定点,但其逐层量化的过程没有考虑到联合定点策略,因此其执行仍然是有偏的,为此我们需要将这个pass回炉重做一下。

@Menace-Dragon
Copy link
Author

好吧🤝
项目真的很不错👍,我这边正在尝试把PPQ加入到我们的模型部署pipeline里,所以频繁叨扰你们了,还望见谅。

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

No branches or pull requests

2 participants