実験ロガー
学習可能なすべてのファミリーは4つの学習イベントを発行します。組み込みロガーは同じイベントを監視するコールバックオブジェクトなので、バックエンド統合とカスタムフックは1つのインターフェースを使います。
ロガーを有効化
loggers=は、登録名、設定済みインスタンス、または両者を混在させた反復可能オブジェクトを
受け取ります。
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLO9s.pt")model.train(data="coco8.yaml", epochs=10, loggers="tensorboard")from libreyolo import LibreYOLOfrom libreyolo.training import MLflowLogger model = LibreYOLO("LibreYOLO9s.pt")model.train( data="coco8.yaml", epochs=10, loggers=[MLflowLogger(tracking_uri="sqlite:///mlflow.db"), "tensorboard"],)名前は大文字と小文字を区別しません。登録済みの集合はtensorboard、mlflow、wandb、
comet、clearml、neptune、dvclive、dvcで、最後のものはdvcliveの別名です。
それ以外は直ちに例外を発生させ、有効な名前を一覧表示します。すべてを有効にする値はなく、
CLIフラグもありません。loggers=はPython引数です。
すべてのバックエンドが記録するもの
どれを選んでもダッシュボードが同じ形式になるよう、すべてが同じ指標名を書き出します。
| キー | 値 |
|---|---|
train/loss | エポックの平均学習損失 |
train/loss/<component> | ファミリーが報告する各損失成分 |
lr/<group> | optimizerの各パラメータグループの学習率 |
val/<metric> | metrics/プレフィックスを除去した各検証指標 |
time/epoch_seconds | エポックの実時間 |
ステップは1から始まるエポックです。完全に解決された学習設定が学習開始時にパラメータとして
記録され、実行名のデフォルトは<family><size>-<task>です。たとえばyolo9s-detectです。
学習終了時、成果物に対応するバックエンドは、存在する場合にresults.csv、train_config.yaml、
summary.jsonをアップロードし、log_checkpoints=Trueならweights/best.ptもアップロードします。
TensorBoardには成果物という概念がないため、何もアップロードしません。検証プロット画像を
アップロードするロガーはありません。
失敗時の動作
バックエンドパッケージがない場合、構築時にインストールコマンドを示して例外を発生させます。 ロガーを要求したのに何も得られない状態を通知なく許すと、不具合が隠れるためです。
実行中にバックエンドが失敗した場合は逆の動作になります。ハンドラーで最初の例外が発生すると、 残りの実行ではそのロガーを無効にし、例外をログに記録し、バックエンドの実行を失敗として終了 しますが、学習は続行されます。追跡サーバーが停止しても、学習を失うことはありません。
バックエンド
それぞれに専用のextraが必要です。
| 名前 | Extra | コンストラクター |
|---|---|---|
tensorboard | libreyolo[tensorboard] | TensorBoardLogger(log_dir=None) |
mlflow | libreyolo[mlflow] | MLflowLogger(tracking_uri, experiment_name, run_name, log_artifacts=True, log_checkpoints=False) |
wandb | libreyolo[wandb] | WandbLogger(project, name, entity, log_checkpoints=False) |
comet | libreyolo[comet] | CometLogger(project_name, workspace, name, api_key, online, log_artifacts=True, log_checkpoints=False) |
clearml | libreyolo[clearml] | ClearMLLogger(project_name="LibreYOLO", task_name, tags, output_uri, log_artifacts=True, log_checkpoints=False) |
neptune | libreyolo[neptune] | NeptuneLogger(project, api_token, name, run_id, tags, mode, capture_console=False, log_artifacts=True, log_checkpoints=False) |
dvclive、dvc | libreyolo[dvclive] | DVCLiveLogger(log_dir, resume, report, save_dvc_exp=False, dvcyaml=None, monitor_system=False, log_checkpoints=False) |
クラスはlibreyolo.trainingからインポートします。
最初の実行前に知っておくべきバックエンド固有の注意事項は次のとおりです。
TensorBoardイベントファイルのデフォルト出力先は<save_dir>/tensorboardです。
tensorboard --logdir runs/trainで表示します。
MLflow 3.xはローカルの./mlrunsファイルストアを非推奨とし、
MLFLOW_ALLOW_FILE_STORE=trueがない場合に例外を発生させます。サーバーなしのローカル追跡では、
上のスニペットのように代わりにデータベースURIを渡し、
mlflow ui --backend-store-uri sqlite:///mlflow.dbで読み取ります。
Weights & BiasesはWANDB_PROJECT環境変数、次にlibreyoloへフォールバックします。Cometは
COMET_PROJECT_NAME、次にlibreyoloへフォールバックし、認証情報を独自設定から取得します。
online=Falseはオフライン実験を作成します。ClearMLは新しいタスクを作成し、TrainConfigの
下に設定を報告し、指標が二重に報告されないようフレームワークの自動キャプチャを無効にします。
Neptuneは従来のパッケージではなく現在のneptune-scaleクライアントを使い、mode="offline"は
ローカルに記録します。
DVCLiveは<save_dir>/dvcliveへ書き出します。概要ツリーを/から構築しますが、親でもあるパスに
浮動小数点数を保持できないため、train/lossが名前を維持する一方、train/loss/boxは
train/loss.boxとして書き出されます。LibreYOLOは、DVC実験の保存とルートdvc.yamlの書き出し
というDVCLiveの通常のデフォルトも無効にします。そのため、オプトインのロガーが実行ディレクトリ
外にバージョン管理状態を作ることはありません。元に戻すには、save_dvc_exp=Trueまたは明示的な
dvcyaml=を渡します。
Neptuneは意図的にlibreyolo[all]から除外されています。安定版クライアントは7未満のprotobufを
必要とする一方、TFLiteのextraはprotobuf 7を必要とするためです。TFLiteのextraがない環境に
libreyolo[neptune]をインストールしてください。
コールバックの記述
同じ4つのイベントがすべてを駆動します。
from libreyolo import LibreYOLOfrom libreyolo.training import TrainEpochEvent def on_epoch(event: TrainEpochEvent) -> None: print(f"epoch {event.epoch}/{event.total_epochs} loss={event.train_loss:.4f}") model = LibreYOLO("LibreYOLO9s.pt")model.train(data="coco8.yaml", epochs=10, callbacks=on_epoch)from libreyolo import LibreYOLOfrom libreyolo.training import TrainEndEvent, TrainEpochEvent, TrainStartEvent class RunLog: def on_train_start(self, event: TrainStartEvent) -> None: print(f"{event.model_family}{event.model_size} -> {event.save_dir}") def on_train_epoch_end(self, event: TrainEpochEvent) -> None: if event.is_best: print(f"new best at epoch {event.epoch}: {event.best_metric}") def on_train_end(self, event: TrainEndEvent) -> None: print(f"done in {event.total_seconds:.0f}s") model = LibreYOLO("LibreYOLO9s.pt")model.train(data="coco8.yaml", epochs=10, callbacks=RunLog())| イベント | タイミング | 保持するもの |
|---|---|---|
TrainStartEvent | 設定後、エポック1の前 | start_epoch、total_epochs、model_family、model_size、task、save_dir、config |
TrainEpochEvent | 学習と検証を含む各エポック後 | epoch、train_loss、train_loss_items、lr、val_metrics、validated、is_best、current_metric、best_metric、best_epoch、epoch_seconds |
TrainEndEvent | 学習完了後 | completed_epochs、final_loss、best_metric、best_epoch、total_seconds、results |
TrainExceptionEvent | 学習が例外を発生させた場合 | epoch、exception、exception_type、exception_message、elapsed_seconds |
通常の呼び出し可能オブジェクトはTrainEpochEventだけを受け取ります。オブジェクトは
on_train_start、on_train_epoch_end、on_train_end、on_train_exceptionの任意の組み合わせを
実装でき、存在しないメソッドはスキップされます。
TrainStartEvent.configは、ユーザーのkwargsとファミリーのデフォルトをマージした完全な解決済み
設定で、読み取り専用のマッピングです。イベントは凍結されたdataclassで、そのマッピングも
読み取り専用なので、コールバックが書き込みによって実行を変更することはできません。
on_train_start、on_train_epoch_end、on_train_endから発生した例外は伝播し、実行を終了します。
保護されるのはon_train_exceptionだけなので、元の失敗を隠すことはありません。
マルチGPU学習では、コールバックはrank 0だけで発生します。DDPの自動生成ではpickle化も可能で なければならないため、クロージャーやlambdaではなくモジュールレベルのクラスまたは関数が必要です。 マルチGPU学習を参照してください。
各実行が常に書き出すもの
すべてのファミリーで、設定なしでも3つのファイルが実行ディレクトリに置かれます。
| ファイル | 書き出すタイミング | 内容 |
|---|---|---|
status.json | エポックごとと、開始時、終了時、失敗時にアトミックに書き出す | running、completed、failedのいずれかのstate、current_epoch、total_epochs、progress、eta_seconds、最新のmetrics、best_metric、best_epoch、失敗時のerrorオブジェクト |
metrics.jsonl | エポックごとに1回追記 | エポックごとに1行のJSON。results.csvと同じスキーマ |
train.log | リアルタイム | 実行のコンソール出力 |
status.jsonは実行をポーリングするスクリプトまたはエージェント向けの低コストな読み取り手段です。
アトミックな書き込みにより、読み取り側が書き込み途中のファイルを見ることはありません。
results.csvとsummary.jsonは別で、ファミリーによって制限されます。YOLOv9、YOLOv9-E2E、
YOLOv9-P2、YOLOv7、YOLO-NAS、RF-DETR、EC、DINOv2では書き出されますが、他のファミリーでは
書き出されません。results.csvは損失成分、検証指標、学習率を列としてエポックごとに1行を
追加し、新しい列が現れるとヘッダーが広がります。再開時には行が重複せず、再開したエポックより
前まで切り詰められます。
これらとともに、学習器は設定時に必ずtrain_config.yamlを書き出し、weights/以下に
チェックポイントを書き出します。
実行をリアルタイム監視
libreyolo monitor # runs/以下の最新実行libreyolo monitor runs/train/exp # 指定した実行libreyolo monitorは標準ライブラリだけを使い、上記のファイルからブラウザーダッシュボードを
提供します。指標チャート、ログ末尾、検証画像を表示し、実行中は更新されます。読み取り専用で
学習プロセスには一切触れないため、実行中の処理への接続、完了済み処理の再表示、クラッシュした
処理の調査ができます。