libonnx是xboot大神的新作,libonnx按图定义模型的计算逻辑解析.onnx模型文件,生成由参数化的节点列表表示,这些节点根据输入和输出形成有向无环图。这相当于许多深度学习框架中的“网络”或“图”。下面我们来试玩儿一下。

ONNX是微软开发的多平台通用机器学习模型格式,下图展示了onnx model在模型训练和部署中的位置。

xboot的libonnx环境搭建_Soft


1.get代码

以下模型仓库任选一个

git clone git@gitee.com:xboot/libonnx.git 
git clone https://gitee.com/xboot/libonnx.git

注:大神的mnist网络模型不是自己训练的,而是来自这里:

https://github.com/onnx/models
https://github.com/onnx/models/blob/master/vision/classification/mnist/model/mnist-8.tar.gz

2.安装依赖:

sudo apt-get install libsdl2-dev
sudo apt-get install libsdl2-gfx-dev

3.编译

xboot的libonnx环境搭建_Soft_02

xboot的libonnx环境搭建_自动驾驶_03

4.结果

xboot的libonnx环境搭建_神经网络_04

5.验证

进入examples/mnist,执行mnist.

xboot的libonnx环境搭建_深度学习_05


mnist使用的算子总结如下,一共用到了12个算子.

===========================12===========================
operator yes 0.

Thread 1 "mnist" hit Breakpoint 2, onnx_run (ctx=0x5555558d5a60) at onnx.c:2127
2127 n->operator(n);
(gdb) display n->operator
1: n->operator = (void (*)(struct onnx_node_t *)) 0x5555555a9f70 <Reshape_operator>
(gdb) c
Continuing.
operator yes 1.

Thread 1 "mnist" hit Breakpoint 2, onnx_run (ctx=0x5555558d5a60) at onnx.c:2127
2127 n->operator(n);
1: n->operator = (void (*)(struct onnx_node_t *)) 0x5555555e1650 <Conv_float32>
(gdb)
Continuing.
operator yes 2.

Thread 1 "mnist" hit Breakpoint 2, onnx_run (ctx=0x5555558d5a60) at onnx.c:2127
2127 n->operator(n);
1: n->operator = (void (*)(struct onnx_node_t *)) 0x555555632920 <Add_7_float32>
(gdb)
Continuing.
operator yes 3.

Thread 1 "mnist" hit Breakpoint 2, onnx_run (ctx=0x5555558d5a60) at onnx.c:2127
2127 n->operator(n);
1: n->operator = (void (*)(struct onnx_node_t *)) 0x5555555fb230 <Relu_float32>
(gdb)
Continuing.
operator yes 4.

Thread 1 "mnist" hit Breakpoint 2, onnx_run (ctx=0x5555558d5a60) at onnx.c:2127
2127 n->operator(n);
1: n->operator = (void (*)(struct onnx_node_t *)) 0x5555555f0380 <MaxPool_float32>
(gdb)
Continuing.
operator yes 5.

Thread 1 "mnist" hit Breakpoint 2, onnx_run (ctx=0x5555558d5a60) at onnx.c:2127
2127 n->operator(n);
1: n->operator = (void (*)(struct onnx_node_t *)) 0x5555555e1650 <Conv_float32>
(gdb)
Continuing.
operator yes 6.

Thread 1 "mnist" hit Breakpoint 2, onnx_run (ctx=0x5555558d5a60) at onnx.c:2127
2127 n->operator(n);
1: n->operator = (void (*)(struct onnx_node_t *)) 0x555555632920 <Add_7_float32>
(gdb)
Continuing.
operator yes 7.

Thread 1 "mnist" hit Breakpoint 2, onnx_run (ctx=0x5555558d5a60) at onnx.c:2127
2127 n->operator(n);
1: n->operator = (void (*)(struct onnx_node_t *)) 0x5555555fb230 <Relu_float32>
(gdb)
Continuing.
operator yes 8.

Thread 1 "mnist" hit Breakpoint 2, onnx_run (ctx=0x5555558d5a60) at onnx.c:2127
2127 n->operator(n);
1: n->operator = (void (*)(struct onnx_node_t *)) 0x5555555f0380 <MaxPool_float32>
(gdb)
Continuing.
operator yes 9.

