Thanks for the RFC. I like the idea of the config library concept. Some
concerns/questions:
- Same to @kevinthesun, I'd prefer to keep the current AutoTVM dispatch context
instead of introducing a new one. For example, we can just overload
`apply_history_best` to take either a JSON file like now or a config library in
this proposal.
- Current AutoTVM has a database module that stores tuned configs and results
to Redis database (altough no one is using this feature AFAIK). Considering the
compatibility and usability, we should hide the resume logic from users and
make all storage mechanisms consist. For example, we can first move the "log
to" callback to tuner arguments:
```
tuner_obj.tune(
n_trial=min(n_trial, len(tsk.config_space)),
early_stopping=early_stopping,
measure_option=measure_option,
config_library="history.json", # Can be either a string (JSON file
name) or a DB object
callbacks=[
autotvm.callback.progress_bar(n_trial, prefix=prefix),
],
)
```
In this way, we can implement the resume logic you proposed in the constructor
of tuners.
- For the rules that determine if the history can be reused for resuming the
tuning, I think it should be a general question as the tophub faces to.
However, I would not suggest to refer to the tuning specific information such
as trial numbers for the following reasons. First, users may require different
trial numbers or different measure options. Second, this limits the history be
used only for the exactly same task. If we design this resume logic in a
general way, we can also extend it to tophub.
In my personal opinion, when loading the history, in addition to checking if
the history config matches the current task in terms of target, op name, shapes
and attributes, we also need to check the device as you mentioned. We can try
to retrieve the target device info using system call and add it to every record
when dumping to file/database.
Besides, we also need to invalid the history/records when TVM has been updated,
because it may result in different performance even for the same config on the
same device. The simplest way is checking the timestamp. For example, we let
users config an expiration time when creating a tuner:
```
library_option = {"library": "history.json", "expiration": 1440}
tuner_obj.tune(
n_trial=min(n_trial, len(tsk.config_space)),
early_stopping=early_stopping,
measure_option=measure_option,
library_option=library_option,
callbacks=[
autotvm.callback.progress_bar(n_trial, prefix=prefix),
],
)
```
In this example, a user wants the tuner to load `history.json` and use all
records generated within 1440 minutes (1 day). One advantage of using this
approach is that we don't need to touch the searching part at all, but only let
`Tuner.tune` bypass the measurement when the record is available already.
Again thanks for the proposal, and any of my suggestions can be
adjusted/discussed if they are too overwhelming or unnecessary.
--
You are receiving this because you are subscribed to this thread.
Reply to this email directly or view it on GitHub:
https://github.com/dmlc/tvm/issues/4150#issuecomment-543970017