PyTorch模型部署踩坑记录
Published:
Last Updated: 2020-08-14
最后更新:2020/8/14
0. 基础知识
- ONNX是一种通用的神经网络交换格式,用于统一不同框架(PyTorch,TensorFlow等)写出的模型,目的是方便测试或者部署,目前ONNX只支持推理。https://github.com/onnx/onnx
- PyTorch转ONNX,https://pytorch.org/docs/stable/onnx.html
- 基于torch.onnx的volksdep开源库,https://github.com/Media-Smart/volksdep
- 相关阅读:开源一年多的模型交换格式ONNX,已经一统框架江湖了?https://zhuanlan.zhihu.com/p/51387600
1. PyTorch模型转ONNX
1.1. 部分Operator不支持问题
1. torch.tril: RuntimeError: Exporting operator tril to ONNX opset version 11 is not supported.
解决方案:暂时使用numpy的tril函数代替,torch.tril() –> torch.from_numpy(np.tril),triu同理
2. KLDivLoss:
解决方案:最新版pytorch里刚刚支持,将issue中的代码复制到相应文件中即可解决 https://github.com/pytorch/pytorch/pull/41858/files
1.2. TracerWarning问题
TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect.
原因以及解决方案
- if else语句。如果Pytorch定义的网络结构太过于灵活,那么转成ONNX的时候很有可能出错。这个报错通常情况下是你的网络结构中出现if else 语句。(https://blog.csdn.net/Einstellung/article/details/105886873)
- 存在参数覆盖(原地修改/计算)。比如在原地修改p[:, 0:2]=torch.sigmoid(p[:, 0:2],声明一个临时变量可解决)(https://blog.csdn.net/weixin_39908946/article/details/106855482)