0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【機械学習】HydraとMLflowで始めるスマートな実験管理

Last updated at Posted at 2026-01-20

はじめまして、僕はデータサイエンティストを目指している修士の学生です。Qiitaの執筆は今回が初めてで、せっかく学んだことはアウトプットとして残したいなと思い、ブログを書き始めました。

この記事では、

  • 実験管理をちゃんとやらなかった結果、何が辛かったのか
  • それをどうやって解決しようとしたのか

という実体験をベースに、
Hydra と MLflow という2つのツールを紹介します。

なぜこの記事を書いたか

僕は趣味でデータ分析をしていて、kaggleやSIGNATEのコンペにも参加しています。
ただ正直言うと、これまで「実験管理」について深く考えたことはありませんでした。

  • パラメータを変えたらとりあえずノートブックをコピー
  • 実行するたびに値を書き換える
  • 良さそうな結果が出たらメモだけ残す

そんな感じです。
でもこれを続けているとだんだん辛くなってきました。

  • どの条件でその結果が出たのか分からない
  • 前に試したはずの実験をもう一度やっている
  • 他人に「どうやって出した結果?」と聞かれて説明できない

つまり、実験を再現できない、比較できない、説明できない
という状態になっていました。これはさすがにまずいな、と思い、実験管理をちゃんとやる方法を調べて実際に使ってみることにしました。

実験管理の重要性

データサイエンスプロジェクトは、いきなり本番運用に入ることはほとんどありません。多くの場合、

  • このモデルは使えそうか?
  • この特徴量を聞いているか?
  • 精度はどれくらい出るのか?

といったことを検証する、PoC(Proof of Concept)を行います。
このPoCのフェースでは、試行錯誤を何度も繰り返すことが前提です。
だからこそ、どんな条件で/どんな実験をして/どんな結果が出たのかを安全に回せるようにするため、実験管理は必要なプロセスだと感じました。

実験管理ツール

Pythonには、実験管理を助けてくれるツールがいくつもあります。
今回はその中でも代表的な2つを紹介します。

Hydra:実験設定と実行結果を整理して残す
MLflow:実験結果を可視化・比較する

この2つは役割が少し違っていて、一緒に使うとかなり便利です。


Hydra

Hydraは、設定管理を中心としたオープンソースライブラリです。
主に次のようなことができます。

  • YAMLによる構造化したパラメータ管理
  • 実行ごとに設定と結果を自動保存
  • コマンドラインからのパラメータ上書き
  • 実験条件の切り替えを簡単にする

この記事では、「実験管理に最低限必要な使い方」 に絞って紹介します。


Hydraのインストール

pip install hydra-core

Hydraの基本機能

Hydraでは、実験に関する設定をYAMLファイルとして管理します。
YAMLを使う最大のメリットは、
「コードを触らずに実験条件を切り替えられること」です。

モデルを変えるたびにif文を書いたり、ハイパーパラメータをコード内で書き換える必要がなくなります。


設定ファイルの例

例えば、以下のような構成で設定を管理します

conf/
├─ model/
│  ├─ LightGBM.yaml
│  └─ Linear.yaml
├─ dataset/
│  ├─ train.yaml
│  └─ test.yaml

conf/model/LightGBM.yamlの例です。

objective: multiclass
metric: multi_logloss
boosting_type: gbdt

train:
  num_boost_round: 100
  early_stopping_rounds: 10

スクリプト側のコード

Hydraでは、実行する関数を @hydra.main で修飾します。

import hydra
from omegaconf import DictConfig

@hydra.main(config_path="../conf", config_name="config", version_base=None)
def main(cfg: DictConfig):
    print(cfg.model)
    print(cfg.dataset)

if __name__ == "__main__":
    main()

cfgDictConfigという型で、YAMLと同じ階層構造を持った辞書のようなオブジェクトです。

cfg.model.train.num_boost_round

のように、.で階層的にアクセスできます。


実行してみる

python scripts/train.py

実行すると、Hydraは自動的に実行結果用のディレクトリを作成します。

outputs/2026-01-01/00-00-00/
├─ .hydra/
│  ├─ config.yaml
│  └─ overrides.yaml
└─ result.json