Thread 1 "mnist" hit Breakpoint 2, onnx_run (ctx=0x5555558d5a60) at onnx.c:2127
2127 n->operator(n);
1: n->operator = (void (*)(struct onnx_node_t *)) 0x5555555a9f70 <Reshape_operator>
(gdb)
Continuing.
operator yes 10.

Thread 1 "mnist" hit Breakpoint 2, onnx_run (ctx=0x5555558d5a60) at onnx.c:2127
2127 n->operator(n);
1: n->operator = (void (*)(struct onnx_node_t *)) 0x555555572090 <MatMul_float32>
(gdb)
Continuing.
operator yes 11.

Thread 1 "mnist" hit Breakpoint 2, onnx_run (ctx=0x5555558d5a60) at onnx.c:2127
2127 n->operator(n);
1: n->operator = (void (*)(struct onnx_node_t *)) 0x555555632920 <Add_7_float32>
(gdb)
Continuing.
========================================================

xboot的libonnx环境搭建_Soft_06

测试用例,进入到libonnx/tests目录:

xboot的libonnx环境搭建_深度学习_07

 其它:

czl@czl-VirtualBox:~/WorkSpace/libonnx/tests$ ./tests pytorch-operator/
Unsupported opset => Add-6 (ai.onnx)
[test_operator_add_broadcast](test_data_set_0) [FAIL]
Unsupported opset => Add-6 (ai.onnx)
[test_operator_add_size1_broadcast](test_data_set_0) [OKAY]
Unsupported opset => Add-6 (ai.onnx)
[test_operator_add_size1_right_broadcast](test_data_set_0) [FAIL]
Unsupported opset => Add-6 (ai.onnx)
[test_operator_add_size1_singleton_broadcast](test_data_set_0) [FAIL]
Unsupported opset => Add-6 (ai.onnx)
[test_operator_addconstant](test_data_set_0) [FAIL]
Unsupported opset => Gemm-6 (ai.onnx)
Unsupported opset => Gemm-6 (ai.onnx)
[test_operator_addmm](test_data_set_0) [FAIL]
Unsupported opset => Add-6 (ai.onnx)
Unsupported opset => Mul-6 (ai.onnx)
Unsupported opset => Tanh-6 (ai.onnx)
Unsupported opset => Sigmoid-6 (ai.onnx)
Unsupported opset => Neg-6 (ai.onnx)
[test_operator_basic](test_data_set_0) [FAIL]
Unsupported opset => Split-6 (ai.onnx)
[test_operator_chunk](test_data_set_0) [FAIL]
Unsupported opset => Clip-6 (ai.onnx)
[test_operator_clip](test_data_set_0) [FAIL]
[test_operator_concat2](test_data_set_0) [OKAY]
[test_operator_conv](test_data_set_0) [OKAY]
Unsupported opset => ConvTranspose-6 (ai.onnx)
[test_operator_convtranspose](test_data_set_0) [FAIL]
[test_operator_exp](test_data_set_0) [OKAY]
[test_operator_flatten](test_data_set_0) [OKAY]
Unsupported opset => Slice-6 (ai.onnx)
Unsupported opset => Squeeze-6 (ai.onnx)
[test_operator_index](test_data_set_0) [OKAY]
[test_operator_max](test_data_set_0) [FAIL]
[test_operator_maxpool](test_data_set_0) [OKAY]
[test_operator_min](test_data_set_0) [OKAY]
Unsupported opset => Gemm-6 (ai.onnx)
[test_operator_mm](test_data_set_0) [FAIL]
Unsupported opset => Add-6 (ai.onnx)
Unsupported opset => Mul-6 (ai.onnx)
[test_operator_non_float_params](test_data_set_0) [FAIL]
Unsupported opset => Pad-6 (ai.onnx)
[test_operator_pad](test_data_set_0) [FAIL]
Unsupported opset => Add-6 (ai.onnx)
Unsupported opset => Mul-6 (ai.onnx)
Unsupported opset => Tanh-6 (ai.onnx)
Unsupported opset => Sigmoid-6 (ai.onnx)
Unsupported opset => Neg-6 (ai.onnx)
[test_operator_params](test_data_set_0) [FAIL]
[test_operator_permute2](test_data_set_0) [OKAY]
Unsupported opset => Pow-6 (ai.onnx)
[test_operator_pow](test_data_set_0) [FAIL]
[test_operator_reduced_mean](test_data_set_0) [OKAY]
[test_operator_reduced_mean_keepdim](test_data_set_0) [OKAY]
[test_operator_reduced_sum](test_data_set_0) [FAIL]
[test_operator_reduced_sum_keepdim](test_data_set_0) [FAIL]
[test_operator_repeat](test_data_set_0) [OKAY]
[test_operator_repeat_dim_overflow](test_data_set_0) [OKAY]
[test_operator_selu](test_data_set_0) [OKAY]
[test_operator_sqrt](test_data_set_0) [OKAY]
[test_operator_symbolic_override](test_data_set_0) [OKAY]
[test_operator_symbolic_override_nested](test_data_set_0) [OKAY]
[test_operator_view](test_data_set_0) [OKAY]
czl@czl-VirtualBox:~/WorkSpace/libonnx/tests$

