From fb976c4adf81280d810fbbd3341084045e795f1f Mon Sep 17 00:00:00 2001 From: jikechao Date: Sat, 9 Sep 2023 10:01:33 +0800 Subject: [PATCH 1/6] [Relay][BugFix] fix the wrong implementation of Threshold in OneFlow --- python/tvm/relay/frontend/oneflow.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/python/tvm/relay/frontend/oneflow.py b/python/tvm/relay/frontend/oneflow.py index 4f278d8249e8..f22150714ca7 100644 --- a/python/tvm/relay/frontend/oneflow.py +++ b/python/tvm/relay/frontend/oneflow.py @@ -1025,15 +1025,17 @@ def _impl_v1(cls, inputs, attrs, params): return out -class ThresholdedRelu(OneFlowOpConverter): - """Operator converter for ThresholdedRelu.""" +class Threshold(OneFlowOpConverter): + """Operator converter for Threshold.""" @classmethod def _impl_v1(cls, inputs, attrs, params): - alpha = float(attrs.get("alpha", 1.0)) - alpha_tensor = _op.full_like(inputs[0], fill_value=_expr.const(alpha)) + threshold = float(attrs.get("threshold_val", 1.0)) + threshold_tensor = _op.full_like(inputs[0], fill_value=_expr.const(alpha)) + value = float(attrs.get("value")) + value_tensor = _op.full_like(inputs[0], fill_value=_expr.const(value)) mask = _op.greater(inputs[0], alpha_tensor).astype("float32") - return inputs[0] * mask + return _op.where(mask, inputs[0], value_tensor) class Elu(OneFlowOpConverter): @@ -1422,6 +1424,7 @@ def get_convert_map(): "relu": Renamer("relu"), "leaky_relu": Renamer("leaky_relu"), "prelu": PReLU.get_converter(), + "threshold": Threshold.get_converter(), "selu": Selu.get_converter(), "silu": Silu.get_converter(), "gelu": Gelu.get_converter(), From 2a57a388a7c3f019057527ed466e020e6503733d Mon Sep 17 00:00:00 2001 From: jikechao Date: Sat, 9 Sep 2023 10:06:57 +0800 Subject: [PATCH 2/6] Update test_forward.py --- tests/python/frontend/oneflow/test_forward.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tests/python/frontend/oneflow/test_forward.py b/tests/python/frontend/oneflow/test_forward.py index cc9333cd03bd..f4540c48db8c 100644 --- a/tests/python/frontend/oneflow/test_forward.py +++ b/tests/python/frontend/oneflow/test_forward.py @@ -702,6 +702,15 @@ def forward(self, x): x = x.softmax(dim=-1) return x + class Threshold(flow.nn.Module): + def __init__(self): + super().__init__() + self.active = flow.nn.Threshold() + + def forward(self, x): + x = self.active(x) + return x + if os.path.exists(MODEL_HOME): rmdir(MODEL_HOME) @@ -718,6 +727,7 @@ def forward(self, x): model11 = GELU().eval() model12 = HardTanh().eval() model13 = TensorSoftmax().eval() + model14 = Threshold().eval() for device in ["llvm"]: verify_activation(model1, device=device) @@ -737,6 +747,7 @@ def forward(self, x): device=device, inputs=flow.tensor(np.random.rand(1, 12, 197, 197).astype(np.float32)), ) + verify_activation(model14, device=device) @tvm.testing.uses_gpu From 0118bbf91c7d4e596fdfc4fa94cebb5a51323894 Mon Sep 17 00:00:00 2001 From: jikechao Date: Sat, 9 Sep 2023 13:32:02 +0800 Subject: [PATCH 3/6] Update oneflow.py --- python/tvm/relay/frontend/oneflow.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/tvm/relay/frontend/oneflow.py b/python/tvm/relay/frontend/oneflow.py index f22150714ca7..aa5075375233 100644 --- a/python/tvm/relay/frontend/oneflow.py +++ b/python/tvm/relay/frontend/oneflow.py @@ -1031,10 +1031,10 @@ class Threshold(OneFlowOpConverter): @classmethod def _impl_v1(cls, inputs, attrs, params): threshold = float(attrs.get("threshold_val", 1.0)) - threshold_tensor = _op.full_like(inputs[0], fill_value=_expr.const(alpha)) + threshold_tensor = _op.full_like(inputs[0], fill_value=_expr.const(threshold)) value = float(attrs.get("value")) value_tensor = _op.full_like(inputs[0], fill_value=_expr.const(value)) - mask = _op.greater(inputs[0], alpha_tensor).astype("float32") + mask = _op.greater(inputs[0], threshold_tensor).astype("float32") return _op.where(mask, inputs[0], value_tensor) From e1e1923408f07dde421996e7ab8e77af7c1e4a16 Mon Sep 17 00:00:00 2001 From: jikechao Date: Mon, 11 Sep 2023 11:48:06 +0800 Subject: [PATCH 4/6] Update test_forward.py --- tests/python/frontend/oneflow/test_forward.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/python/frontend/oneflow/test_forward.py b/tests/python/frontend/oneflow/test_forward.py index f4540c48db8c..4d1e9923e1e1 100644 --- a/tests/python/frontend/oneflow/test_forward.py +++ b/tests/python/frontend/oneflow/test_forward.py @@ -705,7 +705,7 @@ def forward(self, x): class Threshold(flow.nn.Module): def __init__(self): super().__init__() - self.active = flow.nn.Threshold() + self.active = flow.nn.Threshold(0.5, 0.2) def forward(self, x): x = self.active(x) From 4098b844bc385d8f091d9154eb3a3d43c462a19d Mon Sep 17 00:00:00 2001 From: jikechao Date: Mon, 11 Sep 2023 11:49:28 +0800 Subject: [PATCH 5/6] Update oneflow.py --- python/tvm/relay/frontend/oneflow.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/tvm/relay/frontend/oneflow.py b/python/tvm/relay/frontend/oneflow.py index aa5075375233..910567c66225 100644 --- a/python/tvm/relay/frontend/oneflow.py +++ b/python/tvm/relay/frontend/oneflow.py @@ -1034,7 +1034,7 @@ def _impl_v1(cls, inputs, attrs, params): threshold_tensor = _op.full_like(inputs[0], fill_value=_expr.const(threshold)) value = float(attrs.get("value")) value_tensor = _op.full_like(inputs[0], fill_value=_expr.const(value)) - mask = _op.greater(inputs[0], threshold_tensor).astype("float32") + mask = _op.greater(inputs[0], threshold_tensor) return _op.where(mask, inputs[0], value_tensor) From 127fc551f9560a21ccb31af95b72b8bcbac9f2d1 Mon Sep 17 00:00:00 2001 From: jikechao Date: Mon, 11 Sep 2023 21:29:32 +0800 Subject: [PATCH 6/6] Update test_forward.py add version checking --- tests/python/frontend/oneflow/test_forward.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tests/python/frontend/oneflow/test_forward.py b/tests/python/frontend/oneflow/test_forward.py index 4d1e9923e1e1..f7b9b934e124 100644 --- a/tests/python/frontend/oneflow/test_forward.py +++ b/tests/python/frontend/oneflow/test_forward.py @@ -24,6 +24,7 @@ import tvm.testing import tvm.topi.testing from tvm import relay +from packaging import version as package_version MODEL_HOME = "test_model" @@ -727,7 +728,6 @@ def forward(self, x): model11 = GELU().eval() model12 = HardTanh().eval() model13 = TensorSoftmax().eval() - model14 = Threshold().eval() for device in ["llvm"]: verify_activation(model1, device=device) @@ -747,7 +747,11 @@ def forward(self, x): device=device, inputs=flow.tensor(np.random.rand(1, 12, 197, 197).astype(np.float32)), ) - verify_activation(model14, device=device) + + # Threshold was introduced in the version 0.8.0 of oneflow + if package_version.parse(flow.__version__) >= package_version.parse("0.8.0"): + model14 = Threshold().eval() + verify_activation(model14, device="llvm") @tvm.testing.uses_gpu