This is an automated email from the ASF dual-hosted git repository.
junrushao pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tvm.git
The following commit(s) were added to refs/heads/main by this push:
new 2e6e7dc [Frontend][MXNet] Add support for MXNet GroupNorm (#7409)
2e6e7dc is described below
commit 2e6e7dc1c4e9ffc0c50ce25396efd972e0b145b9
Author: Trevor Morris <[email protected]>
AuthorDate: Sat Feb 13 13:53:22 2021 -0800
[Frontend][MXNet] Add support for MXNet GroupNorm (#7409)
* Add support for MXNet GroupNorm
* Fix python lint
* Fix lint
---
python/tvm/relay/frontend/mxnet.py | 14 +++++++++++++
tests/python/frontend/mxnet/test_forward.py | 32 +++++++++++++++++++++++++++++
2 files changed, 46 insertions(+)
diff --git a/python/tvm/relay/frontend/mxnet.py
b/python/tvm/relay/frontend/mxnet.py
index b272ead..0c9d2c4 100644
--- a/python/tvm/relay/frontend/mxnet.py
+++ b/python/tvm/relay/frontend/mxnet.py
@@ -495,6 +495,19 @@ def _mx_layer_norm(inputs, attrs):
return _op.nn.layer_norm(*inputs, **new_attrs)
+def _mx_group_norm(inputs, attrs):
+ assert len(inputs) == 3
+ if attrs.get_bool("output_mean_var", False):
+ raise tvm.error.OpAttributeUnimplemented(
+ 'Attribute "output_mean_var" is not supported for operator Group
Norm.'
+ )
+ new_attrs = {}
+ new_attrs["axis"] = 1
+ new_attrs["num_groups"] = attrs.get_int("num_groups", 1)
+ new_attrs["epsilon"] = attrs.get_float("eps", 1e-5)
+ return _op.nn.group_norm(*inputs, **new_attrs)
+
+
def _mx_slice(inputs, attrs):
new_attrs = {}
begin = list(attrs.get_int_tuple("begin", None))
@@ -2599,6 +2612,7 @@ _convert_map = {
"_contrib_SyncBatchNorm": _mx_batch_norm,
"InstanceNorm": _mx_instance_norm,
"LayerNorm": _mx_layer_norm,
+ "GroupNorm": _mx_group_norm,
"LRN": _mx_lrn,
"L2Normalization": _mx_l2_normalize,
"slice": _mx_slice,
diff --git a/tests/python/frontend/mxnet/test_forward.py
b/tests/python/frontend/mxnet/test_forward.py
index 537349e..3e652cf 100644
--- a/tests/python/frontend/mxnet/test_forward.py
+++ b/tests/python/frontend/mxnet/test_forward.py
@@ -1264,6 +1264,38 @@ def test_forward_layer_norm():
@tvm.testing.uses_gpu
+def test_forward_group_norm():
+ def verify(shape, num_groups=1):
+ x = np.random.uniform(size=shape).astype("float32")
+ gamma = np.random.uniform(size=(shape[1])).astype("float32")
+ beta = np.random.uniform(size=(shape[1])).astype("float32")
+ ref_res = mx.nd.GroupNorm(
+ data=mx.nd.array(x),
+ gamma=mx.nd.array(gamma),
+ beta=mx.nd.array(beta),
+ num_groups=num_groups,
+ )
+ mx_sym = mx.sym.GroupNorm(
+ mx.sym.var("x"), mx.sym.var("gamma"), mx.sym.var("beta"),
num_groups=num_groups
+ )
+ shape_dict = {"x": x.shape, "gamma": gamma.shape, "beta": beta.shape}
+ mod, _ = relay.frontend.from_mxnet(mx_sym, shape_dict)
+ for target, ctx in tvm.testing.enabled_targets():
+ for kind in ["graph", "debug"]:
+ intrp = relay.create_executor(kind, mod=mod, ctx=ctx,
target=target)
+ op_res = intrp.evaluate()(x, gamma, beta)
+ tvm.testing.assert_allclose(
+ op_res.asnumpy(), ref_res.asnumpy(), rtol=1e-3, atol=1e-5
+ )
+
+ verify((1, 4, 2), num_groups=4)
+ # TODO(trevmorr): MXNet GroupNorm implementation is bugged for cases when
num_groups != num_channels
+ # https://github.com/apache/incubator-mxnet/pull/18199
+ # verify((1, 4, 2, 3), num_groups=2)
+ # verify((1, 4, 2, 3))
+
+
[email protected]_gpu
def test_forward_one_hot():
def verify(indices_shape, depth, on_value, off_value, dtype):
x = np.random.randint(0, 5, size=indices_shape)