Hydraのここが便利

① 実行ごとにフォルダが分かれる
Hydraは、実行するたびに新しいフォルダを作ってくれます。
つまり、どの実験が、どの設定で、どんな結果だったかが自然に整理されます。


.hydra/config.yamlが最強
.hydra/config.yamlには、その実験で使われたすべての設定が保存されます。

  • 半年前の実験
  • もう内容を忘れた実験
  • 他人が回した実験
    でも、このファイルを見れば完全に再現可能です。
    未来の自分を一番助けてくれるファイルだと思っています。

Hydraは実行ごとにフォルダを作ってくれます。そのため、その実験の設定ごとに分かれているので管理がしやすくなります。

outputs/2026-01-01/00-00-00/
├─ .hydra/config.yaml #その実験の完全な設定
└─ result.json

③ コマンドラインからの上書き

python scripts/train.py model=LightGBM model.train.num_boost_round=200

このようにすると、元のYAMLを書き換えずに実験条件だけを変更できます。
上書きした内容は overrides.yaml に記録されます。

- model=LightGBM
- model.train.num_boost_round=200

コードは一切変更していないのに、違う実験をしたという事実がちゃんと残ることが、良いポイントです。


MLflow

Hydraは「実験を整理して残す」ことに強いですが、実験結果を横並びで比較するのはあまり得意ではありません。
そこで活躍するのが MLflow です。

MLflowを使うと、

  • accuracy や loss を一覧で確認できる
  • 条件の違う実験を横並びで比較できる
  • Web UI 上で結果を確認できる

といったことが簡単にできます。


MLflowのインストール

pip install mlflow

MLflowの基本機能

MLflowでは、一連の実験を「Experiment」、その中の一つひとつの実行を「Run」という単位で管理します。
主に log_param(設定の記録)と log_metric(結果の数値の記録)を使います。

import mlflow

# 実験の名前を設定
mlflow.set_experiment("my_experiment")

with mlflow.start_run():
    # パラメータを記録
    mlflow.log_param("model_type", "LightGBM")
    
    # 精度などの結果を記録
    mlflow.log_metric("accuracy", 0.95)
    
    # 学習済みモデルなどのファイルも保存できる
    # mlflow.log_artifact("model.pkl")


実験結果を可視化する (MLflow UI)

記録した結果を確認するには、ターミナルで以下のコマンドを叩きます。

mlflow ui

ブラウザで http://localhost:5000 にアクセスすると、これまで試行錯誤してきた履歴がリストになって表示されます。

MLflowのここが便利:

  • 横並び比較: 複数の実験を選んで「Compare」を押すと、どのパラメータを変えた時に精度が上がったのか一目でわかります。
  • グラフ化: 数値を記録しておけば、学習の進み具合などを自動でグラフにしてくれます。

Hydra × MLflow の合わせ技

この2つを組み合わせると、実験管理がさらに盤石になります。
おすすめは、「Hydraの設定(cfg)をそのままMLflowのパラメータとして記録する」方法です。

@hydra.main(config_path="../conf", config_name="config")
def main(cfg: DictConfig):
    with mlflow.start_run():
        # Hydraの設定を丸ごとMLflowに記録
        # これで「どんな設定で回したか」がMLflow上で100%紐付く
        mlflow.log_params(cfg.model)
        
        # --- 学習処理 ---
        # accuracy = train(cfg)
        
        mlflow.log_metric("accuracy", accuracy)

if __name__ == "__main__":
    main()

こうすることで、

  • Hydra で実験ごとのフォルダを厳密に管理
  • MLflow でその結果を楽に比較・可視化
    という、いいとこ取りができます。

おわりに

実験管理は最初は少し手間がかかりますが、一度仕組みを作ってしまえば、安心して試行錯誤に集中できるようになります。
「あの実験、どうやったっけ?」という不安がなくなるのは、精神衛生的にもとても良いです。

僕もまだまだ勉強中ですが、同じように「実験管理が辛い」と感じている方の参考になれば嬉しいです。
ぜひ、僕と一緒に活用していきましょう!

参考文献

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?