OnnxOpConverter

OnnxOpConverter#

import set_env
from tvm.relay.frontend.onnx import OnnxOpConverter
OnnxOpConverter??
Init signature: OnnxOpConverter()
Source:        
class OnnxOpConverter(object):
    """A helper class for holding onnx op converters."""

    @classmethod
    def get_converter(cls, opset):
        """Get converter matches given opset.

        Parameters
        ----------
        opset: int
            opset from model.

        Returns
        -------
        converter, which should be `_impl_vx`. Number x is the biggest
            number smaller than or equal to opset belongs to all support versions.
        """
        versions = [int(d.replace("_impl_v", "")) for d in dir(cls) if "_impl_v" in d]
        versions = sorted(versions + [opset])
        version = versions[max([i for i, v in enumerate(versions) if v == opset]) - 1]
        if hasattr(cls, f"_impl_v{version}"):
            return getattr(cls, f"_impl_v{version}")
        raise NotImplementedError(f"opset version {version} of {cls.__name__} not implemented")
File:           /media/pc/data/lxw/ai/tvm/python/tvm/relay/frontend/onnx.py
Type:           type
Subclasses:     Unary, Elemwise, Pool, BatchNorm, InstanceNorm, Conv, ConvTranspose, GlobalAveragePool, QLinearGlobalAveragePool, GlobalMaxPool, ...

OnnxOpConverter 是用于持有 ONNX op 转换器的辅助类。

包含类方法 get_converter ,用于获取与给定 opset 匹配的转换器。

  • 参数 opset:来自模型的 opset(版本号)。

  • 返回值:转换器,应该是 _impl_vx 的形式,其中 x 是小于或等于 opset 的最大支持版本号。

方法的具体实现如下:

  1. 首先,使用列表推导式从类的 dir() 中获取所有以 "_impl_v" 开头的属性,并将其转换为整数类型,得到版本列表 versions

  2. versions 列表和 [opset] 进行合并,并对合并后的列表进行排序,得到新的 versions 列表。

  3. versions 列表中找到 opset 所在的索引位置,然后取该位置前一个元素的值作为版本号 version

  4. 检查是否存在名为_impl_v{version}的属性,如果存在,则返回该属性对应的转换器。

  5. 如果不存在对应的转换器,抛出 NotImplementedError 异常,并显示未实现的 opset 版本信息。

这段代码的作用是根据给定的 opset 找到相应的转换器,以便在处理 ONNX 模型时进行算子的转换。