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)