Here are some more details about the interface change in this RFC. The new added use_topi_schedule
flag is propagated from the compile engine to relay._build
. As a result, this actually doesn’t expose to users. The use cases are the following:
-
Use TOPI schedule with fallback values (same as current).
with PassContext(opt_level=opt_level): lib = relay.build(mod, target=target, params=params)
-
Use TOPI schedule with AutoTVM tuning logs (same as current).
with autotvm.apply_history_best(log_file): with PassContext(opt_level=opt_level): lib = relay.build(mod, target=target, params=params)
-
Extract auto_scheduler tasks. It calls
GraphRuntimeCodegen(use_topi_schedule=False)
to launch the compile engine in order to lower the Relay functions to TE compute DAGs.tasks, task_weights = auto_scheduler.extract_tasks(mod["main"], params, target)
In
extract_tasks
:with transform.PassContext(opt_level=3): opt_mod, _ = relay.optimize(mod, target, params) grc = graph_runtime_codegen.GraphRuntimeCodegen(None, target, use_topi_schedule=False) grc.codegen(opt_mod["main"])
-
Use auto_scheduler tuning logs. In
relay.build
, it invokesrelay._build(use_topi_schedule=False)
because it finds theauto_scheduler.DispatchContext
is notNone
, meaning that users want to apply the auto_scheduler log.with auto_scheduler.ApplyHistoryBest(log_file): with PassContext(opt_level=opt_level): lib = relay.build(mod, target=target, params=params)
As a result, the changes are hid from an end-user’s point of view. On the other hand, putting this flag to the PassContext
results in the change of case 3 and case 4:
-
In
extract_tasks
, we can still add the flag for users.with transform.PassContext(opt_level=3, use_topi_schedule=False): opt_mod, _ = relay.optimize(mod, target, params) grc = graph_runtime_codegen.GraphRuntimeCodegen(None, target) grc.codegen(opt_mod["main"])
-
Users have to manually add the flag anyways.
with auto_scheduler.ApplyHistoryBest(log_file): with PassContext(opt_level=opt_level, use_topi_schedule=False): lib = relay.build(mod, target=target, params=params)
IMHO, this changes the interface more than the current solution.