11import unittest
22import numpy as np
33from numpy .testing import assert_almost_equal
4- from onnx import helper , onnx_pb as onnx_proto
4+ from onnx import helper , numpy_helper , onnx_pb as onnx_proto , TensorProto
5+ from onnx .reference import ReferenceEvaluator
6+ from onnx .reference .op_run import OpRun
57from onnxruntime_extensions import make_onnx_model
68from onnxruntime_extensions import get_library_path as _get_library_path
79
810import onnxruntime as _ort
911
1012
13+ class NegXPlus1 (OpRun ):
14+ op_domain = "ai.onnx.contrib"
15+
16+ def _run (self , X ):
17+ return (1 - X ,)
18+
19+
1120class TestCudaOps (unittest .TestCase ):
1221 @staticmethod
13- def _create_negpos_test_model (domain = ' ai.onnx.contrib' ):
22+ def _create_negpos_test_model (domain = " ai.onnx.contrib" ):
1423 nodes = [
15- helper .make_node ('Identity' , ['x' ], ['identity1' ]),
16- helper .make_node (
17- 'NegPos' , ['identity1' ], ['neg' , 'pos' ],
18- domain = domain )
24+ helper .make_node ("Identity" , ["x" ], ["identity1" ]),
25+ helper .make_node ("NegPos" , ["identity1" ], ["neg" , "pos" ], domain = domain ),
1926 ]
2027
21- input0 = helper .make_tensor_value_info (
22- 'x' , onnx_proto .TensorProto .FLOAT , [None , None ])
23- output1 = helper .make_tensor_value_info (
24- 'neg' , onnx_proto .TensorProto .FLOAT , [None , None ])
25- output2 = helper .make_tensor_value_info (
26- 'pos' , onnx_proto .TensorProto .FLOAT , [None , None ])
28+ input0 = helper .make_tensor_value_info ("x" , onnx_proto .TensorProto .FLOAT , [None , None ])
29+ output1 = helper .make_tensor_value_info ("neg" , onnx_proto .TensorProto .FLOAT , [None , None ])
30+ output2 = helper .make_tensor_value_info ("pos" , onnx_proto .TensorProto .FLOAT , [None , None ])
2731
28- graph = helper .make_graph (nodes , ' test0' , [input0 ], [output1 , output2 ])
32+ graph = helper .make_graph (nodes , " test0" , [input0 ], [output1 , output2 ])
2933 model = make_onnx_model (graph )
3034 return model
3135
@@ -34,87 +38,116 @@ def test_cuda_negpos(self):
3438 so .register_custom_ops_library (_get_library_path ())
3539 onnx_model = self ._create_negpos_test_model ()
3640 self .assertIn ('op_type: "NegPos"' , str (onnx_model ))
37- sess = _ort .InferenceSession (onnx_model .SerializeToString (),
38- so ,
39- providers = ['CUDAExecutionProvider' ])
40- x = np .array ([[0. , 1. , 1.5 ], [7. , 8. , - 5.5 ]]).astype (np .float32 )
41- neg , pos = sess .run (None , {'x' : x })
41+ sess = _ort .InferenceSession (onnx_model .SerializeToString (), so , providers = ["CUDAExecutionProvider" ])
42+ x = np .array ([[0.0 , 1.0 , 1.5 ], [7.0 , 8.0 , - 5.5 ]]).astype (np .float32 )
43+ neg , pos = sess .run (None , {"x" : x })
4244 diff = x - (neg + pos )
4345 assert_almost_equal (diff , np .zeros (diff .shape ))
4446
4547 @staticmethod
46- def _create_fastgelu_test_model (domain = 'ai.onnx.contrib' ):
47- nodes = [
48- helper .make_node (
49- 'FastGelu' , ['x' , 'bias' ], ['y' ],
50- domain = domain )
51- ]
48+ def _create_fastgelu_test_model (domain = "ai.onnx.contrib" ):
49+ nodes = [helper .make_node ("FastGelu" , ["x" , "bias" ], ["y" ], domain = domain )]
5250
53- input0 = helper .make_tensor_value_info (
54- 'x' , onnx_proto .TensorProto .FLOAT , [])
55- input1 = helper .make_tensor_value_info (
56- 'bias' , onnx_proto .TensorProto .FLOAT , [])
57- output0 = helper .make_tensor_value_info (
58- 'y' , onnx_proto .TensorProto .FLOAT , [])
51+ input0 = helper .make_tensor_value_info ("x" , onnx_proto .TensorProto .FLOAT , [])
52+ input1 = helper .make_tensor_value_info ("bias" , onnx_proto .TensorProto .FLOAT , [])
53+ output0 = helper .make_tensor_value_info ("y" , onnx_proto .TensorProto .FLOAT , [])
5954
60- graph = helper .make_graph (nodes , ' test1' , [input0 , input1 ], [output0 ])
55+ graph = helper .make_graph (nodes , " test1" , [input0 , input1 ], [output0 ])
6156 model = make_onnx_model (graph )
6257 return model
6358
6459 @staticmethod
65- def _create_fastgelu_test_model_f16 (domain = 'ai.onnx.contrib' ):
66- nodes = [
67- helper .make_node (
68- 'FastGelu' , ['x' , 'bias' ], ['y' ],
69- domain = domain )
70- ]
60+ def _create_fastgelu_test_model_f16 (domain = "ai.onnx.contrib" ):
61+ nodes = [helper .make_node ("FastGelu" , ["x" , "bias" ], ["y" ], domain = domain )]
7162
72- input0 = helper .make_tensor_value_info (
73- 'x' , onnx_proto .TensorProto .FLOAT16 , [])
74- input1 = helper .make_tensor_value_info (
75- 'bias' , onnx_proto .TensorProto .FLOAT16 , [])
76- output0 = helper .make_tensor_value_info (
77- 'y' , onnx_proto .TensorProto .FLOAT16 , [])
63+ input0 = helper .make_tensor_value_info ("x" , onnx_proto .TensorProto .FLOAT16 , [])
64+ input1 = helper .make_tensor_value_info ("bias" , onnx_proto .TensorProto .FLOAT16 , [])
65+ output0 = helper .make_tensor_value_info ("y" , onnx_proto .TensorProto .FLOAT16 , [])
7866
79- graph = helper .make_graph (nodes , ' test1' , [input0 , input1 ], [output0 ])
67+ graph = helper .make_graph (nodes , " test1" , [input0 , input1 ], [output0 ])
8068 model = make_onnx_model (graph )
8169 return model
8270
8371 def test_cuda_fastgelu (self ):
8472 eps = _ort .get_available_providers ()
85- if ' CUDAExecutionProvider' in eps :
73+ if " CUDAExecutionProvider" in eps :
8674 so = _ort .SessionOptions ()
8775 so .register_custom_ops_library (_get_library_path ())
8876 onnx_model = self ._create_fastgelu_test_model ()
8977 self .assertIn ('op_type: "FastGelu"' , str (onnx_model ))
90- sess = _ort .InferenceSession (onnx_model .SerializeToString (),
91- so ,
92- providers = ['CUDAExecutionProvider' ])
93- x = np .array ([0. , 1. , 2. , 3. , 4. , 5. ]).astype (np .float32 )
78+ sess = _ort .InferenceSession (onnx_model .SerializeToString (), so , providers = ["CUDAExecutionProvider" ])
79+ x = np .array ([0.0 , 1.0 , 2.0 , 3.0 , 4.0 , 5.0 ]).astype (np .float32 )
9480 bias = np .array ([0.0 , 0.1 , 0.2 , 0.3 , 0.4 , 0.5 ]).astype (np .float32 )
95- expected_y = np .array ([0. , 0.9505811 , 2.1696784 , 3.298689 , 4.399991 , 5.5 ]).astype (np .float32 )
96- y = sess .run (None , {'x' : x , ' bias' : bias })[0 ]
81+ expected_y = np .array ([0.0 , 0.9505811 , 2.1696784 , 3.298689 , 4.399991 , 5.5 ]).astype (np .float32 )
82+ y = sess .run (None , {"x" : x , " bias" : bias })[0 ]
9783 assert_almost_equal (y , expected_y )
9884 else :
99- print ( ' CUDAExecutionProvider not available, test_cuda_fastgelu skipped.' )
85+ print ( " CUDAExecutionProvider not available, test_cuda_fastgelu skipped." )
10086
10187 def test_cuda_fastgelu_f16 (self ):
10288 eps = _ort .get_available_providers ()
103- if ' CUDAExecutionProvider' in eps :
89+ if " CUDAExecutionProvider" in eps :
10490 so = _ort .SessionOptions ()
10591 so .register_custom_ops_library (_get_library_path ())
10692 onnx_model = self ._create_fastgelu_test_model_f16 ()
10793 self .assertIn ('op_type: "FastGelu"' , str (onnx_model ))
108- sess = _ort .InferenceSession (onnx_model .SerializeToString (),
109- so ,
110- providers = ['CUDAExecutionProvider' ])
111- x = np .array ([0. , 1. , 2. , 3. , 4. , 5. ]).astype (np .float16 )
94+ sess = _ort .InferenceSession (onnx_model .SerializeToString (), so , providers = ["CUDAExecutionProvider" ])
95+ x = np .array ([0.0 , 1.0 , 2.0 , 3.0 , 4.0 , 5.0 ]).astype (np .float16 )
11296 bias = np .array ([0.0 , 0.1 , 0.2 , 0.3 , 0.4 , 0.5 ]).astype (np .float16 )
113- expected_y = np .array ([0. , 0.95 , 2.17 , 3.299 , 4.4 , 5.5 ]).astype (np .float16 )
114- y = sess .run (None , {'x' : x , ' bias' : bias })[0 ]
97+ expected_y = np .array ([0.0 , 0.95 , 2.17 , 3.299 , 4.4 , 5.5 ]).astype (np .float16 )
98+ y = sess .run (None , {"x" : x , " bias" : bias })[0 ]
11599 assert_almost_equal (y , expected_y )
116100 else :
117- print ('CUDAExecutionProvider not available, test_cuda_fastgelu_f16 skipped.' )
101+ print ("CUDAExecutionProvider not available, test_cuda_fastgelu_f16 skipped." )
102+
103+ def _negxplus1_cuda (self , itype ):
104+ import onnxruntime
105+
106+ dtype = np .float32 if itype == TensorProto .FLOAT else np .float16
107+ model1 = helper .make_model (
108+ helper .make_graph (
109+ [helper .make_node ("Sub" , ["one" , "X" ], ["Y" ])],
110+ "nd" ,
111+ [helper .make_tensor_value_info ("X" , itype , [None , None , None ])],
112+ [helper .make_tensor_value_info ("Y" , itype , [None , None , None ])],
113+ [numpy_helper .from_array (np .array ([1 ], dtype = dtype ), name = "one" )],
114+ ),
115+ opset_imports = [helper .make_opsetid ("" , 18 )],
116+ ir_version = 9 ,
117+ )
118+
119+ model2 = helper .make_model (
120+ helper .make_graph (
121+ [helper .make_node ("NegXPlus1" , ["X" ], ["Y" ], domain = "ai.onnx.contrib" )],
122+ "nd" ,
123+ [helper .make_tensor_value_info ("X" , itype , [None , None , None ])],
124+ [helper .make_tensor_value_info ("Y" , itype , [None , None , None ])],
125+ ),
126+ opset_imports = [
127+ helper .make_opsetid ("" , 18 ),
128+ helper .make_opsetid ("ai.onnx.contrib" , 1 ),
129+ ],
130+ ir_version = 9 ,
131+ )
132+
133+ dtype = np .float32 if itype == TensorProto .FLOAT else np .float16
134+ x = (np .arange (18 ) - 4 ).reshape ((3 , 2 , 3 )).astype (dtype )
135+
136+ feeds1 = dict (X = x )
137+ ref = ReferenceEvaluator (model1 , new_ops = [NegXPlus1 ])
138+ expected = ref .run (None , feeds1 )[0 ]
139+
140+ opts = onnxruntime .SessionOptions ()
141+ opts .register_custom_ops_library (_get_library_path ())
142+ sess = onnxruntime .InferenceSession (model2 .SerializeToString (), opts , providers = ["CUDAExecutionProvider" ])
143+ got = sess .run (None , feeds1 )[0 ]
144+ assert_almost_equal (expected , got , decimal = 5 )
145+
146+ def test_cuda_negxplus1 (self ):
147+ eps = _ort .get_available_providers ()
148+ if "CUDAExecutionProvider" in eps :
149+ self ._negxplus1_cuda (TensorProto .FLOAT )
150+ self ._negxplus1_cuda (TensorProto .FLOAT16 )
118151
119152
120153if __name__ == "__main__" :
0 commit comments