autogen/test/tune/test_searcher.py

300 lines
9.8 KiB
Python
Raw Normal View History

from time import sleep
import numpy as np
2021-09-14 23:16:28 -07:00
try:
from ray import __version__ as ray_version
2021-09-14 23:16:28 -07:00
assert ray_version >= "1.0.0"
from ray.tune import sample
use_ray = True
except (ImportError, AssertionError):
from flaml.tune import sample
use_ray = False
def define_search_space(trial):
trial.suggest_float("a", 6, 8)
trial.suggest_float("b", 1e-4, 1e-2, log=True)
2021-09-14 23:16:28 -07:00
def long_define_search_space(trial):
sleep(1)
return 3
def wrong_define_search_space(trial):
return {1: 1}
def test_searcher():
from flaml.searcher.suggestion import OptunaSearch, Searcher, ConcurrencyLimiter
from flaml.searcher.blendsearch import BlendSearch, CFO, RandomSearch
from flaml.tune import sample as flamlsample
searcher = Searcher()
try:
searcher = Searcher(metric=1, mode=1)
except ValueError:
# Mode must either be a list or string
pass
searcher = Searcher(metric=["m1", "m2"], mode=["max", "min"])
searcher.set_search_properties(None, None, None)
searcher.suggest = searcher.on_pause = searcher.on_unpause = lambda _: {}
searcher.on_trial_complete = lambda trial_id, result, error: None
searcher = ConcurrencyLimiter(searcher, max_concurrent=2, batch=True)
searcher.on_trial_complete("t0")
searcher.suggest("t1")
searcher.suggest("t2")
searcher.on_pause("t1")
searcher.on_unpause("t1")
searcher.suggest("t3")
searcher.on_trial_complete("t1", {})
searcher.on_trial_complete("t2", {})
searcher.set_state({})
print(searcher.get_state())
import optuna
config = {
"a": optuna.distributions.UniformDistribution(6, 8),
"b": optuna.distributions.LogUniformDistribution(1e-4, 1e-2),
}
searcher = OptunaSearch(["a", config["a"]], metric="m", mode="max")
try:
searcher.suggest("t0")
except ValueError:
# not enough values to unpack (expected 3, got 1)
pass
searcher = OptunaSearch(
config,
points_to_evaluate=[{"a": 6, "b": 1e-3}],
evaluated_rewards=[{"m": 2}],
metric="m",
mode="max",
)
try:
searcher.add_evaluated_point({}, None, error=True)
except ValueError:
# nconsistent parameters set() and distributions {'b', 'a'}.
pass
try:
searcher.add_evaluated_point({"a", 1, "b", 0.01}, None, pruned=True)
except AttributeError:
# 'set' object has no attribute 'keys'
pass
try:
searcher.add_evaluated_point(
{"a": 1, "b": 0.01}, None, intermediate_values=[0.1]
)
except ValueError:
# `value` is supposed to be set for a complete trial.
pass
try:
searcher = OptunaSearch(config, points_to_evaluate=1)
except TypeError:
# points_to_evaluate expected to be a list, got <class 'int'>
pass
try:
searcher = OptunaSearch(config, points_to_evaluate=[1])
except TypeError:
# points_to_evaluate expected to include list or dict
pass
try:
searcher = OptunaSearch(config, points_to_evaluate=[{"a": 1}])
except ValueError:
# Dim of point {'a': 1} and parameter_names {'a': UniformDistribution(high=8.0, low=6.0), 'b': LogUniformDistribution(high=0.01, low=0.0001)} do not match.
pass
try:
searcher = OptunaSearch(
config, points_to_evaluate=[{"a": 1, "b": 0.01}], evaluated_rewards=1
)
except TypeError:
# valuated_rewards expected to be a list, got <class 'int'>.
pass
try:
searcher = OptunaSearch(
config, points_to_evaluate=[{"a": 1, "b": 0.01}], evaluated_rewards=[1, 2]
)
except ValueError:
# Dim of evaluated_rewards [1, 2] and points_to_evaluate [{'a': 1, 'b': 0.01}] do not match.
pass
config = {"a": sample.uniform(6, 8), "b": sample.loguniform(1e-4, 1e-2)}
OptunaSearch.convert_search_space({"a": 1})
try:
OptunaSearch.convert_search_space({"a": {"grid_search": [1, 2]}})
except ValueError:
# Grid search parameters cannot be automatically converted to an Optuna search space.
pass
OptunaSearch.convert_search_space({"a": flamlsample.quniform(1, 3, 1)})
try:
searcher = OptunaSearch(
config,
points_to_evaluate=[{"a": 6, "b": 1e-3}],
evaluated_rewards=[{"m": 2}],
metric="m",
mode="max",
)
except ValueError:
# Optuna search does not support parameters of type `Float` with samplers of type `_Uniform`
pass
searcher = OptunaSearch(long_define_search_space, metric="m", mode="min")
try:
searcher.suggest("t0")
except TypeError:
# The return value of the define-by-run function passed in the `space` argument should be either None or a `dict` with `str` keys.
pass
searcher = OptunaSearch(wrong_define_search_space, metric="m", mode="min")
try:
searcher.suggest("t0")
except TypeError:
# At least one of the keys in the dict returned by the define-by-run function passed in the `space` argument was not a `str`.
pass
searcher = OptunaSearch(metric="m", mode="min")
try:
searcher.suggest("t0")
except RuntimeError:
# Trying to sample a configuration from OptunaSearch, but no search space has been defined.
pass
try:
searcher.add_evaluated_point({}, 1)
except RuntimeError:
# Trying to sample a configuration from OptunaSearch, but no search space has been defined.
pass
searcher = OptunaSearch(define_search_space)
try:
searcher.suggest("t0")
except RuntimeError:
# Trying to sample a configuration from OptunaSearch, but the `metric` (None) or `mode` (None) parameters have not been set.
pass
try:
searcher.add_evaluated_point({}, 1)
except RuntimeError:
# Trying to sample a configuration from OptunaSearch, but the `metric` (None) or `mode` (None) parameters have not been set.
pass
searcher = OptunaSearch(
define_search_space,
points_to_evaluate=[{"a": 6, "b": 1e-3}],
# evaluated_rewards=[{'m': 2}], metric='m', mode='max'
mode="max",
)
# searcher = OptunaSearch()
# searcher.set_search_properties('m', 'min', define_search_space)
searcher.set_search_properties("m", "min", config)
searcher.suggest("t1")
searcher.on_trial_complete("t1", None, False)
searcher.suggest("t2")
searcher.on_trial_complete("t2", None, True)
searcher.suggest("t3")
searcher.on_trial_complete("t3", {"m": np.nan})
searcher.save("test/tune/optuna.pickle")
searcher.restore("test/tune/optuna.pickle")
try:
searcher = BlendSearch(
metric="m", global_search_alg=searcher, metric_constraints=[("c", "<", 1)]
)
except AssertionError:
# sign of metric constraints must be <= or >=.
pass
searcher = BlendSearch(
metric="m", global_search_alg=searcher, metric_constraints=[("c", "<=", 1)]
)
searcher.set_search_properties(
metric="m2", config=config, setting={"time_budget_s": 0}
)
c = searcher.suggest("t1")
searcher.on_trial_complete("t1", {"config": c}, True)
c = searcher.suggest("t2")
searcher.on_trial_complete("t2", {"config": c, "m2": 1, "c": 2, "time_total_s": 1})
config1 = config.copy()
config1["_choice_"] = 0
searcher._expand_admissible_region(
lower={"root": [{"a": 0.5}, {"a": 0.4}]},
upper={"root": [{"a": 0.9}, {"a": 0.8}]},
space={"root": config1},
)
searcher = CFO(
metric="m",
mode="min",
space=config,
points_to_evaluate=[{"a": 7, "b": 1e-3}, {"a": 6, "b": 3e-4}],
evaluated_rewards=[1, 1],
)
searcher.suggest("t1")
searcher.suggest("t2")
searcher.on_trial_result("t3", {})
c = searcher.generate_parameters(1)
searcher.receive_trial_result(1, c, {"default": 0})
searcher.update_search_space(
{
"a": {
"_value": [1, 2],
"_type": "choice",
},
"b": {
"_value": [1, 3],
"_type": "randint",
},
"c": {
"_value": [0.1, 3],
"_type": "uniform",
},
"d": {
"_value": [2, 8, 2],
"_type": "quniform",
},
"e": {
"_value": [2, 8],
"_type": "loguniform",
},
"f": {
"_value": [2, 8, 2],
"_type": "qloguniform",
},
"g": {
"_value": [0, 2],
"_type": "normal",
},
"h": {
"_value": [0, 2, 2],
"_type": "qnormal",
},
}
)
np.random.seed(7654321)
searcher = RandomSearch(
space=config,
points_to_evaluate=[{"a": 7, "b": 1e-3}, {"a": 6, "b": 3e-4}],
)
print(searcher.suggest("t1"))
print(searcher.suggest("t2"))
print(searcher.suggest("t3"))
print(searcher.suggest("t4"))
searcher.on_trial_complete({"t1"}, {})
searcher.on_trial_result({"t2"}, {})
np.random.seed(654321)
searcher = RandomSearch(
space=config,
points_to_evaluate=[{"a": 7, "b": 1e-3}, {"a": 6, "b": 3e-4}],
)
print(searcher.suggest("t1"))
print(searcher.suggest("t2"))
print(searcher.suggest("t3"))
searcher = RandomSearch(space={})
print(searcher.suggest("t1"))
searcher = BlendSearch(space={})
print(searcher.suggest("t1"))
from flaml import tune
tune.run(lambda x: 1, config={}, use_ray=use_ray)
def test_no_optuna():
import subprocess
import sys
subprocess.check_call([sys.executable, "-m", "pip", "uninstall", "-y", "optuna"])
import flaml.searcher.suggestion
subprocess.check_call([sys.executable, "-m", "pip", "install", "optuna==2.8.0"])