ray icon indicating copy to clipboard operation
ray copied to clipboard

[Tune] Using `sample_from` breaks `BayesOptSearch`

Open Paippi opened this issue 9 months ago • 0 comments

What happened + What you expected to happen

Using ray.tune.sample_from with BayesOptSearch and points_to_evaluate parameter. Causes the dictionary values to be indexed, which isn't possible for non-indexable values. Expected behavior is to be able to specify starting values for the algorithm, along with using sample_from to sample parameters, e.g., when creating samples depending on another value.

Error message I get: TypeError: 'int' object is not subscriptable

Versions / Dependencies

Ray version: 2.22.0 Python version: 3.9.2 OS: Debian GNU/Linux 11.9

Other libraries:

$ pipenv graph
bayesian-optimization==1.4.3
  - colorama [required: >=0.4.6, installed: 0.4.6]
  - numpy [required: >=1.9.0, installed: 1.26.4]
  - scikit-learn [required: >=0.18.0, installed: 1.4.2]
    - joblib [required: >=1.2.0, installed: 1.4.2]
    - numpy [required: >=1.19.5, installed: 1.26.4]
    - scipy [required: >=1.6.0, installed: 1.13.0]
      - numpy [required: >=1.22.4,<2.3, installed: 1.26.4]
    - threadpoolctl [required: >=2.0.0, installed: 3.5.0]
  - scipy [required: >=1.0.0, installed: 1.13.0]
    - numpy [required: >=1.22.4,<2.3, installed: 1.26.4]
black==24.4.2
  - click [required: >=8.0.0, installed: 8.1.7]
  - mypy-extensions [required: >=0.4.3, installed: 1.0.0]
  - packaging [required: >=22.0, installed: 24.0]
  - pathspec [required: >=0.9.0, installed: 0.12.1]
  - platformdirs [required: >=2, installed: 4.2.2]
  - tomli [required: >=1.1.0, installed: 2.0.1]
  - typing-extensions [required: >=4.0.1, installed: 4.11.0]
fsspec==2024.5.0
neovim==0.3.1
  - pynvim [required: >=0.3.1, installed: 0.5.0]
    - greenlet [required: >=3.0, installed: 3.0.3]
    - msgpack [required: >=0.5.0, installed: 1.0.8]
pandas==2.2.2
  - numpy [required: >=1.22.4, installed: 1.26.4]
  - python-dateutil [required: >=2.8.2, installed: 2.9.0.post0]
    - six [required: >=1.5, installed: 1.16.0]
  - pytz [required: >=2020.1, installed: 2024.1]
  - tzdata [required: >=2022.7, installed: 2024.1]
pyarrow==16.1.0
  - numpy [required: >=1.16.6, installed: 1.26.4]
ray==2.22.0
  - aiosignal [required: Any, installed: 1.3.1]
    - frozenlist [required: >=1.1.0, installed: 1.4.1]
  - click [required: >=7.0, installed: 8.1.7]
  - filelock [required: Any, installed: 3.14.0]
  - frozenlist [required: Any, installed: 1.4.1]
  - jsonschema [required: Any, installed: 4.22.0]
    - attrs [required: >=22.2.0, installed: 23.2.0]
    - jsonschema-specifications [required: >=2023.03.6, installed: 2023.12.1]
      - referencing [required: >=0.31.0, installed: 0.35.1]
        - attrs [required: >=22.2.0, installed: 23.2.0]
        - rpds-py [required: >=0.7.0, installed: 0.18.1]
    - referencing [required: >=0.28.4, installed: 0.35.1]
      - attrs [required: >=22.2.0, installed: 23.2.0]
      - rpds-py [required: >=0.7.0, installed: 0.18.1]
    - rpds-py [required: >=0.7.1, installed: 0.18.1]
  - msgpack [required: >=1.0.0,<2.0.0, installed: 1.0.8]
  - packaging [required: Any, installed: 24.0]
  - protobuf [required: >=3.15.3,!=3.19.5, installed: 5.26.1]
  - pyyaml [required: Any, installed: 6.0.1]
  - requests [required: Any, installed: 2.31.0]
    - certifi [required: >=2017.4.17, installed: 2024.2.2]
    - charset-normalizer [required: >=2,<4, installed: 3.3.2]
    - idna [required: >=2.5,<4, installed: 3.7]
    - urllib3 [required: >=1.21.1,<3, installed: 2.2.1]
tensorboardX==2.6.2.2
  - numpy [required: Any, installed: 1.26.4]
  - packaging [required: Any, installed: 24.0]
  - protobuf [required: >=3.20, installed: 5.26.1]

Reproduction script

from ray import tune, train as ray_train
from ray.train import Checkpoint, RunConfig, CheckpointConfig
from ray.tune.search.bayesopt import BayesOptSearch


def objective(config):
    return {"score": 1}


initial_params = [{"a": 1}]

search_space = {"a": tune.sample_from(lambda: 2)}
# Using the following search_space, would work
# search_space = {"a": 2}

bayesopt = BayesOptSearch(points_to_evaluate=initial_params)

tuner = tune.Tuner(
    objective,
    param_space=search_space,
    tune_config=tune.TuneConfig(
        metric="score", mode="max", search_alg=bayesopt
    ),
)
tuner.fit()

Issue Severity

Medium

Paippi avatar May 17 '24 10:05 Paippi