Note
Go to the end to download the full example code.
並列化の容易さ
optuna.study.Study.optimize()
の並列化は簡単です。
手動で Optuna の最適化を実行したい場合:
RDB サーバーを起動(この例では MySQL を使用)
--storage
引数でスタディを作成複数ノード/プロセス間でスタディを共有
もちろん、Kubernetes の例 のように Kubernetes も利用可能です。
Optuna の並列最適化の動作を確認するには、以下の動画をご覧ください。
スタディの作成
optuna create-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)
複数ノード/プロセス間でスタディを共有
最後に、共有したスタディを複数プロセスで実行します。
例えば、1つのターミナルで Process 1
を実行し、別のターミナルで Process 2
を実行します。
共有されたトライアル履歴に基づいてパラメータ提案が行われます。
Process 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.
...
Process 2(Process 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.
...
Note
n_trials
は各プロセスが実行するトライアル数であり、全プロセスの合計トライアル数ではありません。上記のスクリプトでは各プロセスで100トライアル、合計200トライアル(100トライアル×2プロセス)を実行します。optuna.study.MaxTrialsCallback
を使用すると、全プロセスでのトライアル実行回数を制御できます。
Note
大規模分散最適化では SQLite の使用は推奨しません。デッドロックや深刻なパフォーマンス問題が発生する可能性があります。PostgreSQL や MySQL などの他のデータベースエンジンの使用を検討してください。
Note
分散最適化時に SQLite データベースを NFS に置くことは避けてください。詳細は https://www.sqlite.org/faq.html#q5 も参照してください。
Total running time of the script: (0 minutes 0.000 seconds)