From 1e3f495a960464d5d60eb78b44de365dfd2950cc Mon Sep 17 00:00:00 2001 From: root Date: Mon, 28 Jun 2021 21:19:09 +0000 Subject: [PATCH 1/9] [Relay to Onnx conversion] * added support for Sigmoid op * added unit test --- python/tvm/contrib/target/onnx.py | 1 + tests/python/contrib/test_onnx.py | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/python/tvm/contrib/target/onnx.py b/python/tvm/contrib/target/onnx.py index b05265fa976a..cf53307ef503 100644 --- a/python/tvm/contrib/target/onnx.py +++ b/python/tvm/contrib/target/onnx.py @@ -667,6 +667,7 @@ def convert_attributes(cls, attrs): "clip": Clip, "expand_dims": Expand, "nn.lrn": LRN, + "sigmoid": rename("Sigmoid"), } diff --git a/tests/python/contrib/test_onnx.py b/tests/python/contrib/test_onnx.py index 3636409f8a06..2bbe23e1b896 100644 --- a/tests/python/contrib/test_onnx.py +++ b/tests/python/contrib/test_onnx.py @@ -530,6 +530,21 @@ def verify_lrn(xshape, size, dtype="float32"): verify_lrn(i, s) +def test_sigmoid(): + """Sigmoid unit test.""" + def verify_sigmoid(dshape, dtype="float32"): + x = relay.var("x", relay.ty.TensorType(dshape, dtype)) + y = relay.sigmoid(x) + func = relay.Function([x], y) + x_data = np.random.uniform(size=dshape).astype(dtype) + verify_results(func, [x_data], "test_sigmoid", rtol=1e-4, atol=1e-4) + + isize = [(1,3,480,640), (1,3,224,224)] + + for i in isize: + verify_sigmoid(i) + + if __name__ == "__main__": test_add() test_bias_add() @@ -554,3 +569,4 @@ def verify_lrn(xshape, size, dtype="float32"): test_clip() test_expand_dims() test_lrn() + test_sigmoid() From 3ac2b91e70b6a24a6517e97b36e02c8351c7e406 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 28 Jun 2021 21:24:28 +0000 Subject: [PATCH 2/9] [Relay to Onnx conversion][Copy] * added support for Copy op * added unit test --- python/tvm/contrib/target/onnx.py | 1 + tests/python/contrib/test_onnx.py | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/python/tvm/contrib/target/onnx.py b/python/tvm/contrib/target/onnx.py index cf53307ef503..1d1e13dd0516 100644 --- a/python/tvm/contrib/target/onnx.py +++ b/python/tvm/contrib/target/onnx.py @@ -668,6 +668,7 @@ def convert_attributes(cls, attrs): "expand_dims": Expand, "nn.lrn": LRN, "sigmoid": rename("Sigmoid"), + "copy": rename("Identity"), } diff --git a/tests/python/contrib/test_onnx.py b/tests/python/contrib/test_onnx.py index 2bbe23e1b896..332751d09e6d 100644 --- a/tests/python/contrib/test_onnx.py +++ b/tests/python/contrib/test_onnx.py @@ -545,6 +545,21 @@ def verify_sigmoid(dshape, dtype="float32"): verify_sigmoid(i) +def test_copy(): + """Copy unit test.""" + def verify_copy(dshape, dtype="float32"): + x = relay.var("x", relay.ty.TensorType(dshape, dtype)) + y = relay.copy(x) + func = relay.Function([x], y) + x_data = np.random.uniform(size=dshape).astype(dtype) + verify_results(func, [x_data], "test_copy", rtol=1e-4, atol=1e-4) + + isize = [(1,3,480,640), (1,3,224,224)] + + for i in isize: + verify_copy(i) + + if __name__ == "__main__": test_add() test_bias_add() @@ -570,3 +585,4 @@ def verify_sigmoid(dshape, dtype="float32"): test_expand_dims() test_lrn() test_sigmoid() + test_copy() From 388c30972348e353c6902fc5a4660658e77965b2 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 28 Jun 2021 21:37:51 +0000 Subject: [PATCH 3/9] [Relay to Onnx conversion][Round] * added support for Round op * added unit test --- python/tvm/contrib/target/onnx.py | 1 + tests/python/contrib/test_onnx.py | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/python/tvm/contrib/target/onnx.py b/python/tvm/contrib/target/onnx.py index 1d1e13dd0516..8c5e24ca6d6c 100644 --- a/python/tvm/contrib/target/onnx.py +++ b/python/tvm/contrib/target/onnx.py @@ -669,6 +669,7 @@ def convert_attributes(cls, attrs): "nn.lrn": LRN, "sigmoid": rename("Sigmoid"), "copy": rename("Identity"), + "round": rename("Round"), } diff --git a/tests/python/contrib/test_onnx.py b/tests/python/contrib/test_onnx.py index 332751d09e6d..b9151947d235 100644 --- a/tests/python/contrib/test_onnx.py +++ b/tests/python/contrib/test_onnx.py @@ -560,6 +560,21 @@ def verify_copy(dshape, dtype="float32"): verify_copy(i) +def test_round(): + """Round unit test.""" + def verify_round(dshape, dtype="float32"): + x = relay.var("x", relay.ty.TensorType(dshape, dtype)) + y = relay.round(x) + func = relay.Function([x], y) + x_data = np.random.uniform(size=dshape).astype(dtype) + verify_results(func, [x_data], "test_round", rtol=1e-4, atol=1e-4) + + isize = [(1,3,480,640), (1,3,224,224)] + + for i in isize: + verify_round(i) + + if __name__ == "__main__": test_add() test_bias_add() @@ -586,3 +601,4 @@ def verify_copy(dshape, dtype="float32"): test_lrn() test_sigmoid() test_copy() + test_round() From 2545ec9993cc7d9b3bb34553fb9e13c9ecad0461 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 28 Jun 2021 21:48:22 +0000 Subject: [PATCH 4/9] [Relay to Onnx conversion][Cast] * added support for Cast op * added unit test --- python/tvm/contrib/target/onnx.py | 12 ++++++++++++ tests/python/contrib/test_onnx.py | 18 ++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/python/tvm/contrib/target/onnx.py b/python/tvm/contrib/target/onnx.py index 8c5e24ca6d6c..0e8d40e6157a 100644 --- a/python/tvm/contrib/target/onnx.py +++ b/python/tvm/contrib/target/onnx.py @@ -24,6 +24,7 @@ import onnx import onnx.utils from onnx import numpy_helper, OperatorSetIdProto, defs +from onnx import TensorProto import tvm from tvm import relay import tvm._ffi @@ -633,6 +634,16 @@ def convert_attributes(cls, attrs): return {"alpha": attrs.alpha, "beta": attrs.beta, "bias": attrs.bias, "size": attrs.size} +class Cast(OpConverter): + """ Operator converter for Cast.""" + + @classmethod + def convert_attributes(cls, attrs): + return { + 'to': getattr(TensorProto, attrs.dtype.upper()) + } + + relay_to_onnx_op_mapping = { "reshape": Reshape, "nn.conv2d": Conv, @@ -670,6 +681,7 @@ def convert_attributes(cls, attrs): "sigmoid": rename("Sigmoid"), "copy": rename("Identity"), "round": rename("Round"), + "cast": Cast, } diff --git a/tests/python/contrib/test_onnx.py b/tests/python/contrib/test_onnx.py index b9151947d235..cd79aaba54b0 100644 --- a/tests/python/contrib/test_onnx.py +++ b/tests/python/contrib/test_onnx.py @@ -575,6 +575,23 @@ def verify_round(dshape, dtype="float32"): verify_round(i) +def test_cast(): + """Cast unit test.""" + def verify_cast(dshape, dtype): + x = relay.var("x", relay.ty.TensorType(dshape, "float32")) + y = relay.cast(x, dtype) + func = relay.Function([x], y) + x_data = np.random.uniform(size=dshape).astype("float32") + verify_results(func, [x_data], "test_cast", rtol=1e-4, atol=1e-4) + + isize = [(1,3,480,640), (1,3,224,224)] + out_dtypes = ['int8', 'int16', 'uint8', 'uint16'] + + for i in isize: + for o_dtype in out_dtypes: + verify_cast(i, o_dtype) + + if __name__ == "__main__": test_add() test_bias_add() @@ -602,3 +619,4 @@ def verify_round(dshape, dtype="float32"): test_sigmoid() test_copy() test_round() + test_cast() From 44ac1317457147847ea0cc3af92a42bacedefc5c Mon Sep 17 00:00:00 2001 From: root Date: Mon, 28 Jun 2021 21:50:09 +0000 Subject: [PATCH 5/9] [Relay to Onnx testing] * fixed formatting --- tests/python/contrib/test_onnx.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/python/contrib/test_onnx.py b/tests/python/contrib/test_onnx.py index cd79aaba54b0..32ee4de5f1f8 100644 --- a/tests/python/contrib/test_onnx.py +++ b/tests/python/contrib/test_onnx.py @@ -516,6 +516,7 @@ def verify_expand_dims(dshape, axis, num_newaxis, dtype="float32"): def test_lrn(): + """LRN unit test.""" def verify_lrn(xshape, size, dtype="float32"): x = relay.var("x", relay.ty.TensorType(xshape, dtype)) y = relay.nn.lrn(x, size=size, axis=1, alpha=1.0, beta=1.0, bias=1.0) From 1b66412ba475af355a44939ba3bf16af550f9798 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 28 Jun 2021 22:01:21 +0000 Subject: [PATCH 6/9] * fixed formatting issues --- tests/python/contrib/test_onnx.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/tests/python/contrib/test_onnx.py b/tests/python/contrib/test_onnx.py index 32ee4de5f1f8..b90e63006e27 100644 --- a/tests/python/contrib/test_onnx.py +++ b/tests/python/contrib/test_onnx.py @@ -517,6 +517,7 @@ def verify_expand_dims(dshape, axis, num_newaxis, dtype="float32"): def test_lrn(): """LRN unit test.""" + def verify_lrn(xshape, size, dtype="float32"): x = relay.var("x", relay.ty.TensorType(xshape, dtype)) y = relay.nn.lrn(x, size=size, axis=1, alpha=1.0, beta=1.0, bias=1.0) @@ -533,6 +534,7 @@ def verify_lrn(xshape, size, dtype="float32"): def test_sigmoid(): """Sigmoid unit test.""" + def verify_sigmoid(dshape, dtype="float32"): x = relay.var("x", relay.ty.TensorType(dshape, dtype)) y = relay.sigmoid(x) @@ -540,7 +542,7 @@ def verify_sigmoid(dshape, dtype="float32"): x_data = np.random.uniform(size=dshape).astype(dtype) verify_results(func, [x_data], "test_sigmoid", rtol=1e-4, atol=1e-4) - isize = [(1,3,480,640), (1,3,224,224)] + isize = [(1, 3, 480, 640), (1, 3, 224, 224)] for i in isize: verify_sigmoid(i) @@ -548,6 +550,7 @@ def verify_sigmoid(dshape, dtype="float32"): def test_copy(): """Copy unit test.""" + def verify_copy(dshape, dtype="float32"): x = relay.var("x", relay.ty.TensorType(dshape, dtype)) y = relay.copy(x) @@ -555,7 +558,7 @@ def verify_copy(dshape, dtype="float32"): x_data = np.random.uniform(size=dshape).astype(dtype) verify_results(func, [x_data], "test_copy", rtol=1e-4, atol=1e-4) - isize = [(1,3,480,640), (1,3,224,224)] + isize = [(1, 3, 480, 640), (1, 3, 224, 224)] for i in isize: verify_copy(i) @@ -563,6 +566,7 @@ def verify_copy(dshape, dtype="float32"): def test_round(): """Round unit test.""" + def verify_round(dshape, dtype="float32"): x = relay.var("x", relay.ty.TensorType(dshape, dtype)) y = relay.round(x) @@ -570,7 +574,7 @@ def verify_round(dshape, dtype="float32"): x_data = np.random.uniform(size=dshape).astype(dtype) verify_results(func, [x_data], "test_round", rtol=1e-4, atol=1e-4) - isize = [(1,3,480,640), (1,3,224,224)] + isize = [(1, 3, 480, 640), (1, 3, 224, 224)] for i in isize: verify_round(i) @@ -578,6 +582,7 @@ def verify_round(dshape, dtype="float32"): def test_cast(): """Cast unit test.""" + def verify_cast(dshape, dtype): x = relay.var("x", relay.ty.TensorType(dshape, "float32")) y = relay.cast(x, dtype) @@ -585,8 +590,8 @@ def verify_cast(dshape, dtype): x_data = np.random.uniform(size=dshape).astype("float32") verify_results(func, [x_data], "test_cast", rtol=1e-4, atol=1e-4) - isize = [(1,3,480,640), (1,3,224,224)] - out_dtypes = ['int8', 'int16', 'uint8', 'uint16'] + isize = [(1, 3, 480, 640), (1, 3, 224, 224)] + out_dtypes = ["int8", "int16", "uint8", "uint16"] for i in isize: for o_dtype in out_dtypes: From 8a6faaae90a9478a8bd5a70100a5d81aae8d4fef Mon Sep 17 00:00:00 2001 From: root Date: Mon, 28 Jun 2021 22:05:55 +0000 Subject: [PATCH 7/9] * fixed formatting issue in onnx.py --- python/tvm/contrib/target/onnx.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/python/tvm/contrib/target/onnx.py b/python/tvm/contrib/target/onnx.py index 0e8d40e6157a..94b9d9dd2e61 100644 --- a/python/tvm/contrib/target/onnx.py +++ b/python/tvm/contrib/target/onnx.py @@ -639,9 +639,7 @@ class Cast(OpConverter): @classmethod def convert_attributes(cls, attrs): - return { - 'to': getattr(TensorProto, attrs.dtype.upper()) - } + return {"to": getattr(TensorProto, attrs.dtype.upper())} relay_to_onnx_op_mapping = { From 736e937e9d0202d5362afff9c5de1a71fa30919e Mon Sep 17 00:00:00 2001 From: root Date: Tue, 29 Jun 2021 18:05:09 +0000 Subject: [PATCH 8/9] [Relay to Onnx conversion][Conv2d Transpose] * Added support for conv2d transpose operator * Added unit test case. Unit test is similar to the conv2d unit test. --- python/tvm/contrib/target/onnx.py | 15 +++++++++ tests/python/contrib/test_onnx.py | 52 +++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+) diff --git a/python/tvm/contrib/target/onnx.py b/python/tvm/contrib/target/onnx.py index 94b9d9dd2e61..dfb9d72e6abf 100644 --- a/python/tvm/contrib/target/onnx.py +++ b/python/tvm/contrib/target/onnx.py @@ -139,6 +139,20 @@ def convert_attributes(cls, attrs): } +class ConvTranspose(OpConverter): + """Operator converter for ConvTranspose.""" + + @classmethod + def convert_attributes(cls, attrs): + return { + "group": attrs.get_int("groups"), + "pads": attrs.get_int_tuple("padding"), + "strides": attrs.get_int_tuple("strides"), + "dilations": attrs.get_int_tuple("dilation"), + "kernel_shape": attrs.get_int_tuple("kernel_size"), + "output_padding": attrs.get_int_tuple("output_padding"), + } + class MaxPool(OpConverter): """Operator converter for MaxPool.""" @@ -645,6 +659,7 @@ def convert_attributes(cls, attrs): relay_to_onnx_op_mapping = { "reshape": Reshape, "nn.conv2d": Conv, + "nn.conv2d_transpose": ConvTranspose, "add": rename("Add"), "nn.relu": rename("Relu"), "transpose": Transpose, diff --git a/tests/python/contrib/test_onnx.py b/tests/python/contrib/test_onnx.py index b90e63006e27..b85519aa3cca 100644 --- a/tests/python/contrib/test_onnx.py +++ b/tests/python/contrib/test_onnx.py @@ -174,6 +174,57 @@ def verify_conv2d( verify_conv2d("float32", 1, dshape, kshape, padding=(1, 1), channels=10, kernel_size=(4, 4)) +def test_conv2d_transpose(): + """Conv2d_Transpose unit tests.""" + def verify_conv2d_transpose( + dtype, scale, dshape, kshape, + padding=(1, 1), groups=1, dilation=(1, 1), **attrs + ): + x = relay.var("x", shape=dshape, dtype=dtype) + w = relay.var("w", shape=kshape, dtype=dtype) + y = relay.nn.conv2d_transpose(x, w, padding=padding, + dilation=dilation, groups=groups, **attrs) + func = relay.Function([x, w], y) + data = np.random.uniform(-scale, scale, size=dshape).astype(dtype) + kernel = np.random.uniform(-scale, scale, size=kshape).astype(dtype) + verify_results(func, [data, kernel], "test_conv2d_transpose", rtol=1e-5, atol=1e-5) + + dshape = (1, 3, 224, 224) + kshape = (3, 10, 3, 3) + verify_conv2d_transpose( + "float32", 1, dshape, kshape, padding=(1, 1), + channels=10, kernel_size=(3, 3) + ) + + dshape = (1, 3, 224, 224) + kshape = (3, 10, 3, 3) + verify_conv2d_transpose( + "float32", 1, dshape, kshape, padding=(2, 2), + channels=10, kernel_size=(3, 3) + ) + + dshape = (1, 3, 18, 18) + kshape = (3, 10, 2, 2) + verify_conv2d_transpose( + "float32", 1, dshape, kshape, padding=(2, 2), + channels=10, kernel_size=(2, 2), dilation=(1, 1), + ) + + dshape = (1, 3, 18, 18) + kshape = (3, 10, 4, 4) + verify_conv2d_transpose( + "float32", 1, dshape, kshape, padding=(1, 1), + channels=10, kernel_size=(4, 4) + ) + + dshape = (1, 3, 18, 18) + kshape = (3, 10, 4, 4) + verify_conv2d_transpose( + "float32", 1, dshape, kshape, padding=(1, 1), + channels=10, kernel_size=(4, 4) + ) + + def test_reshape(): def verify_reshape(shape, newshape): x = relay.var("x", relay.TensorType(shape, "float32")) @@ -602,6 +653,7 @@ def verify_cast(dshape, dtype): test_add() test_bias_add() test_conv2d() + test_conv2d_transpose() test_reshape() test_transpose() test_dense() From 3fd97c68b322450f5d54fa0d18611d87c431e34c Mon Sep 17 00:00:00 2001 From: root Date: Tue, 29 Jun 2021 19:00:19 +0000 Subject: [PATCH 9/9] * Fixed formatting errors --- python/tvm/contrib/target/onnx.py | 1 + tests/python/contrib/test_onnx.py | 31 +++++++++++++++++-------------- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/python/tvm/contrib/target/onnx.py b/python/tvm/contrib/target/onnx.py index dfb9d72e6abf..3f1d81894fc5 100644 --- a/python/tvm/contrib/target/onnx.py +++ b/python/tvm/contrib/target/onnx.py @@ -153,6 +153,7 @@ def convert_attributes(cls, attrs): "output_padding": attrs.get_int_tuple("output_padding"), } + class MaxPool(OpConverter): """Operator converter for MaxPool.""" diff --git a/tests/python/contrib/test_onnx.py b/tests/python/contrib/test_onnx.py index b85519aa3cca..8633615ffa23 100644 --- a/tests/python/contrib/test_onnx.py +++ b/tests/python/contrib/test_onnx.py @@ -176,14 +176,15 @@ def verify_conv2d( def test_conv2d_transpose(): """Conv2d_Transpose unit tests.""" + def verify_conv2d_transpose( - dtype, scale, dshape, kshape, - padding=(1, 1), groups=1, dilation=(1, 1), **attrs + dtype, scale, dshape, kshape, padding=(1, 1), groups=1, dilation=(1, 1), **attrs ): x = relay.var("x", shape=dshape, dtype=dtype) w = relay.var("w", shape=kshape, dtype=dtype) - y = relay.nn.conv2d_transpose(x, w, padding=padding, - dilation=dilation, groups=groups, **attrs) + y = relay.nn.conv2d_transpose( + x, w, padding=padding, dilation=dilation, groups=groups, **attrs + ) func = relay.Function([x, w], y) data = np.random.uniform(-scale, scale, size=dshape).astype(dtype) kernel = np.random.uniform(-scale, scale, size=kshape).astype(dtype) @@ -192,36 +193,38 @@ def verify_conv2d_transpose( dshape = (1, 3, 224, 224) kshape = (3, 10, 3, 3) verify_conv2d_transpose( - "float32", 1, dshape, kshape, padding=(1, 1), - channels=10, kernel_size=(3, 3) + "float32", 1, dshape, kshape, padding=(1, 1), channels=10, kernel_size=(3, 3) ) dshape = (1, 3, 224, 224) kshape = (3, 10, 3, 3) verify_conv2d_transpose( - "float32", 1, dshape, kshape, padding=(2, 2), - channels=10, kernel_size=(3, 3) + "float32", 1, dshape, kshape, padding=(2, 2), channels=10, kernel_size=(3, 3) ) dshape = (1, 3, 18, 18) kshape = (3, 10, 2, 2) verify_conv2d_transpose( - "float32", 1, dshape, kshape, padding=(2, 2), - channels=10, kernel_size=(2, 2), dilation=(1, 1), + "float32", + 1, + dshape, + kshape, + padding=(2, 2), + channels=10, + kernel_size=(2, 2), + dilation=(1, 1), ) dshape = (1, 3, 18, 18) kshape = (3, 10, 4, 4) verify_conv2d_transpose( - "float32", 1, dshape, kshape, padding=(1, 1), - channels=10, kernel_size=(4, 4) + "float32", 1, dshape, kshape, padding=(1, 1), channels=10, kernel_size=(4, 4) ) dshape = (1, 3, 18, 18) kshape = (3, 10, 4, 4) verify_conv2d_transpose( - "float32", 1, dshape, kshape, padding=(1, 1), - channels=10, kernel_size=(4, 4) + "float32", 1, dshape, kshape, padding=(1, 1), channels=10, kernel_size=(4, 4) )