前言
以前面文章写到的mobilenet图像分类为例,本文主要记录一下pytorchh训练后静态量化的过程。
一、pytorch静态量化(手动版)
静态量化是最常用的量化形式,float32的模型量化成int8,模型大小大概变为原来的1/4,推理速度我在intel 8700k CPU上测试速度正好快4倍,但是在AMD的5800h CPU 上测试速度反而慢了两倍,应该是AMD不支持某些指令集加速。
踩坑:
之前手动添加量化节点的方式搞了好几天,最后模型是出来了,但是推理时候报错,大多数时候是RuntimeError: Could not run ‘--------’ with arguments from the ‘CPU’ backend,网上是说推理的时候没有安插QuantStub()和DeQuantStub(),可能是用的这个MobilenetV3网络结构复杂,某些地方没有手动添加到,这种方式肯定是可以成功的,只是比较麻烦容易出错。
# 加载模型
model = MobileNetV3_Large(2).to(device) # 加载一个网络,我这边是二分类传了一个2
checkpoint = torch.load(weights, map_location=device)
model.load_state_dict(checkpoint)
model.to('cpu').eval()
合并层对于一些重复使用的Block和nn.Sequential要打印出来看,然后append到mix_list 里面
比如
# 打印model
for name, module in model.named_children():
print(name, module)
比如这里Sequential里面存在conv+bn+relu,append进去的应该是[‘bneck.0.conv1’, ‘bneck.0.bn1’,‘nolinear1’],但是nolinear1是个变量,也就是说某些时候是relu某些时候又不是,这种时候就要一个个分析判断好然后写代码,稍微复杂点就容易出错或者遗漏。
backend = "fbgemm" # x86平台
model.qconfig = torch.quantization.get_default_qconfig(backend)
mix_list = [['conv1','bn1'], ['conv2','bn2']] # 合并层只支持conv+bn conv+relu conv+bn+relu等操作,具体可以查一下,网络中存在的这些操作都append到mix_list里面
model = torch.quantization.fuse_modules(</
PyTorch静态量化与FX自动化:从手动到开箱即用

本文详细记录了从手动PyTorch静态量化遇到的困难,如合并层处理和版本兼容性问题,到使用FX量化工具的便捷体验。作者介绍了FX版本迁移的重要性,并分享了量化模型的完整代码,包括校准和验证过程。最终,量化模型精度略有下降,但便于部署在特定平台.
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



