From 98c671de0f4204c9017523dac15db609435eb16c Mon Sep 17 00:00:00 2001 From: Younghwan Na <100389977+yhna940@users.noreply.github.com> Date: Fri, 9 Dec 2022 15:58:46 +0900 Subject: [PATCH 01/13] :bug: Add `Nevergrad` building with param option Signed-off-by: yhna --- .../tune/search/nevergrad/nevergrad_search.py | 13 +++++++++++- python/ray/tune/tests/test_searchers.py | 21 +++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/python/ray/tune/search/nevergrad/nevergrad_search.py b/python/ray/tune/search/nevergrad/nevergrad_search.py index 0a8b6ba9b872..b77528d66461 100644 --- a/python/ray/tune/search/nevergrad/nevergrad_search.py +++ b/python/ray/tune/search/nevergrad/nevergrad_search.py @@ -52,6 +52,8 @@ class NevergradSearch(Searcher): Parameters: optimizer: Optimizer provided from Nevergrad. Alter + optimizer_kwargs: Dictionary used + to instantiate the Nevergrad optimizer. space: Nevergrad parametrization to be passed to optimizer on instantiation, or list of parameter names if you passed an optimizer object. @@ -120,6 +122,7 @@ def __init__( optimizer: Optional[ Union[Optimizer, Type[Optimizer], ConfiguredOptimizer] ] = None, + optimizer_kwargs: Dict = dict(), space: Optional[Union[Dict, Parameter]] = None, metric: Optional[str] = None, mode: Optional[str] = None, @@ -139,6 +142,7 @@ def __init__( self._space = None self._opt_factory = None self._nevergrad_opt = None + self._optimizer_kwargs = optimizer_kwargs if points_to_evaluate is None: self._points_to_evaluate = None @@ -166,6 +170,13 @@ def __init__( "pass a list of parameter names or None as the `space` " "parameter." ) + if self._optimizer_kwargs: + raise ValueError( + "If you pass a optimizer kwargs to Nevergrad, either " + "pass a class of the `Optimizer` or a instance of " + "the `ConfiguredOptimizer`." + ) + self._parameters = space self._nevergrad_opt = optimizer elif ( @@ -187,7 +198,7 @@ def __init__( def _setup_nevergrad(self): if self._opt_factory: - self._nevergrad_opt = self._opt_factory(self._space) + self._nevergrad_opt = self._opt_factory(self._space, **self._optimizer_kwargs) # nevergrad.tell internally minimizes, so "max" => -1 if self._mode == "max": diff --git a/python/ray/tune/tests/test_searchers.py b/python/ray/tune/tests/test_searchers.py index 029bfbdb4209..b3d38d23f9dd 100644 --- a/python/ray/tune/tests/test_searchers.py +++ b/python/ray/tune/tests/test_searchers.py @@ -230,6 +230,27 @@ def testNevergrad(self): best_trial = out.best_trial self.assertLessEqual(best_trial.config["report"], 2.0) + def testNevergradWithKwargs(self): + from ray.tune.search.nevergrad import NevergradSearch + import nevergrad as ng + + np.random.seed(2020) # At least one nan, inf, -inf and float + + out = tune.run( + _invalid_objective, + search_alg=NevergradSearch( + optimizer=ng.optimizers.NGOpt4, + optimizer_kwargs=dict(budget=16) + ), + config=self.config, + mode="max", + num_samples=16, + reuse_actors=False, + ) + + best_trial = out.best_trial + self.assertLessEqual(best_trial.config["report"], 2.0) + def testOptuna(self): from ray.tune.search.optuna import OptunaSearch from optuna.samplers import RandomSampler From 8ba321bb6eae27388adbbe9ddc15dd8b767b7cea Mon Sep 17 00:00:00 2001 From: yhna Date: Mon, 12 Dec 2022 00:35:26 +0000 Subject: [PATCH 02/13] Fix lint Signed-off-by: yhna --- python/ray/tune/search/nevergrad/nevergrad_search.py | 6 ++++-- python/ray/tune/tests/test_searchers.py | 3 +-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/python/ray/tune/search/nevergrad/nevergrad_search.py b/python/ray/tune/search/nevergrad/nevergrad_search.py index b77528d66461..8715b39d0e0d 100644 --- a/python/ray/tune/search/nevergrad/nevergrad_search.py +++ b/python/ray/tune/search/nevergrad/nevergrad_search.py @@ -176,7 +176,7 @@ def __init__( "pass a class of the `Optimizer` or a instance of " "the `ConfiguredOptimizer`." ) - + self._parameters = space self._nevergrad_opt = optimizer elif ( @@ -198,7 +198,9 @@ def __init__( def _setup_nevergrad(self): if self._opt_factory: - self._nevergrad_opt = self._opt_factory(self._space, **self._optimizer_kwargs) + self._nevergrad_opt = self._opt_factory( + self._space, **self._optimizer_kwargs + ) # nevergrad.tell internally minimizes, so "max" => -1 if self._mode == "max": diff --git a/python/ray/tune/tests/test_searchers.py b/python/ray/tune/tests/test_searchers.py index b3d38d23f9dd..be5163c08999 100644 --- a/python/ray/tune/tests/test_searchers.py +++ b/python/ray/tune/tests/test_searchers.py @@ -239,8 +239,7 @@ def testNevergradWithKwargs(self): out = tune.run( _invalid_objective, search_alg=NevergradSearch( - optimizer=ng.optimizers.NGOpt4, - optimizer_kwargs=dict(budget=16) + optimizer=ng.optimizers.NGOpt4, optimizer_kwargs=dict(budget=16) ), config=self.config, mode="max", From 8ca32d0d34e4a8f725ce2e92fba6ab54f0dab907 Mon Sep 17 00:00:00 2001 From: yhna Date: Mon, 12 Dec 2022 01:15:21 +0000 Subject: [PATCH 03/13] Fix test func for nevergrad Signed-off-by: yhna --- python/ray/tune/tests/test_searchers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/ray/tune/tests/test_searchers.py b/python/ray/tune/tests/test_searchers.py index be5163c08999..307f3216c53a 100644 --- a/python/ray/tune/tests/test_searchers.py +++ b/python/ray/tune/tests/test_searchers.py @@ -239,7 +239,7 @@ def testNevergradWithKwargs(self): out = tune.run( _invalid_objective, search_alg=NevergradSearch( - optimizer=ng.optimizers.NGOpt4, optimizer_kwargs=dict(budget=16) + optimizer=ng.optimizers.CM, optimizer_kwargs=dict(budget=16) ), config=self.config, mode="max", From 4d9ce816ce72d642d913ef3a20d8c6e5bb7321d3 Mon Sep 17 00:00:00 2001 From: YH <100389977+yhna940@users.noreply.github.com> Date: Thu, 19 Jan 2023 08:26:53 +0900 Subject: [PATCH 04/13] Update python/ray/tune/search/nevergrad/nevergrad_search.py Co-authored-by: Justin Yu Signed-off-by: YH <100389977+yhna940@users.noreply.github.com> --- python/ray/tune/search/nevergrad/nevergrad_search.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/ray/tune/search/nevergrad/nevergrad_search.py b/python/ray/tune/search/nevergrad/nevergrad_search.py index 8715b39d0e0d..307906b48be9 100644 --- a/python/ray/tune/search/nevergrad/nevergrad_search.py +++ b/python/ray/tune/search/nevergrad/nevergrad_search.py @@ -122,7 +122,7 @@ def __init__( optimizer: Optional[ Union[Optimizer, Type[Optimizer], ConfiguredOptimizer] ] = None, - optimizer_kwargs: Dict = dict(), + optimizer_kwargs: Optional[Dict] = None, space: Optional[Union[Dict, Parameter]] = None, metric: Optional[str] = None, mode: Optional[str] = None, From debeb72395d0541e4fadd1ac18ef71425f8f293f Mon Sep 17 00:00:00 2001 From: YH <100389977+yhna940@users.noreply.github.com> Date: Thu, 19 Jan 2023 08:27:22 +0900 Subject: [PATCH 05/13] Update python/ray/tune/search/nevergrad/nevergrad_search.py Co-authored-by: Justin Yu Signed-off-by: YH <100389977+yhna940@users.noreply.github.com> --- python/ray/tune/search/nevergrad/nevergrad_search.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/ray/tune/search/nevergrad/nevergrad_search.py b/python/ray/tune/search/nevergrad/nevergrad_search.py index 307906b48be9..7038fea1909c 100644 --- a/python/ray/tune/search/nevergrad/nevergrad_search.py +++ b/python/ray/tune/search/nevergrad/nevergrad_search.py @@ -142,7 +142,7 @@ def __init__( self._space = None self._opt_factory = None self._nevergrad_opt = None - self._optimizer_kwargs = optimizer_kwargs + self._optimizer_kwargs = optimizer_kwargs or {} if points_to_evaluate is None: self._points_to_evaluate = None From c0d633872ef210f0cc3968ddf685342046e61dcc Mon Sep 17 00:00:00 2001 From: Younghwan Na <100389977+yhna940@users.noreply.github.com> Date: Thu, 19 Jan 2023 09:38:44 +0900 Subject: [PATCH 06/13] Reflect the review Signed-off-by: Younghwan Na <100389977+yhna940@users.noreply.github.com> --- .../tune/search/nevergrad/nevergrad_search.py | 16 ++++++++-------- python/ray/tune/tests/test_searchers.py | 18 ++---------------- .../tune/tests/test_tune_restore_warm_start.py | 2 +- 3 files changed, 11 insertions(+), 25 deletions(-) diff --git a/python/ray/tune/search/nevergrad/nevergrad_search.py b/python/ray/tune/search/nevergrad/nevergrad_search.py index 7038fea1909c..798b919410ff 100644 --- a/python/ray/tune/search/nevergrad/nevergrad_search.py +++ b/python/ray/tune/search/nevergrad/nevergrad_search.py @@ -52,7 +52,7 @@ class NevergradSearch(Searcher): Parameters: optimizer: Optimizer provided from Nevergrad. Alter - optimizer_kwargs: Dictionary used + optimizer_configs: Dictionary used to instantiate the Nevergrad optimizer. space: Nevergrad parametrization to be passed to optimizer on instantiation, or list of parameter @@ -122,7 +122,7 @@ def __init__( optimizer: Optional[ Union[Optimizer, Type[Optimizer], ConfiguredOptimizer] ] = None, - optimizer_kwargs: Optional[Dict] = None, + optimizer_configs: Optional[Dict] = None, space: Optional[Union[Dict, Parameter]] = None, metric: Optional[str] = None, mode: Optional[str] = None, @@ -142,7 +142,7 @@ def __init__( self._space = None self._opt_factory = None self._nevergrad_opt = None - self._optimizer_kwargs = optimizer_kwargs or {} + self._optimizer_configs = optimizer_configs or {} if points_to_evaluate is None: self._points_to_evaluate = None @@ -170,11 +170,11 @@ def __init__( "pass a list of parameter names or None as the `space` " "parameter." ) - if self._optimizer_kwargs: + if self._optimizer_configs: raise ValueError( - "If you pass a optimizer kwargs to Nevergrad, either " - "pass a class of the `Optimizer` or a instance of " - "the `ConfiguredOptimizer`." + "If you pass in optimizer kwargs, either pass " + "an `Optimizer` subclass or an instance of " + "`ConfiguredOptimizer`." ) self._parameters = space @@ -199,7 +199,7 @@ def __init__( def _setup_nevergrad(self): if self._opt_factory: self._nevergrad_opt = self._opt_factory( - self._space, **self._optimizer_kwargs + self._space, **self._optimizer_configs ) # nevergrad.tell internally minimizes, so "max" => -1 diff --git a/python/ray/tune/tests/test_searchers.py b/python/ray/tune/tests/test_searchers.py index 307f3216c53a..f7aeb47ad982 100644 --- a/python/ray/tune/tests/test_searchers.py +++ b/python/ray/tune/tests/test_searchers.py @@ -230,25 +230,11 @@ def testNevergrad(self): best_trial = out.best_trial self.assertLessEqual(best_trial.config["report"], 2.0) - def testNevergradWithKwargs(self): + def testNevergradWithConfigs(self): from ray.tune.search.nevergrad import NevergradSearch import nevergrad as ng - np.random.seed(2020) # At least one nan, inf, -inf and float - - out = tune.run( - _invalid_objective, - search_alg=NevergradSearch( - optimizer=ng.optimizers.CM, optimizer_kwargs=dict(budget=16) - ), - config=self.config, - mode="max", - num_samples=16, - reuse_actors=False, - ) - - best_trial = out.best_trial - self.assertLessEqual(best_trial.config["report"], 2.0) + NevergradSearch(optimizer=ng.optimizers.CM, optimizer_configs=dict(budget=16)) def testOptuna(self): from ray.tune.search.optuna import OptunaSearch diff --git a/python/ray/tune/tests/test_tune_restore_warm_start.py b/python/ray/tune/tests/test_tune_restore_warm_start.py index f54a3d2b0167..c635762661ed 100644 --- a/python/ray/tune/tests/test_tune_restore_warm_start.py +++ b/python/ray/tune/tests/test_tune_restore_warm_start.py @@ -261,7 +261,7 @@ def cost(space, reporter): search_alg = NevergradSearch( optimizer, - parameter_names, + space=parameter_names, metric="loss", mode="min", ) From d35662913b556af2ffeb300064ddfed12252dd4c Mon Sep 17 00:00:00 2001 From: YH <100389977+yhna940@users.noreply.github.com> Date: Mon, 23 Jan 2023 15:31:25 +0900 Subject: [PATCH 07/13] Update python/ray/tune/search/nevergrad/nevergrad_search.py Co-authored-by: Justin Yu Signed-off-by: YH <100389977+yhna940@users.noreply.github.com> --- python/ray/tune/search/nevergrad/nevergrad_search.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/python/ray/tune/search/nevergrad/nevergrad_search.py b/python/ray/tune/search/nevergrad/nevergrad_search.py index 798b919410ff..f37a1990ca54 100644 --- a/python/ray/tune/search/nevergrad/nevergrad_search.py +++ b/python/ray/tune/search/nevergrad/nevergrad_search.py @@ -52,8 +52,7 @@ class NevergradSearch(Searcher): Parameters: optimizer: Optimizer provided from Nevergrad. Alter - optimizer_configs: Dictionary used - to instantiate the Nevergrad optimizer. + optimizer_configs: Kwargs passed in when instantiating the `optimizer` space: Nevergrad parametrization to be passed to optimizer on instantiation, or list of parameter names if you passed an optimizer object. From 449c0069a0c50c078223d31f9c6f2c6d58d8d4a2 Mon Sep 17 00:00:00 2001 From: YH <100389977+yhna940@users.noreply.github.com> Date: Mon, 23 Jan 2023 15:31:40 +0900 Subject: [PATCH 08/13] Update python/ray/tune/search/nevergrad/nevergrad_search.py Co-authored-by: Justin Yu Signed-off-by: YH <100389977+yhna940@users.noreply.github.com> --- python/ray/tune/search/nevergrad/nevergrad_search.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/python/ray/tune/search/nevergrad/nevergrad_search.py b/python/ray/tune/search/nevergrad/nevergrad_search.py index f37a1990ca54..f079ad6a81ba 100644 --- a/python/ray/tune/search/nevergrad/nevergrad_search.py +++ b/python/ray/tune/search/nevergrad/nevergrad_search.py @@ -50,8 +50,11 @@ class NevergradSearch(Searcher): $ pip install nevergrad Parameters: - optimizer: Optimizer provided - from Nevergrad. Alter + optimizer: Optimizer class provided from Nevergrad. + See here for available optimizers: + https://facebookresearch.github.io/nevergrad/optimizers_ref.html#optimizers + This can also be an instance of a `ConfiguredOptimizer`. See the + section on configured optimizers in the above link. optimizer_configs: Kwargs passed in when instantiating the `optimizer` space: Nevergrad parametrization to be passed to optimizer on instantiation, or list of parameter From 24f3411b3e8120ecc8384c024a933c89a28b96ae Mon Sep 17 00:00:00 2001 From: YH <100389977+yhna940@users.noreply.github.com> Date: Mon, 23 Jan 2023 15:31:54 +0900 Subject: [PATCH 09/13] Update python/ray/tune/search/nevergrad/nevergrad_search.py Co-authored-by: Justin Yu Signed-off-by: YH <100389977+yhna940@users.noreply.github.com> --- python/ray/tune/search/nevergrad/nevergrad_search.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/ray/tune/search/nevergrad/nevergrad_search.py b/python/ray/tune/search/nevergrad/nevergrad_search.py index f079ad6a81ba..c617ecd95d5f 100644 --- a/python/ray/tune/search/nevergrad/nevergrad_search.py +++ b/python/ray/tune/search/nevergrad/nevergrad_search.py @@ -124,7 +124,7 @@ def __init__( optimizer: Optional[ Union[Optimizer, Type[Optimizer], ConfiguredOptimizer] ] = None, - optimizer_configs: Optional[Dict] = None, + optimizer_kwargs: Optional[Dict] = None, space: Optional[Union[Dict, Parameter]] = None, metric: Optional[str] = None, mode: Optional[str] = None, From 9990fd5d0a4769218e8592949485a8930ce2725b Mon Sep 17 00:00:00 2001 From: YH <100389977+yhna940@users.noreply.github.com> Date: Mon, 23 Jan 2023 15:32:12 +0900 Subject: [PATCH 10/13] Update python/ray/tune/tests/test_searchers.py Co-authored-by: Justin Yu Signed-off-by: YH <100389977+yhna940@users.noreply.github.com> --- python/ray/tune/tests/test_searchers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/ray/tune/tests/test_searchers.py b/python/ray/tune/tests/test_searchers.py index f7aeb47ad982..6ee29801bad6 100644 --- a/python/ray/tune/tests/test_searchers.py +++ b/python/ray/tune/tests/test_searchers.py @@ -230,7 +230,7 @@ def testNevergrad(self): best_trial = out.best_trial self.assertLessEqual(best_trial.config["report"], 2.0) - def testNevergradWithConfigs(self): + def testNevergradWithRequiredOptimizerKwargs(self): from ray.tune.search.nevergrad import NevergradSearch import nevergrad as ng From 91f9f1afeac3a2e1c3ad16bf136b6593b185e9d1 Mon Sep 17 00:00:00 2001 From: YH <100389977+yhna940@users.noreply.github.com> Date: Mon, 23 Jan 2023 15:32:38 +0900 Subject: [PATCH 11/13] Update python/ray/tune/search/nevergrad/nevergrad_search.py Co-authored-by: Justin Yu Signed-off-by: YH <100389977+yhna940@users.noreply.github.com> --- python/ray/tune/search/nevergrad/nevergrad_search.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/ray/tune/search/nevergrad/nevergrad_search.py b/python/ray/tune/search/nevergrad/nevergrad_search.py index c617ecd95d5f..c8026e157bcc 100644 --- a/python/ray/tune/search/nevergrad/nevergrad_search.py +++ b/python/ray/tune/search/nevergrad/nevergrad_search.py @@ -144,7 +144,7 @@ def __init__( self._space = None self._opt_factory = None self._nevergrad_opt = None - self._optimizer_configs = optimizer_configs or {} + self._optimizer_kwargs = optimizer_kwargs or {} if points_to_evaluate is None: self._points_to_evaluate = None From 615a7f7897dd3c167ded70bb800a43540dd83ae3 Mon Sep 17 00:00:00 2001 From: yhna940 Date: Mon, 23 Jan 2023 15:58:00 +0900 Subject: [PATCH 12/13] Reflect reviews. --- python/ray/tune/search/nevergrad/nevergrad_search.py | 6 +++--- python/ray/tune/tests/test_searchers.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/python/ray/tune/search/nevergrad/nevergrad_search.py b/python/ray/tune/search/nevergrad/nevergrad_search.py index c8026e157bcc..420c2a771b0e 100644 --- a/python/ray/tune/search/nevergrad/nevergrad_search.py +++ b/python/ray/tune/search/nevergrad/nevergrad_search.py @@ -55,7 +55,7 @@ class NevergradSearch(Searcher): https://facebookresearch.github.io/nevergrad/optimizers_ref.html#optimizers This can also be an instance of a `ConfiguredOptimizer`. See the section on configured optimizers in the above link. - optimizer_configs: Kwargs passed in when instantiating the `optimizer` + optimizer_kwargs: Kwargs passed in when instantiating the `optimizer` space: Nevergrad parametrization to be passed to optimizer on instantiation, or list of parameter names if you passed an optimizer object. @@ -172,7 +172,7 @@ def __init__( "pass a list of parameter names or None as the `space` " "parameter." ) - if self._optimizer_configs: + if self._optimizer_kwargs: raise ValueError( "If you pass in optimizer kwargs, either pass " "an `Optimizer` subclass or an instance of " @@ -201,7 +201,7 @@ def __init__( def _setup_nevergrad(self): if self._opt_factory: self._nevergrad_opt = self._opt_factory( - self._space, **self._optimizer_configs + self._space, **self._optimizer_kwargs ) # nevergrad.tell internally minimizes, so "max" => -1 diff --git a/python/ray/tune/tests/test_searchers.py b/python/ray/tune/tests/test_searchers.py index 6ee29801bad6..f21c3d469d98 100644 --- a/python/ray/tune/tests/test_searchers.py +++ b/python/ray/tune/tests/test_searchers.py @@ -234,7 +234,7 @@ def testNevergradWithRequiredOptimizerKwargs(self): from ray.tune.search.nevergrad import NevergradSearch import nevergrad as ng - NevergradSearch(optimizer=ng.optimizers.CM, optimizer_configs=dict(budget=16)) + NevergradSearch(optimizer=ng.optimizers.CM, optimizer_kwargs=dict(budget=16)) def testOptuna(self): from ray.tune.search.optuna import OptunaSearch From df083945b3f1dfd596d2becfaace3c6206da7f9d Mon Sep 17 00:00:00 2001 From: yhna940 Date: Mon, 23 Jan 2023 16:10:37 +0900 Subject: [PATCH 13/13] Rm nevergrad kwargs Signed-off-by: yhna940 --- python/ray/tune/search/nevergrad/nevergrad_search.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/python/ray/tune/search/nevergrad/nevergrad_search.py b/python/ray/tune/search/nevergrad/nevergrad_search.py index 420c2a771b0e..5b57069373e5 100644 --- a/python/ray/tune/search/nevergrad/nevergrad_search.py +++ b/python/ray/tune/search/nevergrad/nevergrad_search.py @@ -129,7 +129,6 @@ def __init__( metric: Optional[str] = None, mode: Optional[str] = None, points_to_evaluate: Optional[List[Dict]] = None, - **kwargs, ): assert ( ng is not None @@ -139,7 +138,7 @@ def __init__( if mode: assert mode in ["min", "max"], "`mode` must be 'min' or 'max'." - super(NevergradSearch, self).__init__(metric=metric, mode=mode, **kwargs) + super(NevergradSearch, self).__init__(metric=metric, mode=mode) self._space = None self._opt_factory = None