ModelTC/MQBench

关于量化模型不能进行保存的问题

Closed this issue · 3 comments

嗨 大家好,

今天使用MQBench量化ResNet50网络,量化成功后,想尝试用torch.save方法进行模型的保存,但是出现以下问题:

AttributeError: Can't pickle local object 'add_module_to_qconfg_obs_ctr.<locals>.get_factory_kwargs_baed_on_module_device'

猜测可能是模型中的量化参数导致的

为此,我将model转成带有量化层的网络后,再进行保存,即:(下面代码来自ptq.py文件)

model = get_quantize_model(model, config)
torch.save(model, 'mqbench_resnet50_quanted.pt')

但是发现还是会出现上述的AttributeError问题

因此,我明白可能是转换后的模型无法使用torch.save方法进行保存

目前,我采用的方案是:

  1. 将量化后的网络参数进行保存,即torch.save(model.state_dict(), "mqbench_resnet50_quanted.pt")

  2. 对原始模型使用get_quantize_model得到量化后模型A,

  3. 用A加载量化后模型的参数方式加载。

这样在每次加载量化模型的时候,就需要依赖MQBench进行加载了,我觉得这样可能不大行。(可能我使用方式有问题)

不过我看到了deploy函数,当我执行deploy的时候,出现了:‘AttributeError:'EasyDict' object has no attribute 'deploy'’的问题

这里我也对比了TensorRT对模型进行PTQ量化,需要加载:quant_modules.initialize()

TRT这里如果对量化后的模型进行torch.save()操作,虽然能成功,但模型推理速度很慢

也因此联想到两者(TensorRT和MQBench)的关系

不清楚大家是如何进行模型保存的呢?

希望得到指正,谢谢大家!

Pytorch模型天然不特别适合这种用法,一般导出到ONNX模型来进行版本管理,模型调优、部署等等后续操作。

非常感谢您的回复。我明白了,后续尝试在ONNX上进行模型的处理,谢谢@Tracin

This issue has not received any updates in 120 days. Please reply to this issue if this still unresolved!