How to reproduce the results of autotune

Hi, I’m using the latest TVM branch and running autotuning with MetaSchedule. I’ve noticed that the tuning results are different every time, even though I’ve already passed the seed parameter. Is there something else I might have missed that needs to be fixed for reproducibility? Or is it just that the kernel performance itself is inherently noisy, making it hard to get consistent results?

from tvm import meta_schedule as ms
from tvm.meta_schedule.runner.config import EvaluatorConfig
from tvm.meta_schedule.space_generator import PostOrderApply

def search(..., seed=0):
    ...
    space_gen = PostOrderApply(
        sch_rules="cuda-tensorcore",
        postprocs="cuda-tensorcore",
        mutator_probs="cuda-tensorcore",
    )
    def f_build(
        mod: IRModule, target: Target, _params: Optional[Dict[str, Tensor]]
    ) -> Module:
        # pylint: disable=import-outside-toplevel
        from tvm.driver import build as tvm_build
        from tvm.tir.transform import RemoveWeightLayoutRewriteBlock
        import tvm.tir.tensor_intrin  # pylint: disable=unused-import
    
        # pylint: enable=import-outside-toplevel
        mod = RemoveWeightLayoutRewriteBlock(skip_tensor_rewrite=True)(mod)
        with tvm.transform.PassContext(opt_level=3, config={"tir.use_async_copy": 1}):
            return tvm_build(mod, target=target)
    database = ms.tune_tir(
        mod=prim,
        target=target,
        max_trials_global=2000,
        num_trials_per_iter=64,
        work_dir=work_dir,
        runner=ms.runner.LocalRunner(
            evaluator_config=EvaluatorConfig(
                number=3,
                repeat=10,
                min_repeat_ms=200,
                enable_cpu_cache_flush=False,
            ),
        ),
        cost_model=cost_model,
        builder=ms.builder.LocalBuilder(
            max_workers=24, timeout_sec=120, f_build=f_build
        ),  # 96 / 4
        strategy=ms.search_strategy.EvolutionarySearch(),
        special_space={"main": space_gen},
        seed=seed,
    )

if __name__ == "__main__":
    import random
    import numpy as np
    seed = 0    
    random.seed(seed)
    np.random.seed(seed)
    os.environ["PYTHONHASHSEED"] = str(seed)
    
    ...
    search(..., seed)