• onnx问题汇总


    1.onnx在windows下使用

       时间节点:2021年7月

      基于Anaconda ,打开并激活pytorch环境,然后按顺序安装。

    conda install -c conda-forge numpy protobuf==3.16.0 libprotobuf=3.16.0
    conda install -c conda-forge onnx
    

      之后安装onnxruntime或者onnxruntime-gpu

    pip install onnxruntime
    或者
    pip install onnxruntime-gpu
    

      俩者差别是运行环境不同。根据自己运行onnx模式环境,适合就好。

    2.onnx 不支持roll 操作符。 

        问题时间节点:2021年7月

     尝试将swin Transformer模型从pytorch导给tensorflow。 运行遇到操作符不支持问题。

    警告信息

    Exporting the operator roll to ONNX opset version 9 is not supported. Please open a bug to request ONNX export support for the missing operator. 

     刚接触onnx,不懂。问朋友之后,可能是onnx支持的操作集问题

    torch.onnx.export(……
                      opset_version=13)
    

      

    还是报错。此处截取onnx的操作集适配机制,方便后来者理解该参数

    _default_onnx_opset_version = 9
    _onnx_main_opset = 13
    _onnx_stable_opsets = [7, 8, 9, 10, 11, 12]
    _export_onnx_opset_version = _default_onnx_opset_version
    
    
    def _set_opset_version(opset_version):
        global _export_onnx_opset_version
        if opset_version == _default_onnx_opset_version:
            _export_onnx_opset_version = opset_version
            return
        if opset_version in _onnx_stable_opsets + [_onnx_main_opset]:
            _export_onnx_opset_version = opset_version
            return
        raise ValueError("Unsupported ONNX opset version: " + str(opset_version))

    感兴趣的可以搜索pytorch源码。 默认=“9” 。 10,11,12 可以理解为基于9的代码拓展。

    经朋友提醒,在pytorch的开源代码搜索到onnx

    https://github.com/pytorch/pytorch/blob/master/test/onnx/test_pytorch_onnx_onnxruntime.py

      def test_roll(self):
            class M(torch.nn.Module):
                def __init__(self, shifts, dims):
                    super(M, self).__init__()
                    self.shifts = shifts
                    self.dims = dims
    
                def forward(self, x):
                    return torch.roll(x, self.shifts, self.dims)
    

      

      onnxruntime已经包含roll的测试。理论上应该支持该操作。尝试在pytorch的官网搜索 roll关键词

    官方roll源码

    import torch.onnx.symbolic_helper as sym_help
    from torch.onnx.symbolic_helper import parse_args, _parse_arg, _unimplemented

    @parse_args('v', 'is', 'is')
    def roll(g, self, shifts, dims):
        assert len(shifts) == len(dims)
    
        result = self
        for i in range(len(shifts)):
            shapes = []
            shape = sym_help._slice_helper(g,
                                           result,
                                           axes=[dims[i]],
                                           starts=[-shifts[i]],
                                           ends=[maxsize])
            shapes.append(shape)
            shape = sym_help._slice_helper(g,
                                           result,
                                           axes=[dims[i]],
                                           starts=[0],
                                           ends=[-shifts[i]])
            shapes.append(shape)
            result = g.op("Concat", *shapes, axis_i=dims[i])
    
        return result

         

          显示torch.onnx的操作集9 已经包含roll操作。
          搜索最新发布版本pytorch。
         1)到pytorch官网搜索最近12天发布的pyotorch版本 。页面显示只到pytorch1.9.0。

          2)尝试到pypi搜索已经发布打包好的pytorch 。 发现pytorch似乎没有类似tensorflow的tf_nightly预览版本 。

         最后,剩下直接修改调用roll的代码,更改为支持onnx的算子。或者编译最新版本pytorch源码。

          -------------------------------------------------------------------------------------------------------

         后面进一步搜索发现如下信息

    4月20号提出roll转换问题 开发者说到已经记录会加入支持 。 

    roll的onnx代码提交 显示5月17号议题经提交支持onnx导出“roll”。pytorch1.9是6月份发布。 所以,感觉基于1.9 还会显示不支持,有点滞后。

       后面再试试

    torch.onnx.export的其余参数。
  • 相关阅读:
    c程序实验报告
    C程序设计实验报告
    第六章 实验报告(函数与宏定义)
    熊承启第五章循环结构实验
    循环结构课后反思
    c语言实验报告
    c语言设计实验报告
    第九章 结构体与共用体
    第八章 指针实验
    数组实验
  • 原文地址:https://www.cnblogs.com/PiaoLingJiLu/p/15036857.html
Copyright © 2020-2023  润新知