轻松并行化

并行化 optuna.study.Study.optimize() 是非常直接的。

如果您想手动执行 Optuna 优化

  1. 启动一个 RDB 服务器(此示例使用 MySQL)

  2. 使用 --storage 参数创建一个 study

  3. 在多个节点和进程之间共享 study

当然,您可以使用 Kubernetes,就像kubernetes 示例中那样。

要了解 Optuna 中的并行优化如何工作,请查看下面的视频。

创建 Study

您可以使用 optuna create-study 命令创建一个 study。或者,在 Python 脚本中您可以使用 optuna.create_study()

$ mysql -u root -e "CREATE DATABASE IF NOT EXISTS example"
$ optuna create-study --study-name "distributed-example" --storage "mysql://root@localhost/example"
[I 2020-07-21 13:43:39,642] A new study created with name: distributed-example

然后,编写一个优化脚本。假设 foo.py 包含以下代码。

import optuna


def objective(trial):
    x = trial.suggest_float("x", -10, 10)
    return (x - 2) ** 2


if __name__ == "__main__":
    study = optuna.load_study(
        study_name="distributed-example", storage="mysql://root@localhost/example"
    )
    study.optimize(objective, n_trials=100)

在多个节点和进程之间共享 Study

最后,从多个进程运行共享的 study。例如,在一个终端中运行 Process 1,然后在另一个终端中运行 Process 2。它们会根据共享的试验历史获取参数建议。

进程 1

$ python foo.py
[I 2020-07-21 13:45:02,973] Trial 0 finished with value: 45.35553104173011 and parameters: {'x': 8.73465151598285}. Best is trial 0 with value: 45.35553104173011.
[I 2020-07-21 13:45:04,013] Trial 2 finished with value: 4.6002397305938905 and parameters: {'x': 4.144816945707463}. Best is trial 1 with value: 0.028194513284051464.
...

进程 2(与进程 1 使用相同的命令)

$ python foo.py
[I 2020-07-21 13:45:03,748] Trial 1 finished with value: 0.028194513284051464 and parameters: {'x': 1.8320877810162361}. Best is trial 1 with value: 0.028194513284051464.
[I 2020-07-21 13:45:05,783] Trial 3 finished with value: 24.45966755098074 and parameters: {'x': 6.945671597566982}. Best is trial 1 with value: 0.028194513284051464.
...

注意

n_trials 是每个进程将运行的试验数量,而不是所有进程的试验总数。例如,上面给出的脚本为每个进程运行 100 个试验,100 个试验 * 2 个进程 = 200 个试验。optuna.study.MaxTrialsCallback 可以确保在所有进程中执行试验的总次数。

注意

我们不建议在分布式优化中大规模使用 SQLite,因为它可能导致死锁和严重的性能问题。请考虑使用其他数据库引擎,如 PostgreSQL 或 MySQL。

注意

在运行分布式优化时,请避免将 SQLite 数据库放在 NFS 上。另请参阅:https://www.sqlite.org/faq.html#q5

脚本总运行时间: (0 minutes 0.000 seconds)

由 Sphinx-Gallery 生成的画廊 (Gallery)