zl程序教程

您现在的位置是:首页 >  其它

当前栏目

xboot的libonnx环境搭建

环境 搭建
2023-09-11 14:15:47 时间

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

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


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.编译

4.结果

5.验证

进入examples/mnist,执行mnist.


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.
========================================================

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

 其它:

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个算子.


结束!