Optuna Dashboard
の紹介と設計解説
2022/12/10 Optuna Meetup #2
Masashi Shibata(GitHub: @c-bata)
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
3
Optuna Dashboardとは?
Study一覧表示、作成や削除・検索 表やグラフによる試行結果の可視化
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とは?
5
アジェンダ
1. Optuna Dashboardの使い方
2. 設計解説
3. 最近入った機能の紹介
ゴール
● Optuna Dashboardを使いこなせるようになる
● Optuna Dashboardのコードリーディングを進められるようになり、
開発に興味を持っていただく
本発表の内容
6
Optuna Dashboardの使い方
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
発展的な使い方① 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が利用可能
9
自分だけが閲覧するのではなく第三
者に提供する場合
● セキュリティや性能の観点から
GunicornやuWSGIの利用を推奨
● デフォルトのwsgirefサーバーは
あくまで個人での利用にとどめ
てください
● optuna_dashboard.wsgi関数は
WSGIエントリーポイントを提供
発展的な使い方② 第三者向けにホスティングする
from optuna.storages import RDBStorage
from optuna_dashboard import wsgi
storage = RDBStorage("sqlite:///db.sqlite3")
application = wsgi(storage)
main.py
$ gunicorn --workers 4 main:application
Gunicornによる起動
$ uwsgi --http :8080 --workers 4 --wsgi-file
main.py
uWSGIによる起動
10
設計解説
11
構成要素
● API ServerとSPA(Single Page
Application)の大きく2つ
● 以降のスライドでそれぞれ解説
特徴
● API Endpointは6つ、Webペー
ジは2つと小さく実装
● APIポーリングで準リアルタイ
ムにグラフを更新
全体感と構成要素
12
APIサーバーの実装
13
Optunaのストレージインターフェイス
RDBStorage
InMemoryStorage
JournalStorage
optuna.storages.BaseStorage
Studyの作成
storage.create_new_study()
Trial一覧の取得
storage.get_all_trials()
評価値の保存
storage.set_trial_state_values()
Optunaは共通のストレージインターフェイス(BaseStorage)を定義する
ことで試行結果の保存先をRDBやRedis、インメモリなど切り替え可能
DaskStorage
選択されたパラメーターの保存
storage.set_trial_param()
Optuna
Study
Trial
Sampler
14
Optunaのストレージインターフェイス
RDBStorage
InMemoryStorage
JournalStorage
optuna.storages.BaseStorage
Study一覧の取得
storage.get_all_studies()
Trial一覧の取得
storage.get_all_trials()
Studyの削除
storage.delete_study()
Optuna DashboardのAPIサーバーは、BaseStorageのAPIを呼び出すこ
とで、Optunaの試行結果にアクセスし、Webフロントエンドに提供。
DaskStorage
Studyの作成
storage.create_new_study()
Optuna Dashboard
JSON API Server
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
静的ファイルの配信
● 実際には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 (一部簡略化)
17
高速化のための工夫
● インメモリキャッシュ:OptunaではCompleteやFailなど終了したTrial
の情報は変更できないのでそれをもとにTrial情報をキャッシュ
● Slow Query Log Profiler:sqlalchemy.eventを使った独自のプロファ
イラを実装。SQLレベルのボトルネックが手軽に発見可能。
● Cythonによる高速な重要度計算(後のスライドで紹介)
複数のOptunaバージョンのサポート
● BaseStorageはOptunaの利用者が直接呼び出すことを想定しておら
ず、破壊的変更が入るためその差異を吸収。
その他の工夫
18
Webフロントエンドの実装
19
概要
● Optuna/Goptunaの両方で使えるようにSPA(Single Page
Application)として実装
● 主な処理はStudyやTrialをJSON APIから取得してPlotlyで可視化
その他の主な使用ライブラリ (詳細な技術解説は割愛)
● MUI:各種ボタンや表などのコンポーネントを使用
● Recoil:React.jsの状態管理に使用
● React Router:クライアントサイドルーティングに使用
● Axios:HTTPクライアントとして使用
● Webpack/ts-loader等:TypeScriptのコンパイルやbundle.jsの生成
Webフロントエンドの実装概要
20
Plotlyとは
● optuna.visualization モジュール
が提供する可視化関数はPlotlyで
実装 (matplotlib実装も存在)
● Optuna DashboardではOptuna
に実装された8つの可視化関数を
すべてTypeScriptに移植
● TypeScriptで再実装したことで
インタラクティブな操作が可能
Plotlyによる可視化
21
Optuna
optuna.visualization
Plotly (JavaScript)
実装上の課題
● Optunaに比べて開発者が少なく
考慮漏れが起きやすい
PlotDataレベルでの比較
● Plotly (Python)の描画処理は、
Plotly(JavaScript)を使用
● どちらの可視化関数も共通して
PlotDataオブジェクトを出力
→ PlotDataレベルで比較が可能
可視化機能の品質向上 by @keisuke-umezawa
plotly.PlotData
オブジェクト
Optuna Dashboard
PlotData
(JSON)
Plotly (Python) Plotly (JavaScript)
PlotData
(JSON)
22
可視化用Reactコンポーネントの一連の流れ
1. StudyやTrial一覧を読み込むため、データ取得のActionを発火
(準リアルタイムに結果を反映するため定期的に発行)
2. APIサーバーにStudyやTrial一覧を問い合わせ
3. APIの結果をStore(Recoil Atoms)に書き込み
4. Storeから描画に必要な情報を取得して、plotlyのPlotDataを生成
5. PlotDataをPlotly.jsに渡し、ブラウザ上に描画
①
③
Action
データ取得
Store
Recoil Atoms
API Server
View
Reactコンポーネント
plotlyの
PlotData
④ ⑤
②
23
なぜユニットテストが難しいか
● Plotly.jsによる可視化機能は、
Assertionが非自明
● 可視化関数の入力であるTrial情
報は構造が複雑で手動で用意す
るとテストが冗長になる
どのように解決したか
● pyppeteerを使った独自のツール
を作成。PRレビューコストも大
幅に削減。
テスト / QA戦略
様々な目的関数についてOptunaを実行し、
Headless Chromeでスクリーンショットを撮影
24
開発への参加
25
開発に興味を持っていただけた方へ
● 各種LinterやFormatter、ユニットテストの実行方法、JSのビルド方法
等は CONTRIBUTING.md にまとまっています。
● 興味はあるけど何を実装したらいいか知りたい方は、 contribution
welcomeラベルのついたGitHub Issuesをご確認ください。
具体的なタスク例
● React v18対応 (Issue #240)
● 不要なRe-renderingの解消による速度向上 (Issue #242)
● パレートフロント解を求めるアルゴリズムの高速化 (Issue #63)
開発への参加
26
最近入った機能の紹介
(2022.03~)
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
CLS: Cumulative Layout Shift
累積レイアウトシフト
● 画像等の読み込みが遅延して画
面がガクッとずれる問題 (誤タッ
プを誘発するなどUXが低下)
● Dashboardには多くのグラフが
表示されるため、以前は大きな
レイアウトシフトが発生
● 各要素の縦横比固定で大幅改善
(Lighthouse: 0.434→0.005)
Cumulative Layout Shift 対策
29
機能紹介
● Study詳細ページ最下部に自由に
メモを残すことができます。
● 学習時の設定等をメモするのに
ご利用ください。
細部の作り込み
● バージョン管理により、誤って内
容を上書きするのを防止。
● 内部ではstudy.system_attrsに
格納。RDBStorageでは、長さに
制限があるため分割して保存。
メモ機能
30
Contour Plot
● パラメーター間の関係を把握す
る際に有用な等高線図が追加。
● optuna.visualization.plot_cont
our() 関数に相当します。
● @RE-yura さんの貢献によりサ
ポートされました!
等高線図 (Contour Plot)
31
ダークモードのサポート
システム設定に応じて自動
的に選択されますが、
「月」「太陽」ボタンから
明示的に切り替え可能
32
Reactのアプリケーションが読み込
まれるまでの、ほんの一瞬だけ表示
されています (視認はやや困難)。
● “Optuna: A Next Generation
Hyperparamter Optimization
Framework” の冒頭で登場した
アニメーションを再現
https://youtu.be/-UeC4MR3PHM
● ロゴ画像からSVG pathを抽出、
CSSアニメーションで実装。
読み込み時のアニメーション
33
まとめ
34
本発表で話したこと
● Optuna Dashboardの使い方
● JSON APIサーバーやWebフロントエンドの設計解説
● 最近入った機能の紹介
最後におねがい
● 非常に手軽に使えるので、ぜひお試しください!
● なにかご要望があればGitHub Issueの作成をお願いします!
● PR大歓迎です!
おわりに
Making the real world computable

More Related Content

PDF
最新リリース:Optuna V3の全て - 2022/12/10 Optuna Meetup #2
PDF
Kaggle Happywhaleコンペ優勝解法でのOptuna使用事例 - 2022/12/10 Optuna Meetup #2
PDF
JDLA主催「CVPR2023技術報告会」発表資料
PDF
深層学習の不確実性 - Uncertainty in Deep Neural Networks -
PDF
BlackBox モデルの説明性・解釈性技術の実装
PDF
深層強化学習の分散化・RNN利用の動向〜R2D2の紹介をもとに〜
PDF
時系列予測にTransformerを使うのは有効か?
PDF
【メタサーベイ】基盤モデル / Foundation Models
最新リリース:Optuna V3の全て - 2022/12/10 Optuna Meetup #2
Kaggle Happywhaleコンペ優勝解法でのOptuna使用事例 - 2022/12/10 Optuna Meetup #2
JDLA主催「CVPR2023技術報告会」発表資料
深層学習の不確実性 - Uncertainty in Deep Neural Networks -
BlackBox モデルの説明性・解釈性技術の実装
深層強化学習の分散化・RNN利用の動向〜R2D2の紹介をもとに〜
時系列予測にTransformerを使うのは有効か?
【メタサーベイ】基盤モデル / Foundation Models

What's hot (20)

PDF
最適輸送の解き方
PPTX
モデル高速化百選
PPTX
畳み込みニューラルネットワークの高精度化と高速化
PPTX
[DL輪読会]Focal Loss for Dense Object Detection
PDF
最適輸送入門
PDF
[DL輪読会]1次近似系MAMLとその理論的背景
PPTX
【DL輪読会】Efficiently Modeling Long Sequences with Structured State Spaces
PPTX
SSII2020 [OS2-02] 教師あり事前学習を凌駕する「弱」教師あり事前学習
PDF
Transformer メタサーベイ
PPTX
[DL輪読会]Grokking: Generalization Beyond Overfitting on Small Algorithmic Datasets
PDF
[DL輪読会]Temporal Abstraction in NeurIPS2019
PPTX
2014 3 13(テンソル分解の基礎)
PDF
【DL輪読会】マルチエージェント強化学習における近年の 協調的方策学習アルゴリズムの発展
PDF
最近のディープラーニングのトレンド紹介_20200925
PPTX
[DL輪読会]相互情報量最大化による表現学習
PDF
0から理解するニューラルネットアーキテクチャサーチ(NAS)
PPTX
強化学習の基礎と深層強化学習(東京大学 松尾研究室 深層強化学習サマースクール講義資料)
PPTX
[DL輪読会]When Does Label Smoothing Help?
PDF
「世界モデル」と関連研究について
PPTX
強化学習 と ゲーム理論 (MARL)
最適輸送の解き方
モデル高速化百選
畳み込みニューラルネットワークの高精度化と高速化
[DL輪読会]Focal Loss for Dense Object Detection
最適輸送入門
[DL輪読会]1次近似系MAMLとその理論的背景
【DL輪読会】Efficiently Modeling Long Sequences with Structured State Spaces
SSII2020 [OS2-02] 教師あり事前学習を凌駕する「弱」教師あり事前学習
Transformer メタサーベイ
[DL輪読会]Grokking: Generalization Beyond Overfitting on Small Algorithmic Datasets
[DL輪読会]Temporal Abstraction in NeurIPS2019
2014 3 13(テンソル分解の基礎)
【DL輪読会】マルチエージェント強化学習における近年の 協調的方策学習アルゴリズムの発展
最近のディープラーニングのトレンド紹介_20200925
[DL輪読会]相互情報量最大化による表現学習
0から理解するニューラルネットアーキテクチャサーチ(NAS)
強化学習の基礎と深層強化学習(東京大学 松尾研究室 深層強化学習サマースクール講義資料)
[DL輪読会]When Does Label Smoothing Help?
「世界モデル」と関連研究について
強化学習 と ゲーム理論 (MARL)
Ad

Similar to Optuna Dashboardの紹介と設計解説 - 2022/12/10 Optuna Meetup #2 (20)

PDF
Pycon2014 django performance
PDF
sbtマルチプロジェクトビルドの使いどころ
PPTX
Apache Spark 3.0新機能紹介 - 拡張機能やWebUI関連のアップデート(Spark Meetup Tokyo #3 Online)
PDF
20210511_PGStrom_GpuCache
PDF
20181212 - PGconf.ASIA - LT
PDF
(JP) GPGPUがPostgreSQLを加速する
PDF
Cell/B.E. プログラミング事始め
PDF
Building production server on docker
ODP
Building production server on docker
PDF
qmake入門
PPT
Cakephp勉強会@tokyo #4
PDF
de:code 2019 Cloud トラック 総まとめ!
PDF
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
PDF
はてなのサービスの開発環境
PDF
OCaml でデータ分析
PDF
Playbay Play 2.0 plugin イロハのイ
PDF
Tekton 入門
PDF
企業におけるSpring@日本springユーザー会20090624
PDF
Grafana Dashboards as Code
PDF
Capistrano
Pycon2014 django performance
sbtマルチプロジェクトビルドの使いどころ
Apache Spark 3.0新機能紹介 - 拡張機能やWebUI関連のアップデート(Spark Meetup Tokyo #3 Online)
20210511_PGStrom_GpuCache
20181212 - PGconf.ASIA - LT
(JP) GPGPUがPostgreSQLを加速する
Cell/B.E. プログラミング事始め
Building production server on docker
Building production server on docker
qmake入門
Cakephp勉強会@tokyo #4
de:code 2019 Cloud トラック 総まとめ!
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
はてなのサービスの開発環境
OCaml でデータ分析
Playbay Play 2.0 plugin イロハのイ
Tekton 入門
企業におけるSpring@日本springユーザー会20090624
Grafana Dashboards as Code
Capistrano
Ad

More from Preferred Networks (20)

PDF
PodSecurityPolicy からGatekeeper に移行しました / Kubernetes Meetup Tokyo #57
PDF
Optunaを使ったHuman-in-the-loop最適化の紹介 - 2023/04/27 W&B 東京ミートアップ #3
PDF
Kubernetes + containerd で cgroup v2 に移行したら "failed to create fsnotify watcher...
PDF
深層学習の新しい応用と、 それを支える計算機の進化 - Preferred Networks CEO 西川徹 (SEMICON Japan 2022 Ke...
PDF
Kubernetes ControllerをScale-Outさせる方法 / Kubernetes Meetup Tokyo #55
PDF
スタートアップが提案する2030年の材料開発 - 2022/11/11 QPARC講演
PPTX
Deep Learningのための専用プロセッサ「MN-Core」の開発と活用(2022/10/19東大大学院「 融合情報学特別講義Ⅲ」)
PPTX
PFNにおける研究開発(2022/10/19 東大大学院「融合情報学特別講義Ⅲ」)
PDF
自然言語処理を 役立てるのはなぜ難しいのか(2022/10/25東大大学院「自然言語処理応用」)
PDF
Kubernetes にこれから入るかもしれない注目機能!(2022年11月版) / TechFeed Experts Night #7 〜 コンテナ技術を語る
PDF
Matlantis™のニューラルネットワークポテンシャルPFPの適用範囲拡張
PDF
PFNのオンプレ計算機クラスタの取り組み_第55回情報科学若手の会
PDF
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2
PDF
Kubernetes Service Account As Multi-Cloud Identity / Cloud Native Security Co...
PDF
KubeCon + CloudNativeCon Europe 2022 Recap / Kubernetes Meetup Tokyo #51 / #k...
PDF
KubeCon + CloudNativeCon Europe 2022 Recap - Batch/HPCの潮流とScheduler拡張事例 / Kub...
PDF
独断と偏見で選んだ Kubernetes 1.24 の注目機能と今後! / Kubernetes Meetup Tokyo 50
PDF
Topology Managerについて / Kubernetes Meetup Tokyo 50
PDF
PFN Summer Internship 2021 / Kohei Shinohara: Charge Transfer Modeling in Neu...
PDF
PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜
PodSecurityPolicy からGatekeeper に移行しました / Kubernetes Meetup Tokyo #57
Optunaを使ったHuman-in-the-loop最適化の紹介 - 2023/04/27 W&B 東京ミートアップ #3
Kubernetes + containerd で cgroup v2 に移行したら "failed to create fsnotify watcher...
深層学習の新しい応用と、 それを支える計算機の進化 - Preferred Networks CEO 西川徹 (SEMICON Japan 2022 Ke...
Kubernetes ControllerをScale-Outさせる方法 / Kubernetes Meetup Tokyo #55
スタートアップが提案する2030年の材料開発 - 2022/11/11 QPARC講演
Deep Learningのための専用プロセッサ「MN-Core」の開発と活用(2022/10/19東大大学院「 融合情報学特別講義Ⅲ」)
PFNにおける研究開発(2022/10/19 東大大学院「融合情報学特別講義Ⅲ」)
自然言語処理を 役立てるのはなぜ難しいのか(2022/10/25東大大学院「自然言語処理応用」)
Kubernetes にこれから入るかもしれない注目機能!(2022年11月版) / TechFeed Experts Night #7 〜 コンテナ技術を語る
Matlantis™のニューラルネットワークポテンシャルPFPの適用範囲拡張
PFNのオンプレ計算機クラスタの取り組み_第55回情報科学若手の会
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2
Kubernetes Service Account As Multi-Cloud Identity / Cloud Native Security Co...
KubeCon + CloudNativeCon Europe 2022 Recap / Kubernetes Meetup Tokyo #51 / #k...
KubeCon + CloudNativeCon Europe 2022 Recap - Batch/HPCの潮流とScheduler拡張事例 / Kub...
独断と偏見で選んだ Kubernetes 1.24 の注目機能と今後! / Kubernetes Meetup Tokyo 50
Topology Managerについて / Kubernetes Meetup Tokyo 50
PFN Summer Internship 2021 / Kohei Shinohara: Charge Transfer Modeling in Neu...
PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜

Optuna Dashboardの紹介と設計解説 - 2022/12/10 Optuna Meetup #2