Contenu connexe
Similaire à Optuna Dashboardの紹介と設計解説 - 2022/12/10 Optuna Meetup #2 (20)
Plus de Preferred Networks (20)
Optuna Dashboardの紹介と設計解説 - 2022/12/10 Optuna Meetup #2
- 2. 2
Masashi Shibata / @c-bata
● Preferred Networks, Inc. / エンジニア
● Optunaコミッター
● Optuna Dashboard, CyberAgentAILab/cmaes, Goptuna 作者
● Kubeflow/Katibレビュアー
● 共訳書「エキスパートPythonプログラミング 改訂2版/改訂3版
(KADOKAWA) 」 、著書「実践Django (翔泳社) 」
● 前回の発表:CMA-ESサンプラーによるハイパーパラメータ最適化 -
Optuna Meetup #1
- 4. 4
概要
● Optunaの試行結果を手軽に確認できるWebアプリケーション
● 当初はGoptuna (https://github.com/c-bata/goptuna)のために実装。
その後Optunaからも使えるようにAPIサーバーをPythonで再実装。
● GitHub: https://github.com/optuna/optuna-dashboard
主な機能・特徴
1. Plotlyによる最適化履歴やハイパーパラメーターの重要度の可視化
2. APIポーリングによる準リアルタイム同期
3. 試行結果の閲覧だけでなく、Studyの作成や削除等も可能
Optuna Dashboardとは?
- 7. 7
使い方
$ pip install optuna-dashboard
$ optuna-dashboard sqlite:///db.sqlite3
$ docker run -it --rm -p 8080:8080 -v `pwd`:/app -w /app
ghcr.io/optuna/optuna-dashboard sqlite:///db.sqlite3
基本的な使い方
次のようにコマンドを2つ実行して、表示されるURLにアクセスする。
Dockerを使用する
公式のDockerイメージを利用することで、Pythonの環境構築は不要。
- 8. 8
発展的な使い方① Python APIを利用する
import optuna
from optuna_dashboard import run_server
def objective(trial):
x = trial.suggest_float("x", -100, 100)
return x**2
storage = optuna.storages.InMemoryStorage()
study = optuna.create_study(study_name="Demo", storage=storage)
study.optimize(objective, n_trials=100)
run_server(storage, host="localhost", port=8800)
InMemoryStorageも利用可能
RDBStorage以外のストレージについては、Python APIが利用可能
- 15. 15
軽量なWSGIフレームワークである
Bottleを使って実装
● 中心となるコードを右に示す
(一部簡略化して掲載)
● create_app関数は、ストレージ
を受け取りBottleオブジェクト
(WSGI application)を返す
● それぞれのAPI View関数で適宜
ストレージAPIを呼び出し、そ
の結果をJSONで返す
JSON APIサーバーの実装
from bottle import Bottle, response
def create_app(storage: BaseStorage) -> Bottle:
app = Bottle()
@app.get("/api/studies")
def list_study_summaries():
studies = storage.get_all_studies()
serialized = serialize_studies(...)
response.content_type = "application/json"
return {"study_summaries": serialized}
@app.delete("/api/studies/<study_id:int>")
def delete_study(study_id: int):
storage.delete_study(study_id)
...
return app
optuna_dashboard/_app.py (一部簡略化)
- 16. 16
静的ファイルの配信
● 実際にはAPIの提供だけではな
く、静的ファイル配信も担当
gzip対応
● バンドル済みJSや画像は、gzip
圧縮したものもsdistに同梱
● Accept-Encodingヘッダーを確
認して適宜返却
静的ファイルの配信
from bottle import request, response, static_file
def create_app(storage: BaseStorage) -> Bottle:
...
# Accept any following paths for client-side routing
@app.get("/dashboard<:re:(/.*)?>")
def dashboard():
return static_file("index.html", ...)
@app.get("/static/<filename:path>")
def send_static(filename: str):
if "gzip" in request.headers["Accept-Encoding"]:
gz_filename = filename.strip("/") + ".gz"
if os.path.exists(...):
filename = gz_filename
return static_file(filename, root=STATIC_DIR)
...
optuna_dashboard/_app.py (一部簡略化)
- 27. 27
高速な重要度計算
https://github.com/optuna/optuna-fast-fanova
● n_trials >= 1000 のStudyは、
画面の表示に1分半以上かかる
● 重要度の計算アルゴリズム
(fANOVA)をCythonで高速化
● 1分半から約8秒に短縮
● evaluatorを差し替えるだけ。
Dashboard以外でも利用可能。
ハイパーパラメータ重要度計算のCythonによる高速化
import optuna
from optuna.importance import get_param_importances
from optuna_fast_fanova import FanovaImportanceEvaluator
study = optuna.load_study(...)
importance = get_param_importances(
study, evaluator=FanovaImportanceEvaluator()
)
print(importance)
- 28. 28
CLS: Cumulative Layout Shift
累積レイアウトシフト
● 画像等の読み込みが遅延して画
面がガクッとずれる問題 (誤タッ
プを誘発するなどUXが低下)
● Dashboardには多くのグラフが
表示されるため、以前は大きな
レイアウトシフトが発生
● 各要素の縦横比固定で大幅改善
(Lighthouse: 0.434→0.005)
Cumulative Layout Shift 対策