3.3.2 生成FP32 Umodel
为了将第三方框架训练后的网络模型量化,需要先将它们转化为量化平台私有格式fp32 Umodel。
注意:基于精度方面考虑输入Calibration-tools的fp32 umodel需要保持BatchNorm层以及Scale层独立。当您利用第三方工具对网络图做一些等价转换优化时,请确保BatchNorm以及Scale层不被提前融合到Convolution。
此阶段的参数设置需要注意:
如果指定了“-D (-dataset )”参数,那么需要保证“-D”参数下的路径正确,同时指定的数据集兼容该网络,否则会有运行错误。
若指定了“-D”参数,则需要修改 prototxt,请参考量化文档对应章节:
使用 data layer 作为输入
正确设置数据预处理
正确设置 lmdb 的路径
在不能提供合法的数据源时,不应该使用“-D”参数(该参数是可选项,不指定会使用随机数据测 试网络转化的正确性,可以在转化后的网络中再手动修改数据来源)
转化模型的时候可以指定参数“–cmp”,使用该参数会比较模型转化的中间格式与原始框架下的模 型计算结果是否一致,增加了模型转化的正确性验证。
此阶段生成fp32 umodel使用的工具为一系列名为ufw.tools.*_to_umodel的python脚本,存放于ufw包中,*号代表不同框架的缩写,可以通过以下命令查看使用帮助:
# Caffe模型转化fp32umodel工具
python3 -m ufw.tools.cf_to_umodel --help
# Darknet模型转化fp32umodel工具
python3 -m ufw.tools.dn_to_umodel --help
# MxNet模型转化fp32umodel工具
python3 -m ufw.tools.mx_to_umodel --help
# ONNX模型转化fp32umodel工具
python3 -m ufw.tools.on_to_umodel --help
# PyTorch模型转化fp32umodel工具
python3 -m ufw.tools.pt_to_umodel --help
# TensorFlow模型转化fp32umodel工具
python3 -m ufw.tools.tf_to_umodel --help
# PaddlePaddle模型转化fp32umdoel工具
python3 -m ufw.tools.pp_to_umodel --help
详细参数说明针对不同框架稍有区别,具体参考下文示例中各框架下的参数解释。
下文示例中模型生成命令已经保存为简单的python脚本,用户可以在这些脚本的基础上修改其中的少量参数完成自己的模型转换,也可以在命令行直接使用python3 -m ufw.tools.**_to_umodel
加参数进行转换。
3.3.2.1 caffe模型转换fp32umodel
SDK目录下examples/calibration/caffemodel_to_fp32umodel_demo/的示例中,演示了如何把Caffe版ResNet50模型转换为fp32 umodel:
# 以resnet50 caffemodel 为例介绍转换为FP32 umodel
'''
This file is only for demonstrate how to use convert tools to convert
caffemodel to umodel.
'''
import os
os.environ['GLOG_minloglevel'] = '2'
import ufw.tools as tools
cf_resnet50 = [
'-m', './models/ResNet-50-test.prototxt',
'-w', './models/ResNet-50-model.caffemodel',
'-s', '(1,3,224,224)',
'-d', 'compilation',
'--cmp'
]
if __name__ == '__main__':
tools.cf_to_umodel(cf_resnet50)
在docker环境下,直接执行:
python3 resnet50_to_umodel.py
在当前文件夹下,新生成 compilation 文件夹,存放新生成的.fp32umodel 与.prototxt。
cf_to_umodel的命令参数:
-m
指向模型文件*.prototxt的路径
-w
指向权重文件*.caffemodel的路径
-i
输入tensor的名称
-o
输出tensor的名称
-s
输入tensor的维度,(N,H,W,C)
-d
输出文件夹的名字
-n
网络的名字
-D
lmdb数据集的位置,没有的话,可以暂时随意填个路径,然后在手动编辑prototxt文件的时候,根据实际的路径来添加
--dyn
是否使用动态编译
--desc
输入tensor dtype类型
--cmp
可选参数,指定是否测试模型转化的中间文件
更多详细内容,请参考《Quantization-Tools-User_Guide》。
3.3.2.2 TensorFlow模型转换fp32 umodel
SDK目录下examples/calibration/tf_to_fp32umodel_demo/的示例中,演示了如何把Tensorflow版resnet50_v2.pb转换为fp32 umodel:
import os
os.environ['GLOG_minloglevel'] = '2'
import ufw.tools as tools
tf_resnet50 = [
'-m', './models/frozen_resnet_v2_50.pb',
'-i', 'input',
'-o', 'resnet_v2_50/predictions/Softmax',
'-s', '(1, 299, 299, 3)',
'-d', 'compilation',
'-n', 'resnet50_v2',
'-D', '../classify_demo/lmdb/imagenet_s/ilsvrc12_val_lmdb_with_preprocess',
'--cmp',
'--no-transform'
]
if __name__ == '__main__':
tools.tf_to_umodel(tf_resnet50)
在docker环境下,直接执行:
python3 resnet50_v2_to_umodel.py
在当前文件夹下,新生成 compilation 文件夹,存放新生成的.fp32umodel 与.prototxt。
tf_to_umodel的命令参数:
args
Description
-m
指向*.pb文件的路径
-i
输入tensor的名称
-o
输出tensor的名称
-s
输入tensor的维度,(N,H,W,C)
-d
输出文件夹的名字
-n
网络的名字
-D
lmdb数据集的位置,没有的话,可以暂时随意填个路径,然后在手动编辑prototxt文件的时候,根据实际的路径来添加
--dyn
可选,使用动态编译
--desc
可选,输入tensor dtype类型
--cmp
可选,指定是否测试模型转化的中间文件
更多详细内容,请参考《Quantization-Tools-User_Guide》。
3.3.2.3 PyTorch模型转换fp32 umodel
SDK目录下examples/calibration/pt_to_fp32umodel_demo/的示例中,演示了如何把PyTorch模型mobilenet_v2.pt转换为fp32 umodel:
import os
os.environ['BMNETP_LOG_LEVEL'] = '3'
import ufw.tools as tools
pt_mobilenet = [
'-m', './models/mobilenet_v2.pt',
'-s', '(1,3,224,224)',
'-d', 'compilation',
'-D', '../classify_demo/lmdb/imagenet_s/ilsvrc12_val_lmdb_with_preprocess',
'--cmp'
]
if __name__ == '__main__':
tools.pt_to_umodel(pt_mobilenet)
在docker环境下,直接执行:
python3 mobilenet_v2_to_umodel.py
在当前文件夹下,新生成 compilation 文件夹,存放新生成的.fp32umodel 与.prototxt。
pt_to_umodel的命令参数:
args
Description
-m
指向*.pt文件的路径
-s
输入tensor的维度,(N,H,W,C)
-d
输出文件夹的名字
-D
lmdb数据集的位置,没有的话,可以暂时随意填个路径,然后在手动编辑prototxt文件的时候,根据实际的路径来添加
--dyn
可选,使用动态编译
--desc
可选,输入tensor dtype类型
--cmp
可选,指定是否测试模型转化的中间文件
更多详细内容,请参考《Quantization-Tools-User_Guide》。
3.3.2.4 MXNet模型转换fp32 umodel
SDK目录下examples/calibration/mx_to_fp32umodel_demo/的示例中,演示了如何把MXNet mobilenet0.25模型转换为fp32 umodel:
import os
os.environ['GLOG_minloglevel'] = '3'
import ufw.tools as tools
mx_mobilenet = [
'-m', './models/mobilenet0.25-symbol.json',
'-w', './models/mobilenet0.25-0000.params',
'-s', '(1,3,128,128)',
'-d', 'compilation',
'-D', '../classify_demo/lmdb/imagenet_s/ilsvrc12_val_lmdb_with_preprocess',
'--cmp'
]
if __name__ == '__main__':
tools.mx_to_umodel(mx_mobilenet)
在docker环境下,直接执行:
python3 mobilenet0.25_to_umodel.py
若不指定-d 参数,则默认在当前文件夹下,新生成 compilation 文件夹,存放新生成的.fp32umodel 与.prototxt。
mx_to_umodel的命令参数:
args
Description
-m
指向*.json文件的路径
-w
指向*.params文件路径
-s
输入tensor的维度,(N,H,W,C)
-d
输出文件夹的名字
-D
lmdb数据集的位置,没有的话,可以暂时随意填个路径,然后在手动编辑prototxt文件的时候,根据实际的路径来添加
--dyn
可选,使用动态编译
--desc
可选,输入tensor dtype类型
--cmp
可选,指定是否测试模型转化的中间文件
更多详细内容,请参考《Quantization-Tools-User_Guide》。
3.3.2.5 Darknet模型转换fp32 umodel
SDK目录下examples/calibration/dn_to_fp32umodel_demo/的示例中,演示了如何把DarkNet YOLOV3模型转换为fp32 umodel。
import ufw.tools as tools
dn_darknet = [
'-m', 'yolov3/yolov3.cfg',
'-w', 'yolov3/yolov3.weights',
'-s', '[[1,3,416,416]]',
'-d', 'compilation'
]
if __name__ == '__main__':
tools.dn_to_umodel(dn_darknet)
运行命令:
此示例程序发布时为了减少发布包体积,原始网络没有随SDK一块发布,要运行此示例需要先下载原始网络:
get_model.sh # download model
python3 yolov3_to_umodel.py
若不指定-d 参数,则默认在当前文件夹下,新生成 compilation 文件夹存放输出的 *.fp32umodel 与 *_bmnetd_test_fp32.prototxt。
更多详细内容,请参考《Quantization-Tools-User_Guide》。
3.3.2.6 ONNX模型转换fp32 umodel
SDK目录下examples/calibration/on_to_fp32umodel_demo/的示例中,演示了如何把ONNX posenet模型转换为fp32 umodel。
import ufw.tools as tools
on_postnet = [
'-m', './models/postnet.onnx',
'-s', '[(1, 80, 256)]',
'-i', '[mel_outputs]',
'-d', 'compilation',
'--cmp'
]
if __name__ == '__main__':
tools.on_to_umodel(on_postnet)
运行命令:
python3 postnet_to_umodel.py
若不指定-d 参数,则默认在当前文件夹下,新生成 compilation 文件夹存放输出的 *.fp32umodel 与 *_bmneto_test_fp32.prototxt。
更多详细内容,请参考《Quantization-Tools-User_Guide》。
3.3.2.7 PaddlePaddle模型转换fp32 umodel
SDK目录下examples/calibration/pp_to_fp32umodel_demo/的示例中,演示了如何把PaddlePaddle OCR模型转换为fp32 umodel。
import os
os.environ['GLOG_minloglevel'] = '3'
import ufw.tools as tools
ppocr_rec = [
'-m', './models/ppocr_mobile_v2.0_rec',
'-s', '[(1,3,32,100)]',
'-i', '[x]',
'-o', '[save_infer_model/scale_0.tmp_1]',
'-d', 'compilation',
'--cmp'
]
if __name__ == '__main__':
tools.pp_to_umodel(ppocr_rec)
运行命令:
python3 ppocr_rec_to_umodel.py
若不指定-d 参数,则默认在当前文件夹下,新生成 compilation 文件夹存放输出的 *.fp32umodel 与 *_bmneto_test_fp32.prototxt。
更多详细内容,请参考《Quantization-Tools-User_Guide》。
最后更新于