From ac4b008b63e3e3e6e55f135bf1f8b1e74b9598ae Mon Sep 17 00:00:00 2001 From: nabenabe0928 Date: Wed, 12 Jun 2024 10:29:16 +0200 Subject: [PATCH 1/6] Move rapids example --- README.md | 2 +- rapids_simple.py => rapids/rapids_simple.py | 0 rapids/requirements.txt | 4 ++++ 3 files changed, 5 insertions(+), 1 deletion(-) rename rapids_simple.py => rapids/rapids_simple.py (100%) create mode 100644 rapids/requirements.txt diff --git a/README.md b/README.md index edfd49e4..7221801c 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ The examples below provide codeblocks similar to the example above for various d * [PyTorch Ignite](./pytorch/pytorch_ignite_simple.py) * [PyTorch Lightning](./pytorch/pytorch_lightning_simple.py) * [PyTorch Lightning (DDP)](./pytorch/pytorch_lightning_ddp.py) -* [RAPIDS](./rapids_simple.py) +* [RAPIDS](./rapids/rapids_simple.py) * [Scikit-learn](./sklearn/sklearn_simple.py) * [Scikit-learn OptunaSearchCV](./sklearn/sklearn_optuna_search_cv_simple.py) * [Scikit-image](./skimage/skimage_lbp_simple.py) diff --git a/rapids_simple.py b/rapids/rapids_simple.py similarity index 100% rename from rapids_simple.py rename to rapids/rapids_simple.py diff --git a/rapids/requirements.txt b/rapids/requirements.txt new file mode 100644 index 00000000..e4598c65 --- /dev/null +++ b/rapids/requirements.txt @@ -0,0 +1,4 @@ +optuna +scikit-learn>=0.19.0 +cudf +cuml From a4b41eb79318267a715c3c0370127e2bad46b86c Mon Sep 17 00:00:00 2001 From: nabenabe0928 Date: Wed, 12 Jun 2024 10:39:42 +0200 Subject: [PATCH 2/6] Move py files to directory --- README.md | 10 +++--- .../enqueue_trial.py | 0 .../max_trials_callback.py | 0 .../quadratic_simple.py | 0 .../quadratic_simple_constraint.py | 0 .../quadratic_simple_multi_objective.py | 34 +++++++++++++++++++ basic_and_faq_usages/requirements.txt | 2 ++ .../simple_pruning.py | 0 8 files changed, 41 insertions(+), 5 deletions(-) rename enqueue_trial.py => basic_and_faq_usages/enqueue_trial.py (100%) rename max_trials_callback.py => basic_and_faq_usages/max_trials_callback.py (100%) rename quadratic_simple.py => basic_and_faq_usages/quadratic_simple.py (100%) rename quadratic_simple_constraint.py => basic_and_faq_usages/quadratic_simple_constraint.py (100%) create mode 100644 basic_and_faq_usages/quadratic_simple_multi_objective.py create mode 100644 basic_and_faq_usages/requirements.txt rename simple_pruning.py => basic_and_faq_usages/simple_pruning.py (100%) diff --git a/README.md b/README.md index 7221801c..85a0aad5 100644 --- a/README.md +++ b/README.md @@ -25,9 +25,9 @@ The examples below provide codeblocks similar to the example above for various d ### Simple Black-box Optimization -* [Quadratic function](./quadratic_simple.py) -* [Quadratic multi-objective function](./multi_objective/quadratic_simple.py) -* [Quadratic function with constraints](./quadratic_simple_constraint.py) +* [Quadratic function](./basic_and_faq_usages/quadratic_simple.py) +* [Quadratic multi-objective function](./basic_and_faq_usages/quadratic_simple_multi_objective.py) +* [Quadratic function with constraints](./basic_and_faq_usages/quadratic_simple_constraint.py) ### Examples with ML Libraries @@ -72,7 +72,7 @@ The following example demonstrates how to implement an objective function that u The following example demonstrates how to implement pruning logic with Optuna. -* [Simple pruning (scikit-learn)](./simple_pruning.py) +* [Simple pruning (scikit-learn)](./basic_and_faq_usages/simple_pruning.py) In addition, integration modules are available for the following libraries, providing simpler interfaces to utilize pruning. @@ -116,7 +116,7 @@ In addition, integration modules are available for the following libraries, prov ### An example to enqueue trials with given parameter values -* [Enqueuing trials with given parameters](./enqueue_trial.py) +* [Enqueuing trials with given parameters](./basic_and_faq_usages/enqueue_trial.py) ### Examples of aim diff --git a/enqueue_trial.py b/basic_and_faq_usages/enqueue_trial.py similarity index 100% rename from enqueue_trial.py rename to basic_and_faq_usages/enqueue_trial.py diff --git a/max_trials_callback.py b/basic_and_faq_usages/max_trials_callback.py similarity index 100% rename from max_trials_callback.py rename to basic_and_faq_usages/max_trials_callback.py diff --git a/quadratic_simple.py b/basic_and_faq_usages/quadratic_simple.py similarity index 100% rename from quadratic_simple.py rename to basic_and_faq_usages/quadratic_simple.py diff --git a/quadratic_simple_constraint.py b/basic_and_faq_usages/quadratic_simple_constraint.py similarity index 100% rename from quadratic_simple_constraint.py rename to basic_and_faq_usages/quadratic_simple_constraint.py diff --git a/basic_and_faq_usages/quadratic_simple_multi_objective.py b/basic_and_faq_usages/quadratic_simple_multi_objective.py new file mode 100644 index 00000000..877dbf2d --- /dev/null +++ b/basic_and_faq_usages/quadratic_simple_multi_objective.py @@ -0,0 +1,34 @@ +""" +Optuna example that optimizes simple quadratic functions. + +In this example, we optimize two objective values. +Unlike single-objective optimization, an optimization gives a trade-off between two objectives. +As a result, we get the best trade-offs between two objectives, a.k.a Pareto solutions. + +""" + +import optuna + + +# Define two objective functions. +# We would like to minimize f1 and maximize f2. +def objective(trial): + x = trial.suggest_float("x", -100, 100) + y = trial.suggest_categorical("y", [-1, 0, 1]) + f1 = x**2 + y + f2 = -((x - 2) ** 2 + y) + return f1, f2 + + +if __name__ == "__main__": + # We minimize the first objective value and maximize the second objective value. + study = optuna.create_study(directions=["minimize", "maximize"]) + study.optimize(objective, n_trials=500, timeout=1) + + print("Number of finished trials: ", len(study.trials)) + + for i, best_trial in enumerate(study.best_trials): + print(f"The {i}-th Pareto solution was found at Trial#{best_trial.number}.") + print(f" Params: {best_trial.params}") + f1, f2 = best_trial.values + print(f" Values: {f1=}, {f2=}") diff --git a/basic_and_faq_usages/requirements.txt b/basic_and_faq_usages/requirements.txt new file mode 100644 index 00000000..cd1f442a --- /dev/null +++ b/basic_and_faq_usages/requirements.txt @@ -0,0 +1,2 @@ +optuna +scikit-learn>=0.19.0 diff --git a/simple_pruning.py b/basic_and_faq_usages/simple_pruning.py similarity index 100% rename from simple_pruning.py rename to basic_and_faq_usages/simple_pruning.py From a430452c37cd749a92319b1ea5bbf67441160080 Mon Sep 17 00:00:00 2001 From: nabenabe0928 Date: Wed, 12 Jun 2024 10:50:17 +0200 Subject: [PATCH 3/6] Fix ci workflow files --- .github/workflows/basic_and_faq_usages.yml | 42 ++++++++++++++++++++++ .github/workflows/rapids.yml | 36 +++++++++++++++++++ basic_and_faq_usages/requirements.txt | 1 + requirements.txt | 8 ++--- 4 files changed, 83 insertions(+), 4 deletions(-) create mode 100644 .github/workflows/basic_and_faq_usages.yml create mode 100644 .github/workflows/rapids.yml diff --git a/.github/workflows/basic_and_faq_usages.yml b/.github/workflows/basic_and_faq_usages.yml new file mode 100644 index 00000000..0af483b5 --- /dev/null +++ b/.github/workflows/basic_and_faq_usages.yml @@ -0,0 +1,42 @@ +name: base + +on: + schedule: + - cron: '0 15 * * *' + pull_request: + paths: + - 'basic_and_faq_usages/**' + - '.github/workflows/basic_and_faq_usages.yml' + +jobs: + examples: + if: (github.event_name == 'schedule' && github.repository == 'optuna/optuna-examples') || (github.event_name != 'schedule') + runs-on: ubuntu-latest + strategy: + matrix: + python-version: ['3.7', '3.8', '3.9', '3.10', '3.11', '3.12'] + + steps: + - uses: actions/checkout@v4 + - name: setup-python${{ matrix.python-version }} + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + - name: Install (Python) + run: | + python -m pip install --upgrade pip + pip install --progress-bar off -U setuptools + pip install git+https://github.com/optuna/optuna.git + python -c 'import optuna' + + pip install -r basic_and_faq_usages/requirements.txt + - name: Run examples + run: | + python basic_and_faq_usages/max_trials_callback.py + python basic_and_faq_usages/enqueue_trial.py + python basic_and_faq_usages/quadratic_simple.py + python basic_and_faq_usages/simple_pruning.py + python basic_and_faq_usages/quadratic_simple_constraint.py + python basic_and_faq_usages/quadratic_simple_multi_objective.py + env: + OMP_NUM_THREADS: 1 diff --git a/.github/workflows/rapids.yml b/.github/workflows/rapids.yml new file mode 100644 index 00000000..e5907da2 --- /dev/null +++ b/.github/workflows/rapids.yml @@ -0,0 +1,36 @@ +name: base + +on: + schedule: + - cron: '0 15 * * *' + pull_request: + paths: + - 'rapids/**' + - '.github/workflows/rapids.yml' + +jobs: + examples: + if: (github.event_name == 'schedule' && github.repository == 'optuna/optuna-examples') || (github.event_name != 'schedule') + runs-on: ubuntu-latest + strategy: + matrix: + python-version: ['3.7', '3.8', '3.9', '3.10', '3.11', '3.12'] + + steps: + - uses: actions/checkout@v4 + - name: setup-python${{ matrix.python-version }} + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + - name: Install (Python) + run: | + python -m pip install --upgrade pip + pip install --progress-bar off -U setuptools + pip install git+https://github.com/optuna/optuna.git + python -c 'import optuna' + + - name: Run examples + run: | + python -m py_compile rapids/rapids_simple.py # due to difficulty in importing, compile only + env: + OMP_NUM_THREADS: 1 diff --git a/basic_and_faq_usages/requirements.txt b/basic_and_faq_usages/requirements.txt index cd1f442a..fd6f7d19 100644 --- a/basic_and_faq_usages/requirements.txt +++ b/basic_and_faq_usages/requirements.txt @@ -1,2 +1,3 @@ optuna scikit-learn>=0.19.0 +pandas diff --git a/requirements.txt b/requirements.txt index da7a2190..4dc05e11 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -jupyter # used in quickstart.ipynb -pandas # used in max_trials_callback.py -plotly # used in quickstart.ipynb -scikit-learn # used in enqueue_trial.py and quickstart.ipynb +# Used in quickstart.ipynb +jupyter +plotly +scikit-learn From dd11e93e6db0722865168d5f389df2a1c0817409 Mon Sep 17 00:00:00 2001 From: nabenabe0928 Date: Wed, 12 Jun 2024 10:53:23 +0200 Subject: [PATCH 4/6] Fix base.yml --- .github/workflows/base.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.github/workflows/base.yml b/.github/workflows/base.yml index 63487f94..6b8bea09 100644 --- a/.github/workflows/base.yml +++ b/.github/workflows/base.yml @@ -33,11 +33,6 @@ jobs: pip install -r requirements.txt - name: Run examples run: | - python max_trials_callback.py - python enqueue_trial.py - python quadratic_simple.py - python simple_pruning.py - python -m py_compile rapids_simple.py # due to difficulty importing, compile only jupyter nbconvert --to notebook --execute quickstart.ipynb env: OMP_NUM_THREADS: 1 From e02b477a8b39e253813812544379750cb41dca19 Mon Sep 17 00:00:00 2001 From: nabenabe0928 Date: Wed, 12 Jun 2024 11:08:00 +0200 Subject: [PATCH 5/6] Fix simple constraint to Python3.7 --- .github/workflows/basic_and_faq_usages.yml | 2 +- basic_and_faq_usages/quadratic_simple_constraint.py | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/basic_and_faq_usages.yml b/.github/workflows/basic_and_faq_usages.yml index 0af483b5..dac697cb 100644 --- a/.github/workflows/basic_and_faq_usages.yml +++ b/.github/workflows/basic_and_faq_usages.yml @@ -1,4 +1,4 @@ -name: base +name: basic_and_faq_usages on: schedule: diff --git a/basic_and_faq_usages/quadratic_simple_constraint.py b/basic_and_faq_usages/quadratic_simple_constraint.py index c18c768a..023f710f 100644 --- a/basic_and_faq_usages/quadratic_simple_constraint.py +++ b/basic_and_faq_usages/quadratic_simple_constraint.py @@ -56,8 +56,8 @@ def constraints(trial): else: best_trial_number = sorted(feasible_trial_numbers, key=lambda i: study.trials[i].value)[0] best_trial = study.trials[best_trial_number] - print(f"Best trial was found at Trial#{best_trial_number}") - print(f" Params: {best_trial.params}") - print(f" Value: {best_trial.value}") + print("Best trial was found at Trial#{}".format(best_trial_number)) + print(" Params: {}".format(best_trial.params)) + print(" Value: {}".format(best_trial.value)) c1, c2 = best_trial.system_attrs["constraints"] - print(f" Constraints: {c1=}, {c2=}") + print(" Constraints: c1={}, c2={}".format(c1, c2)) From f131325d8f81cd1c76cc2a7769f1db15a22e6e5e Mon Sep 17 00:00:00 2001 From: nabenabe0928 Date: Wed, 12 Jun 2024 11:15:35 +0200 Subject: [PATCH 6/6] Fix simple MO to Python3.7 --- basic_and_faq_usages/quadratic_simple_multi_objective.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/basic_and_faq_usages/quadratic_simple_multi_objective.py b/basic_and_faq_usages/quadratic_simple_multi_objective.py index 877dbf2d..c01033c6 100644 --- a/basic_and_faq_usages/quadratic_simple_multi_objective.py +++ b/basic_and_faq_usages/quadratic_simple_multi_objective.py @@ -28,7 +28,7 @@ def objective(trial): print("Number of finished trials: ", len(study.trials)) for i, best_trial in enumerate(study.best_trials): - print(f"The {i}-th Pareto solution was found at Trial#{best_trial.number}.") - print(f" Params: {best_trial.params}") + print("The {}-th Pareto solution was found at Trial#{}.".format(i, best_trial.number)) + print(" Params: {}".format(best_trial.params)) f1, f2 = best_trial.values - print(f" Values: {f1=}, {f2=}") + print(" Values: f1={}, f2={}".format(f1, f2))