diff --git a/doc/source/conf.py b/doc/source/conf.py index 118c4b8d7..7f4ec4188 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -32,7 +32,8 @@ MOCK_MODULES = [ "tensorflow.contrib.rnn", "tensorflow.contrib.slim", "tensorflow.core", "tensorflow.core.util", "tensorflow.python", "tensorflow.python.client", "tensorflow.python.util", "torch", "torch.distributed", "torch.nn", - "torch.nn.parallel", "torch.utils.data", "torch.utils.data.distributed" + "torch.nn.parallel", "torch.utils.data", "torch.utils.data.distributed", + "zoopt" ] for mod_name in MOCK_MODULES: sys.modules[mod_name] = mock.Mock() diff --git a/doc/source/tune/api_docs/suggestion.rst b/doc/source/tune/api_docs/suggestion.rst index 45f62d682..47c10d6a2 100644 --- a/doc/source/tune/api_docs/suggestion.rst +++ b/doc/source/tune/api_docs/suggestion.rst @@ -48,6 +48,11 @@ SkOptSearch .. autoclass:: ray.tune.suggest.skopt.SkOptSearch +ZOOptSearch +----------- + +.. autoclass:: ray.tune.suggest.zoopt.ZOOptSearch + SearchAlgorithm --------------- diff --git a/docker/tune_test/requirements.txt b/docker/tune_test/requirements.txt index 549ca9e94..5c34a5499 100644 --- a/docker/tune_test/requirements.txt +++ b/docker/tune_test/requirements.txt @@ -28,4 +28,3 @@ torch torchvision xgboost zoopt>=0.4.0 -dill diff --git a/python/ray/tune/examples/zoopt_example.py b/python/ray/tune/examples/zoopt_example.py index 277d05d2d..281a5a6a8 100644 --- a/python/ray/tune/examples/zoopt_example.py +++ b/python/ray/tune/examples/zoopt_example.py @@ -1,8 +1,7 @@ -"""This test checks that ZOOpt is functional. +"""This test checks that ZOOptSearch is functional. It also checks that it is usable with a separate scheduler. """ - import ray from ray.tune import run from ray.tune.suggest.zoopt import ZOOptSearch @@ -39,7 +38,7 @@ if __name__ == "__main__": } config = { - "num_samples": 200 if args.smoke_test else 1000, + "num_samples": 10 if args.smoke_test else 1000, "config": { "iterations": 10, # evaluation times }, diff --git a/python/ray/tune/suggest/zoopt.py b/python/ray/tune/suggest/zoopt.py index a25babc4b..c92437b1b 100644 --- a/python/ray/tune/suggest/zoopt.py +++ b/python/ray/tune/suggest/zoopt.py @@ -1,8 +1,12 @@ import copy import logging -import dill as pickle -from zoopt import Dimension2, Parameter -from zoopt.algos.opt_algorithms.racos.sracos import SRacosTune +import ray.cloudpickle as pickle + +try: + import zoopt +except ImportError: + zoopt = None + from ray.tune.suggest.suggestion import SuggestionAlgorithm logger = logging.getLogger(__name__) @@ -76,7 +80,7 @@ class ZOOptSearch(SuggestionAlgorithm): metric="episode_reward_mean", mode="min", **kwargs): - + assert zoopt is not None, "Zoopt not found - please install zoopt." assert budget is not None, "`budget` should not be None!" assert dim_dict is not None, "`dim_list` should not be None!" assert type(max_concurrent) is int and max_concurrent > 0 @@ -99,9 +103,10 @@ class ZOOptSearch(SuggestionAlgorithm): self._dim_keys.append(k) _dim_list.append(dim_dict[k]) - dim = Dimension2(_dim_list) - par = Parameter(budget=budget) + dim = zoopt.Dimension2(_dim_list) + par = zoopt.Parameter(budget=budget) if _algo == "sracos" or _algo == "asracos": + from zoopt.algos.opt_algorithms.racos.sracos import SRacosTune self.optimizer = SRacosTune(dimension=dim, parameter=par) self.solution_dict = {} diff --git a/python/ray/tune/tests/test_tune_restore.py b/python/ray/tune/tests/test_tune_restore.py index f1c7e8168..433a5a321 100644 --- a/python/ray/tune/tests/test_tune_restore.py +++ b/python/ray/tune/tests/test_tune_restore.py @@ -7,6 +7,7 @@ import skopt import numpy as np from hyperopt import hp from nevergrad.optimization import optimizerlib +from zoopt import ValueType import ray from ray import tune @@ -18,7 +19,6 @@ from ray.tune.suggest.skopt import SkOptSearch from ray.tune.suggest.nevergrad import NevergradSearch from ray.tune.suggest.sigopt import SigOptSearch from ray.tune.suggest.zoopt import ZOOptSearch -from zoopt import ValueType from ray.tune.utils import validate_save_restore