求解器:

求解器即是加速器后端的抽象,至于为什么叫求解器而不叫backend,xboot大神是这么解释的:

struct onnx_resolver_t对象其实就是所谓的backend,后端什么,在这里结构体取名为struct onnx_resolver_t,其实想表达的是求解器,后端这个词用烂了,感觉并不能看其名知其意,所以换成了求解器,个人觉得,这个词更能表达深度学习加速接口,你可以定义很多求解器,可以优先选择某个求解器,也可以混用求解器。这样表达更到位点。
struct onnx_resolver_t {
const char * name;

void * (*create)(void);
void (*destroy)(void * rctx);

void (*op_Abs)(struct onnx_node_t * n);
void (*op_Acos)(struct onnx_node_t * n);
void (*op_Acosh)(struct onnx_node_t * n);
void (*op_Add)(struct onnx_node_t * n);
void (*op_And)(struct onnx_node_t * n);
void (*op_ArgMax)(struct onnx_node_t * n);
void (*op_ArgMin)(struct onnx_node_t * n);
void (*op_Asin)(struct onnx_node_t * n);
void (*op_Asinh)(struct onnx_node_t * n);
void (*op_Atan)(struct onnx_node_t * n);
void (*op_Atanh)(struct onnx_node_t * n);
void (*op_AveragePool)(struct onnx_node_t * n);
void (*op_BatchNormalization)(struct onnx_node_t * n);
void (*op_BitShift)(struct onnx_node_t * n);
void (*op_Cast)(struct onnx_node_t * n);
void (*op_Ceil)(struct onnx_node_t * n);
void (*op_Clip)(struct onnx_node_t * n);
void (*op_Compress)(struct onnx_node_t * n);
void (*op_Concat)(struct onnx_node_t * n);
void (*op_ConcatFromSequence)(struct onnx_node_t * n);
void (*op_Constant)(struct onnx_node_t * n);
void (*op_ConstantOfShape)(struct onnx_node_t * n);
void (*op_Conv)(struct onnx_node_t * n);
void (*op_ConvInteger)(struct onnx_node_t * n);
void (*op_ConvTranspose)(struct onnx_node_t * n);
void (*op_Cos)(struct onnx_node_t * n);
void (*op_Cosh)(struct onnx_node_t * n);
void (*op_CumSum)(struct onnx_node_t * n);
void (*op_DepthToSpace)(struct onnx_node_t * n);
void (*op_DequantizeLinear)(struct onnx_node_t * n);
void (*op_Det)(struct onnx_node_t * n);
void (*op_Div)(struct onnx_node_t * n);
void (*op_Dropout)(struct onnx_node_t * n);
void (*op_Einsum)(struct onnx_node_t * n);
void (*op_Elu)(struct onnx_node_t * n);
void (*op_Equal)(struct onnx_node_t * n);
void (*op_Erf)(struct onnx_node_t * n);
void (*op_Exp)(struct onnx_node_t * n);
void (*op_Expand)(struct onnx_node_t * n);
void (*op_EyeLike)(struct onnx_node_t * n);
void (*op_Flatten)(struct onnx_node_t * n);
void (*op_Floor)(struct onnx_node_t * n);
void (*op_GRU)(struct onnx_node_t * n);
void (*op_Gather)(struct onnx_node_t * n);
void (*op_GatherElements)(struct onnx_node_t * n);
void (*op_GatherND)(struct onnx_node_t * n);
void (*op_Gemm)(struct onnx_node_t * n);
void (*op_GlobalAveragePool)(struct onnx_node_t * n);
void (*op_GlobalLpPool)(struct onnx_node_t * n);
void (*op_GlobalMaxPool)(struct onnx_node_t * n);
void (*op_Greater)(struct onnx_node_t * n);
void (*op_HardSigmoid)(struct onnx_node_t * n);
void (*op_Hardmax)(struct onnx_node_t * n);
void (*op_Identity)(struct onnx_node_t * n);
void (*op_If)(struct onnx_node_t * n);
void (*op_InstanceNormalization)(struct onnx_node_t * n);
void (*op_IsInf)(struct onnx_node_t * n);
void (*op_IsNaN)(struct onnx_node_t * n);
void (*op_LRN)(struct onnx_node_t * n);
void (*op_LSTM)(struct onnx_node_t * n);
void (*op_LeakyRelu)(struct onnx_node_t * n);
void (*op_Less)(struct onnx_node_t * n);
void (*op_Log)(struct onnx_node_t * n);
void (*op_Loop)(struct onnx_node_t * n);
void (*op_LpNormalization)(struct onnx_node_t * n);
void (*op_LpPool)(struct onnx_node_t * n);
void (*op_MatMul)(struct onnx_node_t * n);
void (*op_MatMulInteger)(struct onnx_node_t * n);
void (*op_Max)(struct onnx_node_t * n);
void (*op_MaxPool)(struct onnx_node_t * n);
void (*op_MaxRoiPool)(struct onnx_node_t * n);
void (*op_MaxUnpool)(struct onnx_node_t * n);
void (*op_Mean)(struct onnx_node_t * n);
void (*op_Min)(struct onnx_node_t * n);
void (*op_Mod)(struct onnx_node_t * n);
void (*op_Mul)(struct onnx_node_t * n);
void (*op_Multinomial)(struct onnx_node_t * n);
void (*op_Neg)(struct onnx_node_t * n);
void (*op_NonMaxSuppression)(struct onnx_node_t * n);
void (*op_NonZero)(struct onnx_node_t * n);
void (*op_Not)(struct onnx_node_t * n);
void (*op_OneHot)(struct onnx_node_t * n);
void (*op_Or)(struct onnx_node_t * n);
void (*op_PRelu)(struct onnx_node_t * n);
void (*op_Pad)(struct onnx_node_t * n);
void (*op_Pow)(struct onnx_node_t * n);
void (*op_QLinearConv)(struct onnx_node_t * n);
void (*op_QLinearMatMul)(struct onnx_node_t * n);
void (*op_QuantizeLinear)(struct onnx_node_t * n);
void (*op_RNN)(struct onnx_node_t * n);
void (*op_RandomNormal)(struct onnx_node_t * n);
void (*op_RandomNormalLike)(struct onnx_node_t * n);
void (*op_RandomUniform)(struct onnx_node_t * n);
void (*op_RandomUniformLike)(struct onnx_node_t * n);
void (*op_Reciprocal)(struct onnx_node_t * n);
void (*op_ReduceL1)(struct onnx_node_t * n);
void (*op_ReduceL2)(struct onnx_node_t * n);
void (*op_ReduceLogSum)(struct onnx_node_t * n);
void (*op_ReduceLogSumExp)(struct onnx_node_t * n);
void (*op_ReduceMax)(struct onnx_node_t * n);
void (*op_ReduceMean)(struct onnx_node_t * n);
void (*op_ReduceMin)(struct onnx_node_t * n);
void (*op_ReduceProd)(struct onnx_node_t * n);
void (*op_ReduceSum)(struct onnx_node_t * n);
void (*op_ReduceSumSquare)(struct onnx_node_t * n);
void (*op_Relu)(struct onnx_node_t * n);
void (*op_Reshape)(struct onnx_node_t * n);
void (*op_Resize)(struct onnx_node_t * n);
void (*op_ReverseSequence)(struct onnx_node_t * n);
void (*op_RoiAlign)(struct onnx_node_t * n);
void (*op_Round)(struct onnx_node_t * n);
void (*op_Scan)(struct onnx_node_t * n);
void (*op_Scatter)(struct onnx_node_t * n);
void (*op_ScatterElements)(struct onnx_node_t * n);
void (*op_ScatterND)(struct onnx_node_t * n);
void (*op_Selu)(struct onnx_node_t * n);
void (*op_SequenceAt)(struct onnx_node_t * n);
void (*op_SequenceConstruct)(struct onnx_node_t * n);
void (*op_SequenceEmpty)(struct onnx_node_t * n);
void (*op_SequenceErase)(struct onnx_node_t * n);
void (*op_SequenceInsert)(struct onnx_node_t * n);
void (*op_SequenceLength)(struct onnx_node_t * n);
void (*op_Shape)(struct onnx_node_t * n);
void (*op_Shrink)(struct onnx_node_t * n);
void (*op_Sigmoid)(struct onnx_node_t * n);
void (*op_Sign)(struct onnx_node_t * n);
void (*op_Sin)(struct onnx_node_t * n);
void (*op_Sinh)(struct onnx_node_t * n);
void (*op_Size)(struct onnx_node_t * n);
void (*op_Slice)(struct onnx_node_t * n);
void (*op_Softplus)(struct onnx_node_t * n);
void (*op_Softsign)(struct onnx_node_t * n);
void (*op_SpaceToDepth)(struct onnx_node_t * n);
void (*op_Split)(struct onnx_node_t * n);
void (*op_SplitToSequence)(struct onnx_node_t * n);
void (*op_Sqrt)(struct onnx_node_t * n);
void (*op_Squeeze)(struct onnx_node_t * n);
void (*op_StringNormalizer)(struct onnx_node_t * n);
void (*op_Sub)(struct onnx_node_t * n);
void (*op_Sum)(struct onnx_node_t * n);
void (*op_Tan)(struct onnx_node_t * n);
void (*op_Tanh)(struct onnx_node_t * n);
void (*op_TfIdfVectorizer)(struct onnx_node_t * n);
void (*op_ThresholdedRelu)(struct onnx_node_t * n);
void (*op_Tile)(struct onnx_node_t * n);
void (*op_TopK)(struct onnx_node_t * n);
void (*op_Transpose)(struct onnx_node_t * n);
void (*op_Trilu)(struct onnx_node_t * n);
void (*op_Unique)(struct onnx_node_t * n);
void (*op_Unsqueeze)(struct onnx_node_t * n);
void (*op_Upsample)(struct onnx_node_t * n);
void (*op_Where)(struct onnx_node_t * n);
void (*op_Xor)(struct onnx_node_t * n);
void (*op_Celu)(struct onnx_node_t * n);
void (*op_DynamicQuantizeLinear)(struct onnx_node_t * n);
void (*op_GreaterOrEqual)(struct onnx_node_t * n);
void (*op_HardSwish)(struct onnx_node_t * n);
void (*op_LessOrEqual)(struct onnx_node_t * n);
void (*op_LogSoftmax)(struct onnx_node_t * n);
void (*op_MeanVarianceNormalization)(struct onnx_node_t * n);
void (*op_NegativeLogLikelihoodLoss)(struct onnx_node_t * n);
void (*op_Range)(struct onnx_node_t * n);
void (*op_Softmax)(struct onnx_node_t * n);
void (*op_SoftmaxCrossEntropyLoss)(struct onnx_node_t * n);
};

