Open Jupiterghy opened 5 months ago
If you call a pass directly (instead of using Sequential
, it will bypass the check for opt_level
, required_pass
, etc.
If you call a pass directly (instead of using
Sequential
, it will bypass the check foropt_level
,required_pass
, etc.
Thank you for your response. However, I'm curious to understand why executing optimizations in the Sequential manner still results in inconsistency with different orderings.
When applying optimization passes in TVM, there is a discrepancy in the results between directly applying opt_a(opt_b(mod)) and using a sequential optimization approach, where seq_ab = tvm.ir.transform.Sequential([opt_a, opt_b]) and seq_ba = tvm.ir.transform.Sequential([opt_b, opt_a]) are used.
Additionally, this issue seems to occur specifically when one of the optimizations is
FakeQuantizationToInteger
.Actual behavior
Both structure and inference results of two mods which are applied optimizations by two ways are inconsistent.
Traceback information:
Environment
Steps to reproduce
def compare_outputs(output1, output2, rtol=1e-2, atol=1e-2): if len(output1) != len(output2): raise ValueError("Number of outputs in the two lists is different.") for i in range(len(output1)): output1_np = np.asarray(output1[i]) output2_np = np.asarray(output2[i]) np.testing.assert_allclose(output1_np, output2_np, rtol=rtol, atol=atol)
def compile_onnx(mod, params, inputs): mod = relay.transform.InferType()(mod) exec_mod = 'graph' target = 'llvm' ctx = tvm.cpu(0)
if name == "main": onnx_file = "model.onnx" onnx_model = onnx.load(onnx_file)