5.2. FP32 模型生成
目录
编译器 |
功能 |
使用指导 |
bmnetc |
编译Caffe模型 |
|
bmnett |
编译TensorFlow模型 |
|
bmnetm |
编译MXNet模型 |
|
bmnetp |
编译Pytorch模型 |
|
bmnetd |
编译Darknet模型 |
|
bmneto |
编译ONNX模型 |
|
bmpaddle |
编译PaddlePaddle模型 |
|
bmnetu |
编译算丰自定义UFW(Unified Framework)模型 |
在docker环境中执行 source envsetup.sh
后会自动安装以上转换工具,并在当前终端设置相关的环境变量。
注意
对于有些模型,比如paddle-ocr-detection或其他算子中有很多累加或除法的模型,如果在转换过程中打开比对选项,会由于误差累计导致比对结果超出允许的误差阈值范围,从而中断模型转换;还有一些需要排序操作的模型,虽然误差不大,但仍会影响排序的顺序,从而导致比对出错、模型转换中断。对于这些情况,可以在转换过程中关闭cmp参数,不进行数据比对,待模型转换完成后再到业务层面验证转换后模型的精度。
注解
PyTorch模型转换注意事项
什么是JIT(torch.jit):JIT(Just-In-Time)是一组编译工具,用于弥合PyTorch研究与生产之间的差距。它允许创建可以在不依赖Python解释器的情况下运行的模型,并且可以更积极地进行优化。
JIT与BMNETP的关系:BMNETP只接受PyTorch的JIT模型。
如何得到JIT模型:在已有PyTorch的Python模型(基类为torch.nn.Module)的情况下,通过torch.jit.trace得到 torch.jit.trace(python_model,torch.rand(input_shape)).save(‘jit_model’)
为什么不能使用torch.jit.script得到JIT模型:BMNETP暂时不支持带有控制流操作(如if语句或循环)、inplace的操作(如copy_函数等)的JIT模型,但torch.jit.script可以产生这类模型,而torch.jit.trace却不可以,仅跟踪和记录张量上的操作,不会记录任何控制流操作。
为什么不能是GPU模型:BMNETP的编译过程不支持。
如何将GPU模型转成CPU模型? 在加载PyTorch的Python模型时,使用map_location参数 torch.load(python_model, map_location = ‘cpu’)
Darknet模型转换注意事项
cfg 文件中batch/subvision 要大于转换脚本中设置的输入shape的batch size。