Trackio documentation
ハイパーパラメータスイープ
ハイパーパラメータスイープ
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 にあります。