def set_basic_conf(self): from ax.service.ax_client import AxClient space = AxSearch.convert_search_space({ "width": tune.uniform(0, 20), "height": tune.uniform(-100, 100) }) from ax.modelbridge.generation_strategy import ( GenerationStep, GenerationStrategy, ) from ax.modelbridge.registry import Models # set generation strategy to sobol to ensure reproductibility try: # ax-platform>=0.2.0 gs = GenerationStrategy(steps=[ GenerationStep( model=Models.SOBOL, num_trials=-1, model_kwargs={"seed": 4321}, ), ]) except TypeError: # ax-platform<0.2.0 gs = GenerationStrategy(steps=[ GenerationStep( model=Models.SOBOL, num_arms=-1, model_kwargs={"seed": 4321}, ), ]) client = AxClient(random_seed=4321, generation_strategy=gs) client.create_experiment(parameters=space, objective_name="loss", minimize=True) def cost(space, reporter): reporter(loss=(space["height"] - 14)**2 - abs(space["width"] - 3)) search_alg = AxSearch(ax_client=client) return search_alg, cost
def testAx(self): from ray.tune.suggest.ax import AxSearch from ax.service.ax_client import AxClient converted_config = AxSearch.convert_search_space(self.config) client = AxClient() client.create_experiment( parameters=converted_config, objective_name=self.metric_name, minimize=False ) searcher = AxSearch(ax_client=client) self._save(searcher) client = AxClient() client.create_experiment( parameters=converted_config, objective_name=self.metric_name, minimize=False ) searcher = AxSearch(ax_client=client) self._restore(searcher)
def testAx(self): from ray.tune.suggest.ax import AxSearch from ax.service.ax_client import AxClient converted_config = AxSearch.convert_search_space(self.config) # At least one nan, inf, -inf and float client = AxClient(random_seed=4321) client.create_experiment(parameters=converted_config, objective_name="_metric") searcher = AxSearch(ax_client=client, metric="_metric", mode="max") out = tune.run(_invalid_objective, search_alg=searcher, metric="_metric", mode="max", num_samples=4, reuse_actors=False) best_trial = out.best_trial self.assertLessEqual(best_trial.config["report"], 2.0)
def testConvertAx(self): from ray.tune.suggest.ax import AxSearch from ax.service.ax_client import AxClient config = { "a": tune.sample.Categorical([2, 3, 4]).uniform(), "b": { "x": tune.sample.Integer(0, 5).quantized(2), "y": 4, "z": tune.sample.Float(1e-4, 1e-2).loguniform() } } converted_config = AxSearch.convert_search_space(config) ax_config = [ { "name": "a", "type": "choice", "values": [2, 3, 4] }, { "name": "b/x", "type": "range", "bounds": [0, 5], "value_type": "int" }, { "name": "b/y", "type": "fixed", "value": 4 }, { "name": "b/z", "type": "range", "bounds": [1e-4, 1e-2], "value_type": "float", "log_scale": True }, ] client1 = AxClient(random_seed=1234) client1.create_experiment(parameters=converted_config) searcher1 = AxSearch(ax_client=client1) client2 = AxClient(random_seed=1234) client2.create_experiment(parameters=ax_config) searcher2 = AxSearch(ax_client=client2) config1 = searcher1.suggest("0") config2 = searcher2.suggest("0") self.assertEqual(config1, config2) self.assertIn(config1["a"], [2, 3, 4]) self.assertIn(config1["b"]["x"], list(range(5))) self.assertEqual(config1["b"]["y"], 4) self.assertLess(1e-4, config1["b"]["z"]) self.assertLess(config1["b"]["z"], 1e-2) searcher = AxSearch(metric="a", mode="max") analysis = tune.run(_mock_objective, config=config, search_alg=searcher, num_samples=1) trial = analysis.trials[0] assert trial.config["a"] in [2, 3, 4] mixed_config = {"a": tune.uniform(5, 6), "b": tune.uniform(8, 9)} searcher = AxSearch(space=mixed_config, metric="a", mode="max") config = searcher.suggest("0") self.assertTrue(5 <= config["a"] <= 6) self.assertTrue(8 <= config["b"] <= 9)