Pencatat eksperimen

Setiap family yang dapat dilatih memancarkan empat peristiwa pelatihan. Pencatat bawaan adalah objek callback yang mendengarkan peristiwa yang sama, sehingga integrasi backend dan hook kustom menggunakan satu antarmuka.

Nyalakan logger

loggers= mengambil nama yang terdaftar, sebuah instance yang dikonfigurasi, atau iterable yang mencampur keduanya.

Berdasarkan nama
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLO9s.pt")model.train(data="coco8.yaml", epochs=10, loggers="tensorboard")
Instansi yang dikonfigurasi
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"],)

Nama tidak sensitif terhadap huruf besar/kecil. Set terdaftar adalah tensorboard, mlflow, wandb, comet, clearml, neptune, dvclive dan dvc, yang terakhir merupakan alias untuk dvclive. Apa pun yang lain akan memunculkan kesalahan segera dan menampilkan nama yang valid. Tidak ada nilai yang mengaktifkan semuanya, dan tidak ada CLI flag: loggers= adalah argumen Python.

Apa yang dicatat setiap backend

Semua backend menulis nama metrik yang sama, sehingga dasbor terlihat sama di mana pun Anda memilihnya:

KunciNilai
train/lossrata-rata pelatihan loss dari epoch
train/loss/<component>setiap komponen loss laporan family
lr/<group>learning rate dari setiap kelompok parameter optimizer
val/<metric>setiap metrik validasi, dengan awalan metrics/-nya dihapus
time/epoch_secondsjam dinding untuk epoch

Langkahnya adalah epoch berbasis 1. Konfigurasi pelatihan yang sepenuhnya terselesaikan adalah dicatat sebagai parameter saat mulai pelatihan, dan nama jalannya default ke <family><size>-<task>, misalnya yolo9s-detect.

Pada akhir pelatihan, backend yang mendukung pengunggahan artefak results.csv, train_config.yaml dan summary.json ketika ada, ditambah weights/best.pt dengan log_checkpoints=True. TensorBoard tidak mengunggah apa pun, karena tidak memiliki konsep artefak. Tidak ada logger yang mengunggah gambar plot validasi.

Perilaku kegagalan

Paket backend yang hilang akan memunculkan kesalahan saat konstruksi, menyebutkan perintah instalasi, karena meminta logger dan diam-diam tidak mendapatkan apa pun menyembunyikan bug.

Kegagalan backend selama proses berjalan melakukan hal sebaliknya. Pengecualian pertama dari sebuah handler menonaktifkan logger tersebut untuk sisa proses, mencatatnya, merusak backend dicatat sebagai gagal, dan pelatihan berlanjut. Server pelacakan yang mati tidak akan merugikan pelatihan Anda.

Backend

Masing-masing membutuhkan tambahan sendiri.

NamaTambahanKonstruktor
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)
dvclive, dvclibreyolo[dvclive]DVCLiveLogger(log_dir, resume, report, save_dvc_exp=False, dvcyaml=None, monitor_system=False, log_checkpoints=False)

Impor kelas-kelas dari libreyolo.training.

Catatan khusus backend yang perlu diketahui sebelum jalankan pertama:

Berkas-event TensorBoard default ke <save_dir>/tensorboard. Lihat dengan tensorboard --logdir runs/train.

MLflow 3.x menghentikan penggunaan local ./mlruns berkas store dan akan menimbulkan kesalahan kecuali MLFLOW_ALLOW_FILE_STORE=true. Untuk pelacakan lokal tanpa server, gunakan URI database sebagai gantinya, seperti pada cuplikan di atas, dan baca dengan mlflow ui --backend-store-uri sqlite:///mlflow.db.

Weights & Biases beralih ke environment variable WANDB_PROJECT dan kemudian ke libreyolo. Comet beralih ke COMET_PROJECT_NAME dan kemudian ke libreyolo, dan mengambil kredensial dari konfigurasinya sendiri; online=False memberikan eksperimen offline. ClearML membuat task baru, melaporkan konfigurasi di bawah TrainConfig, dan menonaktifkan pengambilan framework otomatis sehingga metrik tidak dilaporkan dua kali. Neptune menggunakan client neptune-scale saat ini daripada paket warisan, dan mode="offline" mencatat secara lokal.

DVCLive menulis ke <save_dir>/dvclive. Ini membangun pohon ringkasannya dari /, dan tidak dapat menahan float di jalur yang juga merupakan induk, jadi train/loss/box adalah ditulis sebagai train/loss.box sementara train/loss tetap namanya. LibreYOLO juga mematikan default biasa DVCLive untuk menyimpan eksperimen DVC dan menulis root dvc.yaml, jadi pencatat opsional tidak membuat status kontrol versi di luar jalannya direktori; lewati save_dvc_exp=True atau dvcyaml= yang eksplisit untuk mendapatkannya kembali.

