Markdownで表示

実験ロガー

学習可能なすべてのファミリーは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"],)

名前は大文字と小文字を区別しません。登録済みの集合はtensorboardmlflowwandbcometclearmlneptunedvclivedvcで、最後のものは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.csvtrain_config.yamlsummary.jsonをアップロードし、log_checkpoints=Trueならweights/best.ptもアップロードします。 TensorBoardには成果物という概念がないため、何もアップロードしません。検証プロット画像を アップロードするロガーはありません。

失敗時の動作

バックエンドパッケージがない場合、構築時にインストールコマンドを示して例外を発生させます。 ロガーを要求したのに何も得られない状態を通知なく許すと、不具合が隠れるためです。

実行中にバックエンドが失敗した場合は逆の動作になります。ハンドラーで最初の例外が発生すると、 残りの実行ではそのロガーを無効にし、例外をログに記録し、バックエンドの実行を失敗として終了 しますが、学習は続行されます。追跡サーバーが停止しても、学習を失うことはありません。

バックエンド

それぞれに専用のextraが必要です。

名前Extraコンストラクター
tensorboardlibreyolo[tensorboard]TensorBoardLogger(log_dir=None)
mlflowlibreyolo[mlflow]MLflowLogger(tracking_uri, experiment_name, run_name, log_artifacts=True, log_checkpoints=False)
wandblibreyolo[wandb]WandbLogger(project, name, entity, log_checkpoints=False)
cometlibreyolo[comet]CometLogger(project_name, workspace, name, api_key, online, log_artifacts=True, log_checkpoints=False)
clearmllibreyolo[clearml]ClearMLLogger(project_name="LibreYOLO", task_name, tags, output_uri, log_artifacts=True, log_checkpoints=False)
neptunelibreyolo[neptune]NeptuneLogger(project, api_token, name, run_id, tags, mode, capture_console=False, log_artifacts=True, log_checkpoints=False)
dvclivedvclibreyolo[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/boxtrain/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_epochtotal_epochsmodel_familymodel_sizetasksave_dirconfig
TrainEpochEvent学習と検証を含む各エポック後epochtrain_losstrain_loss_itemslrval_metricsvalidatedis_bestcurrent_metricbest_metricbest_epochepoch_seconds
TrainEndEvent学習完了後completed_epochsfinal_lossbest_metricbest_epochtotal_secondsresults
TrainExceptionEvent学習が例外を発生させた場合epochexceptionexception_typeexception_messageelapsed_seconds

通常の呼び出し可能オブジェクトはTrainEpochEventだけを受け取ります。オブジェクトは on_train_starton_train_epoch_endon_train_endon_train_exceptionの任意の組み合わせを 実装でき、存在しないメソッドはスキップされます。

TrainStartEvent.configは、ユーザーのkwargsとファミリーのデフォルトをマージした完全な解決済み 設定で、読み取り専用のマッピングです。イベントは凍結されたdataclassで、そのマッピングも 読み取り専用なので、コールバックが書き込みによって実行を変更することはできません。

on_train_starton_train_epoch_endon_train_endから発生した例外は伝播し、実行を終了します。 保護されるのはon_train_exceptionだけなので、元の失敗を隠すことはありません。

マルチGPU学習では、コールバックはrank 0だけで発生します。DDPの自動生成ではpickle化も可能で なければならないため、クロージャーやlambdaではなくモジュールレベルのクラスまたは関数が必要です。 マルチGPU学習を参照してください。

各実行が常に書き出すもの

すべてのファミリーで、設定なしでも3つのファイルが実行ディレクトリに置かれます。

ファイル書き出すタイミング内容
status.jsonエポックごとと、開始時、終了時、失敗時にアトミックに書き出すrunningcompletedfailedのいずれかのstatecurrent_epochtotal_epochsprogresseta_seconds、最新のmetricsbest_metricbest_epoch、失敗時のerrorオブジェクト
metrics.jsonlエポックごとに1回追記エポックごとに1行のJSON。results.csvと同じスキーマ
train.logリアルタイム実行のコンソール出力

status.jsonは実行をポーリングするスクリプトまたはエージェント向けの低コストな読み取り手段です。 アトミックな書き込みにより、読み取り側が書き込み途中のファイルを見ることはありません。

results.csvsummary.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は標準ライブラリだけを使い、上記のファイルからブラウザーダッシュボードを 提供します。指標チャート、ログ末尾、検証画像を表示し、実行中は更新されます。読み取り専用で 学習プロセスには一切触れないため、実行中の処理への接続、完了済み処理の再表示、クラッシュした 処理の調査ができます。

関連項目

  • val/キーの意味と検証損失の追加方法については検証と指標を参照してください。
  • 別の問いを扱う別ツールであるプロファイラーについては学習パフォーマンスを参照してください。

LibreYOLO v1.5.0で検証済みです。