PaddleSlim icon indicating copy to clipboard operation
PaddleSlim copied to clipboard

paddleslim动态量化结果不如预期

Open levinzhangyd opened this issue 3 years ago • 8 comments

hi, 初学深度学习,从github上拿了一个pytorch模型文件(大概170M),转换成paddle模型后,大小差不多。 使用动态图量化后,权重文件减小并不明显,减小到137M。模型使用resnet-18,和文档介绍的1/4相差较多。

目前来看,没有达到预期的优化结果,我是想把模型往移动端进行移植,但是目前的大小无法进行移动端的开发 1.想咨询下是我优化方法不对,还是本身的动态图离线量化就只能做到这种程度? 2.看到释放了最新的paddleslim,但是还是无法安装成功(2.2安装ok)

levinzhangyd avatar Jul 08 '22 06:07 levinzhangyd

@levinzhangyd

  • 量化训练完保存的weight是int8范围内的fp32格式,所以模型大小看不出多少变化,使用paddlelite部署的话,转成nb文件后可以看到模型体积会减少2-4倍之间。
  • 是安装paddleslim 2.3.1失败吗?

yghstill avatar Jul 08 '22 08:07 yghstill

1.有转成nb文件,转换后nb文件还是137M.和paddle模型的大小一致 2.安装paddleslim 2.3.0 和2.3.1都不行

levinzhangyd avatar Jul 08 '22 09:07 levinzhangyd

@levinzhangyd 安装失败的报错麻烦发一下

yghstill avatar Jul 08 '22 09:07 yghstill

  • 安装失败不是关键问题,重点还是想请教下量化后压缩没有达到预期的问题
  • 安装报错信息:

Building wheels for collected packages: pyrfr Building wheel for pyrfr (setup.py) ... error ERROR: Command errored out with exit status 1: command: 'C:\Users\uidq5147.conda\envs\paddle_new\python.exe' -u -c 'import io, os, sys, setuptools, tokenize; sys.argv[0] = '"'"'C:\Users\uidq5147\AppData\Local\Temp\pip-install-iwv7990f\pyrfr_f6dd46c9a41843d496ba4d23e9308f51\setup.py'"'"'; file='"'"'C:\Users\uidq5147\AppData\Local\Temp\pip-install-iwv7990f\pyrfr_f6dd46c9a41843d496ba4d23e9308f51\setup.py'"'"';f = getattr(tokenize, '"'"'open'"'"', open)(file) if os.path.exists(file) else io.StringIO('"'"'from setuptools import setup; setup()'"'"');code = f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, file, '"'"'exec'"'"'))' bdist_wheel -d 'C:\Users\uidq5147\AppData\Local\Temp\pip-wheel-2kiwvaow' cwd: C:\Users\uidq5147\AppData\Local\Temp\pip-install-iwv7990f\pyrfr_f6dd46c9a41843d496ba4d23e9308f51
Complete output (8 lines): [<setuptools.extension.Extension('pyrfr._regression') at 0x1ed17aa0cd0>, <setuptools.extension.Extension('pyrfr._util') at 0x1ed17aa0d00>] running bdist_wheel running build running build_ext building 'pyrfr._regression' extension swigging pyrfr/regression.i to pyrfr/regression_wrap.cpp swig.exe -python -c++ -modern -py3 -features nondynamic -I./include -o pyrfr/regression_wrap.cpp pyrfr/regression.i error: command 'swig.exe' failed: None

ERROR: Failed building wheel for pyrfr Running setup.py clean for pyrfr

levinzhangyd avatar Jul 11 '22 02:07 levinzhangyd

@levinzhangyd 量化后的模型用netron可视化看下conv和fc前面是不是都有fake_quant_xxx的节点,有的话说明都量化了,这样的话转nb模型至少压缩2-4倍。

yghstill avatar Jul 11 '22 08:07 yghstill

@yghstill 找到一个其他模型,量化后可以减小到1/3左右(Bit_8),但是使用netron可视化之后,发现量化后也没有fake_quant的标记。 转换代码如下: ` def quantize_pp_module(self, module_dir, out_module_dir, weight_bite=8): paddle.enable_static() print("") print("start quant optimize, weight_bite", weight_bite) print("start quant optimize, output_path =", out_module_dir) # 动态量化 model_filename = r"model.pdmodel" params_filename = r"model.pdiparams" quant_post_dynamic( model_dir=self.get_path_by_str(module_dir), # 输入模型路径 save_model_dir=self.get_path_by_str(out_module_dir), # 输出模型路径 model_filename=model_filename, # 输入模型计算图文件名称 params_filename=params_filename, # 输入模型参数文件名称 save_model_filename=model_filename, # 输出模型计算图名称 save_params_filename=params_filename, # 输出模型参数文件名称 weight_bits=weight_bite, # 量化比特数 8/16 对应 INT8/16 类型 ) print("")

`

levinzhangyd avatar Jul 14 '22 11:07 levinzhangyd

@yghstill 找到一个其他模型,量化后可以减小到1/3左右(Bit_8),但是使用netron可视化之后,发现量化后也没有fake_quant的标记。 转换代码如下: ` def quantize_pp_module(self, module_dir, out_module_dir, weight_bite=8): paddle.enable_static() print("") print("start quant optimize, weight_bite", weight_bite) print("start quant optimize, output_path =", out_module_dir) # 动态量化 model_filename = r"model.pdmodel" params_filename = r"model.pdiparams" quant_post_dynamic( model_dir=self.get_path_by_str(module_dir), # 输入模型路径 save_model_dir=self.get_path_by_str(out_module_dir), # 输出模型路径 model_filename=model_filename, # 输入模型计算图文件名称 params_filename=params_filename, # 输入模型参数文件名称 save_model_filename=model_filename, # 输出模型计算图名称 save_params_filename=params_filename, # 输出模型参数文件名称 weight_bits=weight_bite, # 量化比特数 8/16 对应 INT8/16 类型 ) print("")

`

方便发一下两个模型我们看下吗?

ceci3 avatar Jul 15 '22 03:07 ceci3

@yghstill 非常感谢您的帮助,原始资源如下: 链接:https://pan.baidu.com/s/1b0XaOS0fxcMxUxD6IEF1CQ 提取码:iqqs

model.7z上传了最近的两个模型: origin为原始模型,使用paddle测试代码亲测可以run起来(测试脚本见链接) optimize为原始模型使用paddleslim转化生成的模型 有两个问题: 1.optimize目录下的模型大小,和之前的预期不符合(缩小到接近1/4) 2.optimize优化后,貌似确实有轻微体积优化,但是运行的时候跑不起来。提示paddle不支持转换后的算子输入 出错提示如下: RuntimeError: (NotFound) Operator (conv2d) does not have kernel for data_type[int8_t]:data_layout[ANY_LAYOUT]:place[CPUPlace]:library_type[PLAIN]. [Hint: Expected kernel_iter != kernels.end(), but received kernel_iter == kernels.end().] (at C:\home\workspace\Paddle_release\paddle\fluid\framework\operator.cc:1296) [operator < conv2d > error] [operator < run_program > error] quant_success.7z量化后体积能变小符合预期的模型,实测跑不起来,仅供参考使用

特别说明:所有的模型使用netron可视化,都没有看到quant_fake之类的字段。

levinzhangyd avatar Jul 15 '22 06:07 levinzhangyd