Neptune sengaja dikecualikan dari libreyolo[all]: kliennya yang stabil membutuhkan protobuf di bawah 7 sementara tambahan TFLite membutuhkan protobuf 7. Pasang libreyolo[neptune] dalam lingkungan tanpa tambahan TFLite.

Keempat kejadian yang sama mengendalikan semuanya.

Sebuah fungsi biasa
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)
Sebuah objek dengan beberapa hook
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())

KejadianKapanMembawa
TrainStartEventsetelah pengaturan, sebelum epoch 1start_epoch, total_epochs, model_family, model_size, task, save_dir, config
TrainEpochEventsetelah setiap epoch, pelatihan dan validasiepoch, train_loss, train_loss_items, lr, val_metrics, validated, is_best, current_metric, best_metric, best_epoch, epoch_seconds
TrainEndEventsetelah pelatihan selesaicompleted_epochs, final_loss, best_metric, best_epoch, total_seconds, results
TrainExceptionEventjika pelatihan menghasilkanepoch, exception, exception_type, exception_message, elapsed_seconds

Sebuah callable biasa hanya menerima TrainEpochEvent. Sebuah objek dapat mengimplementasikan apa saja subkumpulan dari on_train_start, on_train_epoch_end, on_train_end dan on_train_exception; metode yang hilang dilewati.

TrainStartEvent.config adalah konfigurasi yang sepenuhnya terselesaikan, kwargs pengguna digabungkan dengan default family, sebagai pemetaan hanya-baca. Peristiwa-peristiwa tersebut adalah datakelas yang dibekukan dan pemetaannya bersifat hanya-baca, jadi sebuah callback tidak dapat mengubah jalannya dengan menulis kepada satu.

Sebuah pengecualian yang timbul dari on_train_start, on_train_epoch_end atau on_train_end menyebar dan mengakhiri jalannya. Hanya on_train_exception yang dijaga, sehingga tidak dapat menutupi kegagalan asli.

Dalam pelatihan multi-GPU, callback hanya dijalankan pada rank 0. Dengan DDP otomatis untuk spawn mereka juga harus dapat dipicklable, yang berarti kelas di tingkat modul atau fungsi daripada sebuah closure atau lambda. Lihat Pelatihan Multi-GPU.

Apa yang ditulis setiap lari bagaimanapun

Tiga berkas mendarat di direktori run tanpa konfigurasi sama sekali, pada setiap family:

BerkasTertulisIsi
status.jsonsecara atomik, setiap epoch dan saat mulai, akhir, dan kegagalanstate dari running, completed atau failed, current_epoch, total_epochs, progress, eta_seconds, metrics terbaru, best_metric, best_epoch, dan sebuah objek error saat kegagalan
metrics.jsonlditambahkan sekali per epochsatu baris JSON per epoch, skema yang sama seperti results.csv
train.loglangsungoutput konsol dari run

status.json adalah pembacaan murah untuk skrip atau agen yang memeriksa run, dan penulisan atomik berarti pembaca tidak pernah melihat berkas yang setengah ditulis.

results.csv dan summary.json terpisah dan digerakkan oleh family. Mereka ditulis untuk YOLOv9, YOLOv9-E2E, YOLOv9-P2, YOLOv7, YOLO-NAS, RF-DETR, EC dan DINOv2, dan tidak untuk keluarga lainnya. results.csv mendapatkan satu baris per epoch dengan loss komponen, metrik validasi dan learning rate sebagai kolom, dan headernya melebar saat kolom baru muncul. Saat dilanjutkan, itu dipangkas kembali ke baris sebelum epoch yang dilanjutkan daripada menggandakannya.

Bersamaan dengan itu, pelatih selalu menulis train_config.yaml saat pengaturan dan titik pemeriksaan di bawah weights/.

Tonton jalannya secara langsung

Tonton sebuah run di peramban
libreyolo monitor                     # run terbaru di bawah runs/libreyolo monitor runs/train/exp      # sebuah run tertentu

libreyolo monitor menyediakan dasbor peramban atas berkas-berkas di atas hanya menggunakan perpustakaan standar: grafik metrik, ekor log, dan semua gambar validasi, menyegarkan saat lari aktif. Ini hanya-baca dan tidak pernah menyentuh proses pelatihan, sehingga menempel pada jalannya yang sedang berlangsung, membuka kembali yang sudah selesai, atau memeriksa yang jatuh.

Terkait

  • Validasi dan metrik untuk apa arti tombol val/ dan bagaimana cara menambahkan validasi loss.
  • Kinerja pelatihan untuk profiler, yang merupakan alat yang berbeda dengan pertanyaan yang berbeda.

Diverifikasi dengan LibreYOLO v1.5.0.