SlideShare a Scribd company logo
Hydra + MLFlow + Optuna
base on pytorch-lightning
モデル開発の効率化のポイント
• 訓練データの管理
• 元データから訓練データの生成とその特徴の把握を容易
にする
• ハイパーパラメータ探索効率化
• モデルやデータごとに異なるパラメータ群の管理
• 探索手法の導入
• モデル構築のテンプレート化
• モデル実装時間を短くする
• 既存モデルを使いまわせるようにする
• 学習結果の保存・可視化
• 学習結果とハイパーパラメタ、モデルを結び付けられる
• 結果や学習過程の可視化によって把握を容易にする
PyTorchLightning, Hydra, MLFlow, Optunaの導入
特徴分析
訓練データ生成
訓練・評価データ
パラメータ探索
データ
パラメータ
学習済モデル
モデル
訓練
重みデータ 訓練過程データ 訓練結果
モデル実装
テンプレート
パラメータ管理
モデル保存
保存・可視化
保存・可視化
比較
訓練データ管理
モデル観測
(再学習)
MLFlow
Hydra
Optuna
pytorch-lightning
trial.suggest_hoge()
Model_A_PS
プログラムフォルダ構成
dataset.py
RootDir
config datasrc mlruns
model utils
Model A
modules.py
Model_A
model
module
forward()
training_step()
validation_step()
test_step()
configure_optimizer()
module
module
model
config.yaml
defaults
- model: default
- data: default
- trainer: default
- callbacks: default
data
trainer
callbacks
default.yaml
config.py
dataset.py
Dataset
DataModule
sample_data
train
val
test
other_data
Model B
module
model.py
opruns
study.optimize()
AD_PS.py
Trainer()
callbacks
AD.py
model
model
サンプルコードを以下に公開
https://github.com/k4noinfo/PytorchLightning_Hydra_MLFlow_Optuna.git
pytorch-lightning
概要
• pytorch 用フレームワーク
• tensorflow における Keras のようなもの
• 主な構成
• pl.LightningModule: ネットワーク構成とloss計算等のモ
ジュール
• pl.DataModule: dataloaderを準備するモジュール
• pl.Trainer: model と データ、callback 処理を管理・実行
• callbacks
• Logger: csv, tensorboard, mlflow などロガー処理
• ModelCheckpoint: モデル保存処理
• EarlyStopping: 早期終了処理
• ProgressBar: 実行状況表示
構成
Model(pl.LightningModule
)
moduleA(torch.nn.Module
)
network
forward()
network
net = moduleA()
main
def __init__():
model = Model()
check = ModelCheckpoint()
logger = Logger()
stopping = EarlyStopping()
trainer =
Trainer(model,
logger,
callbacks=[check, stopping])
def train(dataloader, datamodule):
trainer.fit(model, datamodule)
def train_from(dataloader, datamodule):
trainer =
Trainer(resume_frome_ckpt=ckpt,...)
trainer.fit(model, datamodule)
def test(dataloader, datamodule):
def get_anomaly_detection(dl, dm):
def forward(x):
y = net(x)
def training_step(batch):
x,_ = batch
x_hat = self(x)
loss = F.loss(x_hat,x)
self.log(‘loss’,loss)
return loss
def validation_step(batch):
x, _ = batch
x_hat = self(x)
loss = F.loss(x_hat, x)
self.log(‘val_loss, loss)
def test_step(batch):
def configure_optimizer():
return torch.optim.Adam()
logger に保存
logger に保存
moduleB(torch.nn.Module
)
network
forward()
MLFlow などの学習経過保存Callback
モデル保存Callback
早期終了Callback
def {train|val|test}_step :
batch 単位の処理を記述。
def {train|val|test}_epoch_end:
epoch 終了後にHookされる関数
multi GPU を想定しているぽい
訓練後の処理は、いろいろ考える
とtest_step 関数内で処理しておく
のが pytorch-lightning のメリットも
利用できてよさそう
メモ
• 訓練後の処理をGPUの有無とか考えないでも行う
のであれば、test_step 関数の中で行うのがよさそ
う
• ModelCheckpoint callback で任意のfolderに保存する
には、dir_path などで指定するのがよさそう。
• Trainer.test を実行するとき resume_from_ckpt を使
用して resume したあとだと、なぜか resume して
から実行しようとするため、resume 後に fit を実行
すると best ではない、model で test を実行してし
まうか、ckpt ファイルがないとエラーが出るので
注意
Hydra
pytorch-lightning と Hydra が統合するかもしれないだと...
概要
• フォルダ+yamlファイルで管理
• パラメータの上書きは、コマンドラインのオプション
だけでなく、jupyter などからも可能
• メリット
• フォルダ+yamlファイルで階層的に管理
• model.train.batch_size という定義が可能
• configからインスタンス作成も可能
• 他の設定を参照定義できる
• デメリット
• list や dic 形式は Omegalist や Omegadict という独自形式
• インスタンスは sys.path が通っているところから宣言が必要
• 上書きする際には参照関係を認識する必要がある
model
data
autoencoder.yaml
vea.yaml
eeg.yaml
階層的管理イメージ
実装メモ
• initialize は複数回行うとエラーが起きるため、
GlobalHydra.instance() をクリアする必要がある
from hydra.core.global_hydra import GlobalHydra
GlobalHydra.instance().clear()
• 基本yaml形式での定義なので、ファイル内での階層化は可能
• ただし、統合するときに各ファイルの先頭に # @package _global_ が必要。
そうしないとサブグループとして読み込まれる
• list や dict データを取得には以下の変換が必要
OmegaConf.to_container(cfg.hoge)
• 要素hogeがlistかどうかのチェック
OmegaConf.is_list(cfg.hoge)
• 要素を直接呼び出した場合には、参照は補完されるが、上位要素
からだと補完されないため以下の処理が必要
OmegaConf.to_container(cfg, resolve=True)
• study.optimize の n_jobs を実行する際には MLFlowLogger などで注
意が必要. sqlite3 への保存だけにしたらいいのかな?
MLFlow
概要
• mlflow をインストール
• プログラム中に以下を加える
• pl.logger.MLFlowLogger を作成
• pl.Trainer に logger として渡す。
• あとは、プログラム中の pl.LightningModule.log 関数を実行した
metric が保存される
• model を保存する場合
• callback クラスの ModelCheckpoint の dir_path に logger のフォルダを
わたす。フォルダは logger のインスタンスが生成されていれば、
logger.save_dir, logger.experience_id, logger.run_id などで構成可能
• MLFlowLogger に autolog() があるが、これだと、モデルが最後
に訓練された状態でしか保存されない様子
• 保存データの確認方法
• プロジェクトフォルダに移動 (defaultの保存先: ./mlruns)
% mflow ui --backend-store-uri <logger.save_dir>
その他の実験結果管理ツール
• tensorflowboard
• WandB
• ネットワークの重みの状態の可視化も行えるようす
• 実験終了後にメールを送る機能もあるらしい
• Comet.ml
• 実験コード(jupyter notebookも)保存可能
Optuna
trial.suggest_hoge()
Model_A_PS
study.optimize()
AD_PS.py
プログラムフォルダ構成
dataset.py
RootDir
config datasrc mlruns
model utils
Model A
modules.py
Model_A
model
module
forward()
training_step()
validation_step()
test_step()
configure_optimizer()
module
module
model
config.yaml
defaults
- model: default
- data: default
- trainer: default
- callbacks: default
data
trainer
callbacks
default.yaml
config.py
dataset.py
Dataset
DataModule
sample_data
train
val
test
other_data
Model B
Trainer()
callbacks
AD.py
module
model.py
opruns
def __init__(self, config, trial):
config.hoge = trial.suggest_int(‘hoge’,1,10)
config.optimizer.lr = trial.suggest_float(‘optimizer.lr’,0.01,0.1,log=True)
super(main.__class__, self).__init__(config)
検討したいパラメータはモデルごとに異なるため元モデルクラスを継承
def __init__(self, config, trial):
pruner = optuna.pruners.MedianPruner()
self.study = optuna.create_study(pruner, ...)
def do_optimize(self):
self.study.optimize(self.objective, ...)
def objective(self, trial):
model = Model()
metrics = MetricCallbacks()
trainer = Trainer(..., callbacks=[metrics, ...])
trainer.fit(model, data)
探索用関数が必要なため、別クラスとして実装
model
model
Sqlite3 形式で経過を保存可能
MLFlow を使わないほうがよさげ
概要
• 定義
• optuna.study で探索手法、データ保存
• optuna.study.optimize で探索を実行
• データ保存は sqlite3 を利用
• optuna.Trial.suggest_hoge で探索空間を定義
• optuna-dashboard をインストールすることで、
保存したDBから経過を確認可能。
• ただ、リアルタイムに更新してくれず、optuna-
dashboard を再起動しないとグラフが更新されない
のはなぜ?
実装上の注意
• Sqlite3 をインストールしてなくても保存できて
いるように見えるが、実際にはインストール後
しかデータが確認できなかった。フォルダの場
所の自由度は少なそう...
• optuna.logging.get_logger("optuna").addHandler(logging.StreamHandler(sys.stdout))
• create_study(pruner, storage=‘sqlite:///<フォルダ名>/hoge.db) ※ パラメータは config に記述
• optuna の保存フォルダを指定した場合に、
フォルダを自動作成してくれないので、自分で
準備すること
• 現時点(2021/01)では、optuna-dashboard よりは、
visualize 以下の関数で表示した内容のほうがわ
かりやすそう

More Related Content

What's hot

最適輸送の計算アルゴリズムの研究動向
最適輸送の計算アルゴリズムの研究動向最適輸送の計算アルゴリズムの研究動向
最適輸送の計算アルゴリズムの研究動向
ohken
 
最適化超入門
最適化超入門最適化超入門
最適化超入門
Takami Sato
 
最適輸送の解き方
最適輸送の解き方最適輸送の解き方
最適輸送の解き方
joisino
 
BERT入門
BERT入門BERT入門
BERT入門
Ken'ichi Matsui
 
勾配ブースティングの基礎と最新の動向 (MIRU2020 Tutorial)
勾配ブースティングの基礎と最新の動向 (MIRU2020 Tutorial)勾配ブースティングの基礎と最新の動向 (MIRU2020 Tutorial)
勾配ブースティングの基礎と最新の動向 (MIRU2020 Tutorial)
RyuichiKanoh
 
機械学習のためのベイズ最適化入門
機械学習のためのベイズ最適化入門機械学習のためのベイズ最適化入門
機械学習のためのベイズ最適化入門
hoxo_m
 
Transformerを多層にする際の勾配消失問題と解決法について
Transformerを多層にする際の勾配消失問題と解決法についてTransformerを多層にする際の勾配消失問題と解決法について
Transformerを多層にする際の勾配消失問題と解決法について
Sho Takase
 
SSII2022 [SS2] 少ないデータやラベルを効率的に活用する機械学習技術 〜 足りない情報をどのように補うか?〜
SSII2022 [SS2] 少ないデータやラベルを効率的に活用する機械学習技術 〜 足りない情報をどのように補うか?〜SSII2022 [SS2] 少ないデータやラベルを効率的に活用する機械学習技術 〜 足りない情報をどのように補うか?〜
SSII2022 [SS2] 少ないデータやラベルを効率的に活用する機械学習技術 〜 足りない情報をどのように補うか?〜
SSII
 
[DL輪読会]BERT: Pre-training of Deep Bidirectional Transformers for Language Und...
[DL輪読会]BERT: Pre-training of Deep Bidirectional Transformers for Language Und...[DL輪読会]BERT: Pre-training of Deep Bidirectional Transformers for Language Und...
[DL輪読会]BERT: Pre-training of Deep Bidirectional Transformers for Language Und...
Deep Learning JP
 
[DL輪読会]画像を使ったSim2Realの現況
[DL輪読会]画像を使ったSim2Realの現況[DL輪読会]画像を使ったSim2Realの現況
[DL輪読会]画像を使ったSim2Realの現況
Deep Learning JP
 
機械学習モデルの判断根拠の説明(Ver.2)
機械学習モデルの判断根拠の説明(Ver.2)機械学習モデルの判断根拠の説明(Ver.2)
機械学習モデルの判断根拠の説明(Ver.2)
Satoshi Hara
 
[DL輪読会]ICLR2020の分布外検知速報
[DL輪読会]ICLR2020の分布外検知速報[DL輪読会]ICLR2020の分布外検知速報
[DL輪読会]ICLR2020の分布外検知速報
Deep Learning JP
 
【DL輪読会】時系列予測 Transfomers の精度向上手法
【DL輪読会】時系列予測 Transfomers の精度向上手法【DL輪読会】時系列予測 Transfomers の精度向上手法
【DL輪読会】時系列予測 Transfomers の精度向上手法
Deep Learning JP
 
Optimizer入門&最新動向
Optimizer入門&最新動向Optimizer入門&最新動向
Optimizer入門&最新動向
Motokawa Tetsuya
 
【DL輪読会】ViT + Self Supervised Learningまとめ
【DL輪読会】ViT + Self Supervised Learningまとめ【DL輪読会】ViT + Self Supervised Learningまとめ
【DL輪読会】ViT + Self Supervised Learningまとめ
Deep Learning JP
 
Lucas kanade法について
Lucas kanade法についてLucas kanade法について
Lucas kanade法について
Hitoshi Nishimura
 
ドメイン適応の原理と応用
ドメイン適応の原理と応用ドメイン適応の原理と応用
ドメイン適応の原理と応用
Yoshitaka Ushiku
 
【メタサーベイ】数式ドリブン教師あり学習
【メタサーベイ】数式ドリブン教師あり学習【メタサーベイ】数式ドリブン教師あり学習
【メタサーベイ】数式ドリブン教師あり学習
cvpaper. challenge
 
Active Learning 入門
Active Learning 入門Active Learning 入門
Active Learning 入門Shuyo Nakatani
 
[DL輪読会]ドメイン転移と不変表現に関するサーベイ
[DL輪読会]ドメイン転移と不変表現に関するサーベイ[DL輪読会]ドメイン転移と不変表現に関するサーベイ
[DL輪読会]ドメイン転移と不変表現に関するサーベイ
Deep Learning JP
 

What's hot (20)

最適輸送の計算アルゴリズムの研究動向
最適輸送の計算アルゴリズムの研究動向最適輸送の計算アルゴリズムの研究動向
最適輸送の計算アルゴリズムの研究動向
 
最適化超入門
最適化超入門最適化超入門
最適化超入門
 
最適輸送の解き方
最適輸送の解き方最適輸送の解き方
最適輸送の解き方
 
BERT入門
BERT入門BERT入門
BERT入門
 
勾配ブースティングの基礎と最新の動向 (MIRU2020 Tutorial)
勾配ブースティングの基礎と最新の動向 (MIRU2020 Tutorial)勾配ブースティングの基礎と最新の動向 (MIRU2020 Tutorial)
勾配ブースティングの基礎と最新の動向 (MIRU2020 Tutorial)
 
機械学習のためのベイズ最適化入門
機械学習のためのベイズ最適化入門機械学習のためのベイズ最適化入門
機械学習のためのベイズ最適化入門
 
Transformerを多層にする際の勾配消失問題と解決法について
Transformerを多層にする際の勾配消失問題と解決法についてTransformerを多層にする際の勾配消失問題と解決法について
Transformerを多層にする際の勾配消失問題と解決法について
 
SSII2022 [SS2] 少ないデータやラベルを効率的に活用する機械学習技術 〜 足りない情報をどのように補うか?〜
SSII2022 [SS2] 少ないデータやラベルを効率的に活用する機械学習技術 〜 足りない情報をどのように補うか?〜SSII2022 [SS2] 少ないデータやラベルを効率的に活用する機械学習技術 〜 足りない情報をどのように補うか?〜
SSII2022 [SS2] 少ないデータやラベルを効率的に活用する機械学習技術 〜 足りない情報をどのように補うか?〜
 
[DL輪読会]BERT: Pre-training of Deep Bidirectional Transformers for Language Und...
[DL輪読会]BERT: Pre-training of Deep Bidirectional Transformers for Language Und...[DL輪読会]BERT: Pre-training of Deep Bidirectional Transformers for Language Und...
[DL輪読会]BERT: Pre-training of Deep Bidirectional Transformers for Language Und...
 
[DL輪読会]画像を使ったSim2Realの現況
[DL輪読会]画像を使ったSim2Realの現況[DL輪読会]画像を使ったSim2Realの現況
[DL輪読会]画像を使ったSim2Realの現況
 
機械学習モデルの判断根拠の説明(Ver.2)
機械学習モデルの判断根拠の説明(Ver.2)機械学習モデルの判断根拠の説明(Ver.2)
機械学習モデルの判断根拠の説明(Ver.2)
 
[DL輪読会]ICLR2020の分布外検知速報
[DL輪読会]ICLR2020の分布外検知速報[DL輪読会]ICLR2020の分布外検知速報
[DL輪読会]ICLR2020の分布外検知速報
 
【DL輪読会】時系列予測 Transfomers の精度向上手法
【DL輪読会】時系列予測 Transfomers の精度向上手法【DL輪読会】時系列予測 Transfomers の精度向上手法
【DL輪読会】時系列予測 Transfomers の精度向上手法
 
Optimizer入門&最新動向
Optimizer入門&最新動向Optimizer入門&最新動向
Optimizer入門&最新動向
 
【DL輪読会】ViT + Self Supervised Learningまとめ
【DL輪読会】ViT + Self Supervised Learningまとめ【DL輪読会】ViT + Self Supervised Learningまとめ
【DL輪読会】ViT + Self Supervised Learningまとめ
 
Lucas kanade法について
Lucas kanade法についてLucas kanade法について
Lucas kanade法について
 
ドメイン適応の原理と応用
ドメイン適応の原理と応用ドメイン適応の原理と応用
ドメイン適応の原理と応用
 
【メタサーベイ】数式ドリブン教師あり学習
【メタサーベイ】数式ドリブン教師あり学習【メタサーベイ】数式ドリブン教師あり学習
【メタサーベイ】数式ドリブン教師あり学習
 
Active Learning 入門
Active Learning 入門Active Learning 入門
Active Learning 入門
 
[DL輪読会]ドメイン転移と不変表現に関するサーベイ
[DL輪読会]ドメイン転移と不変表現に関するサーベイ[DL輪読会]ドメイン転移と不変表現に関するサーベイ
[DL輪読会]ドメイン転移と不変表現に関するサーベイ
 

More from Kosuke Shinoda

エゴセントリックネットワークを用いた同義語・類義語の判別の検討
エゴセントリックネットワークを用いた同義語・類義語の判別の検討エゴセントリックネットワークを用いた同義語・類義語の判別の検討
エゴセントリックネットワークを用いた同義語・類義語の判別の検討
Kosuke Shinoda
 
人狼知能セミナー資料案20170624
人狼知能セミナー資料案20170624人狼知能セミナー資料案20170624
人狼知能セミナー資料案20170624
Kosuke Shinoda
 
社会と人工知能特集「仮想化する社会」
社会と人工知能特集「仮想化する社会」社会と人工知能特集「仮想化する社会」
社会と人工知能特集「仮想化する社会」
Kosuke Shinoda
 
「人狼知能」没原稿 社会的知能を目指して
「人狼知能」没原稿 社会的知能を目指して「人狼知能」没原稿 社会的知能を目指して
「人狼知能」没原稿 社会的知能を目指して
Kosuke Shinoda
 
大規模ネットワーク分析 篠田
大規模ネットワーク分析 篠田大規模ネットワーク分析 篠田
大規模ネットワーク分析 篠田
Kosuke Shinoda
 
人狼知能プログラミング演習資料2015
人狼知能プログラミング演習資料2015人狼知能プログラミング演習資料2015
人狼知能プログラミング演習資料2015
Kosuke Shinoda
 

More from Kosuke Shinoda (6)

エゴセントリックネットワークを用いた同義語・類義語の判別の検討
エゴセントリックネットワークを用いた同義語・類義語の判別の検討エゴセントリックネットワークを用いた同義語・類義語の判別の検討
エゴセントリックネットワークを用いた同義語・類義語の判別の検討
 
人狼知能セミナー資料案20170624
人狼知能セミナー資料案20170624人狼知能セミナー資料案20170624
人狼知能セミナー資料案20170624
 
社会と人工知能特集「仮想化する社会」
社会と人工知能特集「仮想化する社会」社会と人工知能特集「仮想化する社会」
社会と人工知能特集「仮想化する社会」
 
「人狼知能」没原稿 社会的知能を目指して
「人狼知能」没原稿 社会的知能を目指して「人狼知能」没原稿 社会的知能を目指して
「人狼知能」没原稿 社会的知能を目指して
 
大規模ネットワーク分析 篠田
大規模ネットワーク分析 篠田大規模ネットワーク分析 篠田
大規模ネットワーク分析 篠田
 
人狼知能プログラミング演習資料2015
人狼知能プログラミング演習資料2015人狼知能プログラミング演習資料2015
人狼知能プログラミング演習資料2015
 

PyTorchLightning ベース Hydra+MLFlow+Optuna による機械学習開発環境の構築

  • 1. Hydra + MLFlow + Optuna base on pytorch-lightning
  • 2. モデル開発の効率化のポイント • 訓練データの管理 • 元データから訓練データの生成とその特徴の把握を容易 にする • ハイパーパラメータ探索効率化 • モデルやデータごとに異なるパラメータ群の管理 • 探索手法の導入 • モデル構築のテンプレート化 • モデル実装時間を短くする • 既存モデルを使いまわせるようにする • 学習結果の保存・可視化 • 学習結果とハイパーパラメタ、モデルを結び付けられる • 結果や学習過程の可視化によって把握を容易にする
  • 3. PyTorchLightning, Hydra, MLFlow, Optunaの導入 特徴分析 訓練データ生成 訓練・評価データ パラメータ探索 データ パラメータ 学習済モデル モデル 訓練 重みデータ 訓練過程データ 訓練結果 モデル実装 テンプレート パラメータ管理 モデル保存 保存・可視化 保存・可視化 比較 訓練データ管理 モデル観測 (再学習) MLFlow Hydra Optuna pytorch-lightning
  • 4. trial.suggest_hoge() Model_A_PS プログラムフォルダ構成 dataset.py RootDir config datasrc mlruns model utils Model A modules.py Model_A model module forward() training_step() validation_step() test_step() configure_optimizer() module module model config.yaml defaults - model: default - data: default - trainer: default - callbacks: default data trainer callbacks default.yaml config.py dataset.py Dataset DataModule sample_data train val test other_data Model B module model.py opruns study.optimize() AD_PS.py Trainer() callbacks AD.py model model
  • 7. 概要 • pytorch 用フレームワーク • tensorflow における Keras のようなもの • 主な構成 • pl.LightningModule: ネットワーク構成とloss計算等のモ ジュール • pl.DataModule: dataloaderを準備するモジュール • pl.Trainer: model と データ、callback 処理を管理・実行 • callbacks • Logger: csv, tensorboard, mlflow などロガー処理 • ModelCheckpoint: モデル保存処理 • EarlyStopping: 早期終了処理 • ProgressBar: 実行状況表示
  • 8. 構成 Model(pl.LightningModule ) moduleA(torch.nn.Module ) network forward() network net = moduleA() main def __init__(): model = Model() check = ModelCheckpoint() logger = Logger() stopping = EarlyStopping() trainer = Trainer(model, logger, callbacks=[check, stopping]) def train(dataloader, datamodule): trainer.fit(model, datamodule) def train_from(dataloader, datamodule): trainer = Trainer(resume_frome_ckpt=ckpt,...) trainer.fit(model, datamodule) def test(dataloader, datamodule): def get_anomaly_detection(dl, dm): def forward(x): y = net(x) def training_step(batch): x,_ = batch x_hat = self(x) loss = F.loss(x_hat,x) self.log(‘loss’,loss) return loss def validation_step(batch): x, _ = batch x_hat = self(x) loss = F.loss(x_hat, x) self.log(‘val_loss, loss) def test_step(batch): def configure_optimizer(): return torch.optim.Adam() logger に保存 logger に保存 moduleB(torch.nn.Module ) network forward() MLFlow などの学習経過保存Callback モデル保存Callback 早期終了Callback def {train|val|test}_step : batch 単位の処理を記述。 def {train|val|test}_epoch_end: epoch 終了後にHookされる関数 multi GPU を想定しているぽい 訓練後の処理は、いろいろ考える とtest_step 関数内で処理しておく のが pytorch-lightning のメリットも 利用できてよさそう
  • 9. メモ • 訓練後の処理をGPUの有無とか考えないでも行う のであれば、test_step 関数の中で行うのがよさそ う • ModelCheckpoint callback で任意のfolderに保存する には、dir_path などで指定するのがよさそう。 • Trainer.test を実行するとき resume_from_ckpt を使 用して resume したあとだと、なぜか resume して から実行しようとするため、resume 後に fit を実行 すると best ではない、model で test を実行してし まうか、ckpt ファイルがないとエラーが出るので 注意
  • 10. Hydra pytorch-lightning と Hydra が統合するかもしれないだと...
  • 11. 概要 • フォルダ+yamlファイルで管理 • パラメータの上書きは、コマンドラインのオプション だけでなく、jupyter などからも可能 • メリット • フォルダ+yamlファイルで階層的に管理 • model.train.batch_size という定義が可能 • configからインスタンス作成も可能 • 他の設定を参照定義できる • デメリット • list や dic 形式は Omegalist や Omegadict という独自形式 • インスタンスは sys.path が通っているところから宣言が必要 • 上書きする際には参照関係を認識する必要がある model data autoencoder.yaml vea.yaml eeg.yaml 階層的管理イメージ
  • 12. 実装メモ • initialize は複数回行うとエラーが起きるため、 GlobalHydra.instance() をクリアする必要がある from hydra.core.global_hydra import GlobalHydra GlobalHydra.instance().clear() • 基本yaml形式での定義なので、ファイル内での階層化は可能 • ただし、統合するときに各ファイルの先頭に # @package _global_ が必要。 そうしないとサブグループとして読み込まれる • list や dict データを取得には以下の変換が必要 OmegaConf.to_container(cfg.hoge) • 要素hogeがlistかどうかのチェック OmegaConf.is_list(cfg.hoge) • 要素を直接呼び出した場合には、参照は補完されるが、上位要素 からだと補完されないため以下の処理が必要 OmegaConf.to_container(cfg, resolve=True) • study.optimize の n_jobs を実行する際には MLFlowLogger などで注 意が必要. sqlite3 への保存だけにしたらいいのかな?
  • 14. 概要 • mlflow をインストール • プログラム中に以下を加える • pl.logger.MLFlowLogger を作成 • pl.Trainer に logger として渡す。 • あとは、プログラム中の pl.LightningModule.log 関数を実行した metric が保存される • model を保存する場合 • callback クラスの ModelCheckpoint の dir_path に logger のフォルダを わたす。フォルダは logger のインスタンスが生成されていれば、 logger.save_dir, logger.experience_id, logger.run_id などで構成可能 • MLFlowLogger に autolog() があるが、これだと、モデルが最後 に訓練された状態でしか保存されない様子 • 保存データの確認方法 • プロジェクトフォルダに移動 (defaultの保存先: ./mlruns) % mflow ui --backend-store-uri <logger.save_dir>
  • 15. その他の実験結果管理ツール • tensorflowboard • WandB • ネットワークの重みの状態の可視化も行えるようす • 実験終了後にメールを送る機能もあるらしい • Comet.ml • 実験コード(jupyter notebookも)保存可能
  • 17. trial.suggest_hoge() Model_A_PS study.optimize() AD_PS.py プログラムフォルダ構成 dataset.py RootDir config datasrc mlruns model utils Model A modules.py Model_A model module forward() training_step() validation_step() test_step() configure_optimizer() module module model config.yaml defaults - model: default - data: default - trainer: default - callbacks: default data trainer callbacks default.yaml config.py dataset.py Dataset DataModule sample_data train val test other_data Model B Trainer() callbacks AD.py module model.py opruns def __init__(self, config, trial): config.hoge = trial.suggest_int(‘hoge’,1,10) config.optimizer.lr = trial.suggest_float(‘optimizer.lr’,0.01,0.1,log=True) super(main.__class__, self).__init__(config) 検討したいパラメータはモデルごとに異なるため元モデルクラスを継承 def __init__(self, config, trial): pruner = optuna.pruners.MedianPruner() self.study = optuna.create_study(pruner, ...) def do_optimize(self): self.study.optimize(self.objective, ...) def objective(self, trial): model = Model() metrics = MetricCallbacks() trainer = Trainer(..., callbacks=[metrics, ...]) trainer.fit(model, data) 探索用関数が必要なため、別クラスとして実装 model model Sqlite3 形式で経過を保存可能 MLFlow を使わないほうがよさげ
  • 18. 概要 • 定義 • optuna.study で探索手法、データ保存 • optuna.study.optimize で探索を実行 • データ保存は sqlite3 を利用 • optuna.Trial.suggest_hoge で探索空間を定義 • optuna-dashboard をインストールすることで、 保存したDBから経過を確認可能。 • ただ、リアルタイムに更新してくれず、optuna- dashboard を再起動しないとグラフが更新されない のはなぜ?
  • 19. 実装上の注意 • Sqlite3 をインストールしてなくても保存できて いるように見えるが、実際にはインストール後 しかデータが確認できなかった。フォルダの場 所の自由度は少なそう... • optuna.logging.get_logger("optuna").addHandler(logging.StreamHandler(sys.stdout)) • create_study(pruner, storage=‘sqlite:///<フォルダ名>/hoge.db) ※ パラメータは config に記述 • optuna の保存フォルダを指定した場合に、 フォルダを自動作成してくれないので、自分で 準備すること • 現時点(2021/01)では、optuna-dashboard よりは、 visualize 以下の関数で表示した内容のほうがわ かりやすそう