基于这层抽象,xboot大神用CPU作为加速引擎实现了一套默认的求解器,定义如下:

struct onnx_resolver_t resolver_default = {
.name = "default",
.create = resolver_default_create,
.destroy = resolver_default_destroy,
.op_Abs = resolver_default_op_Abs,
.op_Acos = resolver_default_op_Acos,
.op_Acosh = resolver_default_op_Acosh,
.op_Add = resolver_default_op_Add,
.op_And = resolver_default_op_And,
.op_ArgMax = resolver_default_op_ArgMax,
.op_ArgMin = resolver_default_op_ArgMin,
.op_Asin = resolver_default_op_Asin,
.op_Asinh = resolver_default_op_Asinh,
.op_Atan = resolver_default_op_Atan,
.op_Atanh = resolver_default_op_Atanh,
.op_AveragePool = resolver_default_op_AveragePool,
.op_BatchNormalization = resolver_default_op_BatchNormalization,
.op_BitShift = resolver_default_op_BitShift,
.op_Cast = resolver_default_op_Cast,
.op_Ceil = resolver_default_op_Ceil,
.op_Clip = resolver_default_op_Clip,
.op_Compress = resolver_default_op_Compress,
.op_Concat = resolver_default_op_Concat,
.op_ConcatFromSequence = resolver_default_op_ConcatFromSequence,
.op_Constant = resolver_default_op_Constant,
.op_ConstantOfShape = resolver_default_op_ConstantOfShape,
.op_Conv = resolver_default_op_Conv,
.op_ConvInteger = resolver_default_op_ConvInteger,
.op_ConvTranspose = resolver_default_op_ConvTranspose,
.op_Cos = resolver_default_op_Cos,
.op_Cosh = resolver_default_op_Cosh,
.op_CumSum = resolver_default_op_CumSum,
.op_DepthToSpace = resolver_default_op_DepthToSpace,
.op_DequantizeLinear = resolver_default_op_DequantizeLinear,
.op_Det = resolver_default_op_Det,
.op_Div = resolver_default_op_Div,
.op_Dropout = resolver_default_op_Dropout,
.op_Einsum = resolver_default_op_Einsum,
.op_Elu = resolver_default_op_Elu,
.op_Equal = resolver_default_op_Equal,
.op_Erf = resolver_default_op_Erf,
.op_Exp = resolver_default_op_Exp,
.op_Expand = resolver_default_op_Expand,
.op_EyeLike = resolver_default_op_EyeLike,
.op_Flatten = resolver_default_op_Flatten,
.op_Floor = resolver_default_op_Floor,
.op_GRU = resolver_default_op_GRU,
.op_Gather = resolver_default_op_Gather,
.op_GatherElements = resolver_default_op_GatherElements,
.op_GatherND = resolver_default_op_GatherND,
.op_Gemm = resolver_default_op_Gemm,
.op_GlobalAveragePool = resolver_default_op_GlobalAveragePool,
.op_GlobalLpPool = resolver_default_op_GlobalLpPool,
.op_GlobalMaxPool = resolver_default_op_GlobalMaxPool,
.op_Greater = resolver_default_op_Greater,
.op_HardSigmoid = resolver_default_op_HardSigmoid,
.op_Hardmax = resolver_default_op_Hardmax,
.op_Identity = resolver_default_op_Identity,
.op_If = resolver_default_op_If,
.op_InstanceNormalization = resolver_default_op_InstanceNormalization,
.op_IsInf = resolver_default_op_IsInf,
.op_IsNaN = resolver_default_op_IsNaN,
.op_LRN = resolver_default_op_LRN,
.op_LSTM = resolver_default_op_LSTM,
.op_LeakyRelu = resolver_default_op_LeakyRelu,
.op_Less = resolver_default_op_Less,
.op_Log = resolver_default_op_Log,
.op_Loop = resolver_default_op_Loop,
.op_LpNormalization = resolver_default_op_LpNormalization,
.op_LpPool = resolver_default_op_LpPool,
.op_MatMul = resolver_default_op_MatMul,
.op_MatMulInteger = resolver_default_op_MatMulInteger,
.op_Max = resolver_default_op_Max,
.op_MaxPool = resolver_default_op_MaxPool,
.op_MaxRoiPool = resolver_default_op_MaxRoiPool,
.op_MaxUnpool = resolver_default_op_MaxUnpool,
.op_Mean = resolver_default_op_Mean,
.op_Min = resolver_default_op_Min,
.op_Mod = resolver_default_op_Mod,
.op_Mul = resolver_default_op_Mul,
.op_Multinomial = resolver_default_op_Multinomial,
.op_Neg = resolver_default_op_Neg,
.op_NonMaxSuppression = resolver_default_op_NonMaxSuppression,
.op_NonZero = resolver_default_op_NonZero,
.op_Not = resolver_default_op_Not,
.op_OneHot = resolver_default_op_OneHot,
.op_Or = resolver_default_op_Or,
.op_PRelu = resolver_default_op_PRelu,
.op_Pad = resolver_default_op_Pad,
.op_Pow = resolver_default_op_Pow,
.op_QLinearConv = resolver_default_op_QLinearConv,
.op_QLinearMatMul = resolver_default_op_QLinearMatMul,
.op_QuantizeLinear = resolver_default_op_QuantizeLinear,
.op_RNN = resolver_default_op_RNN,
.op_RandomNormal = resolver_default_op_RandomNormal,
.op_RandomNormalLike = resolver_default_op_RandomNormalLike,
.op_RandomUniform = resolver_default_op_RandomUniform,
.op_RandomUniformLike = resolver_default_op_RandomUniformLike,
.op_Reciprocal = resolver_default_op_Reciprocal,
.op_ReduceL1 = resolver_default_op_ReduceL1,
.op_ReduceL2 = resolver_default_op_ReduceL2,
.op_ReduceLogSum = resolver_default_op_ReduceLogSum,
.op_ReduceLogSumExp = resolver_default_op_ReduceLogSumExp,
.op_ReduceMax = resolver_default_op_ReduceMax,
.op_ReduceMean = resolver_default_op_ReduceMean,
.op_ReduceMin = resolver_default_op_ReduceMin,
.op_ReduceProd = resolver_default_op_ReduceProd,
.op_ReduceSum = resolver_default_op_ReduceSum,
.op_ReduceSumSquare = resolver_default_op_ReduceSumSquare,
.op_Relu = resolver_default_op_Relu,
.op_Reshape = resolver_default_op_Reshape,
.op_Resize = resolver_default_op_Resize,
.op_ReverseSequence = resolver_default_op_ReverseSequence,
.op_RoiAlign = resolver_default_op_RoiAlign,
.op_Round = resolver_default_op_Round,
.op_Scan = resolver_default_op_Scan,
.op_Scatter = resolver_default_op_Scatter,
.op_ScatterElements = resolver_default_op_ScatterElements,
.op_ScatterND = resolver_default_op_ScatterND,
.op_Selu = resolver_default_op_Selu,
.op_SequenceAt = resolver_default_op_SequenceAt,
.op_SequenceConstruct = resolver_default_op_SequenceConstruct,
.op_SequenceEmpty = resolver_default_op_SequenceEmpty,
.op_SequenceErase = resolver_default_op_SequenceErase,
.op_SequenceInsert = resolver_default_op_SequenceInsert,
.op_SequenceLength = resolver_default_op_SequenceLength,
.op_Shape = resolver_default_op_Shape,
.op_Shrink = resolver_default_op_Shrink,
.op_Sigmoid = resolver_default_op_Sigmoid,
.op_Sign = resolver_default_op_Sign,
.op_Sin = resolver_default_op_Sin,
.op_Sinh = resolver_default_op_Sinh,
.op_Size = resolver_default_op_Size,
.op_Slice = resolver_default_op_Slice,
.op_Softplus = resolver_default_op_Softplus,
.op_Softsign = resolver_default_op_Softsign,
.op_SpaceToDepth = resolver_default_op_SpaceToDepth,
.op_Split = resolver_default_op_Split,
.op_SplitToSequence = resolver_default_op_SplitToSequence,
.op_Sqrt = resolver_default_op_Sqrt,
.op_Squeeze = resolver_default_op_Squeeze,
.op_StringNormalizer = resolver_default_op_StringNormalizer,
.op_Sub = resolver_default_op_Sub,
.op_Sum = resolver_default_op_Sum,
.op_Tan = resolver_default_op_Tan,
.op_Tanh = resolver_default_op_Tanh,
.op_TfIdfVectorizer = resolver_default_op_TfIdfVectorizer,
.op_ThresholdedRelu = resolver_default_op_ThresholdedRelu,
.op_Tile = resolver_default_op_Tile,
.op_TopK = resolver_default_op_TopK,
.op_Transpose = resolver_default_op_Transpose,
.op_Trilu = resolver_default_op_Trilu,
.op_Unique = resolver_default_op_Unique,
.op_Unsqueeze = resolver_default_op_Unsqueeze,
.op_Upsample = resolver_default_op_Upsample,
.op_Where = resolver_default_op_Where,
.op_Xor = resolver_default_op_Xor,
.op_Celu = resolver_default_op_Celu,
.op_DynamicQuantizeLinear = resolver_default_op_DynamicQuantizeLinear,
.op_GreaterOrEqual = resolver_default_op_GreaterOrEqual,
.op_HardSwish = resolver_default_op_HardSwish,
.op_LessOrEqual = resolver_default_op_LessOrEqual,
.op_LogSoftmax = resolver_default_op_LogSoftmax,
.op_MeanVarianceNormalization = resolver_default_op_MeanVarianceNormalization,
.op_NegativeLogLikelihoodLoss = resolver_default_op_NegativeLogLikelihoodLoss,
.op_Range = resolver_default_op_Range,
.op_Softmax = resolver_default_op_Softmax,
.op_SoftmaxCrossEntropyLoss = resolver_default_op_SoftmaxCrossEntropyLoss,
};

计算下来,一共168-5+1=164个算子.


结束!