PyTorch模型部署踩坑记录

less than 1 minute read

Published:

Last Updated: 2020-08-14

最后更新:2020/8/14

0. 基础知识

  1. ONNX是一种通用的神经网络交换格式,用于统一不同框架(PyTorch,TensorFlow等)写出的模型,目的是方便测试或者部署,目前ONNX只支持推理。https://github.com/onnx/onnx
  2. PyTorch转ONNX,https://pytorch.org/docs/stable/onnx.html
  3. 基于torch.onnx的volksdep开源库,https://github.com/Media-Smart/volksdep
  4. 相关阅读:开源一年多的模型交换格式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.

原因以及解决方案

  1. if else语句。如果Pytorch定义的网络结构太过于灵活,那么转成ONNX的时候很有可能出错。这个报错通常情况下是你的网络结构中出现if else 语句。(https://blog.csdn.net/Einstellung/article/details/105886873)
  2. 存在参数覆盖(原地修改/计算)。比如在原地修改p[:, 0:2]=torch.sigmoid(p[:, 0:2],声明一个临时变量可解决)(https://blog.csdn.net/weixin_39908946/article/details/106855482)