Trackio documentation

ハイパーパラメータスイープ

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

ハイパーパラメータスイープ

Trackioは意図的に、第一級のスウィープAPIを同梱していません。スウィープは単なるPythonのループです。各設定ごとに1つのランを実行し、ダッシュボードやクエリがスウィープを単一単位として扱えるようにグループ化します。これにより、スウィープは完全にあなたの管理下におかれます。あなたが書ける(またはコーディングエージェントに書かせることができる)あらゆる探索戦略が機能し、新たに学ぶべきものは何もありません。

このページでは、一般的なケース向けのレシピをまとめています。

パターン

以下のすべてのレシピは、同じ3つの要素のバリエーションです:

  • 設定ごとに1回の実行 — トライアルごとにinit()を1回呼び出します。
  • group — 1つのスウィープのすべてのトライアルがまとまるように、スウィープの識別子に設定します(ランのグループ化を参照)。
  • config — 後で結果を比較できるように、ハイパーパラメータを記録します。
import trackio

def train(config: dict, group: str, name: str) -> float:
    trackio.init(project="my_project", name=name, group=group, config=config)

    final_loss = None
    for epoch in range(10):
        final_loss = ...  # your actual training step
        trackio.log({"loss": final_loss, "epoch": epoch})

    trackio.finish()
    return final_loss

グリッドサーチ

itertools.productを使用して、探索空間の完全なデカルト積を列挙します:

import itertools

search_space = {
    "lr": [1e-2, 1e-3, 1e-4],
    "batch_size": [32, 128],
}

best = None
for values in itertools.product(*search_space.values()):
    config = dict(zip(search_space.keys(), values))
    name = "grid-" + "-".join(f"{k}={v}" for k, v in config.items())
    loss = train(config, group="grid-search", name=name)
    if best is None or loss < best[1]:
        best = (config, loss)

print(f"best config: {best[0]} (loss {best[1]:.3f})")

ランダムサーチ

列挙するのではなくサンプリングで設定を生成する — 一部のハイパーパラメータが他のものよりもはるかに重要である場合、同じ予算をより効果的に活用できる方法です。スウィープを再現可能にするために、ジェネレーターにシードを設定します:

import random

N_TRIALS = 20
rng = random.Random(42)

best = None
for trial in range(N_TRIALS):
    config = {
        "lr": 10 ** rng.uniform(-5, -1),
        "batch_size": rng.choice([16, 32, 64, 128, 256]),
    }
    loss = train(config, group="random-search", name=f"random-{trial}")
    if best is None or loss < best[1]:
        best = (config, loss)

Optunaによるベイズ最適化

より賢い探索戦略を実現するには、専用のライブラリを使用し、トラッキングはTrackioに委ねます。Optuna(pip install optuna)を使用すると、各トライアルが1つのTrackioランになります:

import optuna

def objective(trial):
    config = {
        "lr": trial.suggest_float("lr", 1e-5, 1e-1, log=True),
        "batch_size": trial.suggest_categorical("batch_size", [16, 32, 64, 128]),
    }
    return train(config, group="optuna-sweep", name=f"optuna-{trial.number}")

study = optuna.create_study(direction="minimize")
study.optimize(objective, n_trials=20)

print("best:", study.best_params, study.best_value)

スウィープ結果の表示

ダッシュボード(trackio show)では、group を共有するランがサイドバーにグループ化されるため、スウィープを単位として一括で表示/非表示を切り替えたり、同じチャート上でそのラン同士を比較したりできます。すべてのトライアルがハイパーパラメータをconfigに記録するため、スウィープはラン設定を並べて比較するのにも自然な方法です。

最適な設定のクエリ

すべてがSQLiteに格納されているため、「どの設定が勝利したのか」はクエリで確認できます。実行のグループは、設定JSON内の_Groupキーの下に保存されています。

trackio query project --project "my_project" --sql "
SELECT m.run_name,
       json_extract(m.metrics, '$.loss') AS final_loss
FROM metrics m
JOIN configs c ON c.run_name = m.run_name
WHERE json_extract(c.config, '$._Group') = 'grid-search'
  AND m.id = (SELECT MAX(id) FROM metrics WHERE run_name = m.run_name)
ORDER BY final_loss ASC
LIMIT 5"

機械可読な出力を得るには--jsonを追加します。完全なスキーマについては、ストレージスキーマと直接クエリを参照してください。

コーディングエージェントでのスウィープの実行

Sweepsは委任に最適なタスクです。ループは機械的であり、Trackioはエージェントが結果にプログラム的にアクセスできるようにします(--json付きのCLI、Python API、および直接のSQL)。プロンプトは次のようにシンプルで構いません:

lr(対数一様分布、1e-5〜1e-1)と batch_size(16〜256)に対してランダムサーチを実行し、トレーニングスクリプトを最適化します。グループ「sweep-aug30」内で、各試行ごとに1つの Trackio run を作成し、20回の試行を行った後、結果をクエリして最良の3つの設定を報告してください。

エージェントがループを書き、実行し、結果を読み戻すには十分です。アラートやモニタリングを含む完全なフィードバックループの構築方法については、エージェントによるML実験の実行を参照してください。

実行可能な例

グリッドとランダムなレシピを含む、完全で自己完結したスクリプトは、examples/sweep-recipes.py にあります。

Update on GitHub