Hydra: Manajemen Konfigurasi yang Rapi untuk Aplikasi ML dan Python
Kebanyakan proyek machine learning dimulai dari satu skrip training dan beberapa hyperparameter yang dilewatkan lewat argparse. Beberapa bulan kemudian skrip yang sama sudah memiliki tiga puluh flag, path yang di-hardcode tersebar di banyak fungsi, dan tidak ada yang bisa mereproduksi run yang menghasilkan model terbaik kuartal lalu. Hydra, framework open-source dari Meta yang dibangun di atas OmegaConf, dirancang persis untuk menyelesaikan kelas masalah ini. Tutorial ini membahas Hydra dari dasar menggunakan alur kerja training model yang realistis sebagai contoh utama.
Apa Itu Hydra dan Masalah yang Diselesaikannya
Hydra adalah framework Python untuk menyusun (compose) dan menimpa (override) konfigurasi berhierarki. Alih-alih satu file konfigurasi raksasa atau deretan flag command-line, Anda mendeskripsikan konfigurasi sebagai pohon dari file-file YAML kecil yang disusun Hydra saat runtime. Anda kemudian bisa menimpa nilai apa pun dari command line, menukar seluruh grup konfigurasi (misalnya beralih dari ResNet ke Vision Transformer), dan menjalankan sweep di berbagai kombinasi parameter.
Masalah konkret yang ditangani dalam pekerjaan ML:
- Definisi
argparseyang tersebar. Flag menumpuk di banyak file dan sulit ditemukan atau didokumentasikan. - Hyperparameter yang di-hardcode. Learning rate dan path yang terkubur dalam kode sumber membuat eksperimen rapuh.
- Run yang sulit direproduksi. Tanpa snapshot konfigurasi yang persis, mereproduksi hasil beberapa bulan kemudian hanya menjadi tebakan.
- Konfigurasi eksperimen yang kombinatorial. Mencoba tiga model terhadap empat dataset dengan dua optimizer berarti dua puluh empat run; mengelolanya secara manual rawan kesalahan.
Hydra berdiri di atas OmegaConf, yang menyediakan objek konfigurasi bertipe di baliknya (sebuah DictConfig), interpolasi variabel, dan logika penggabungan. Hydra menambahkan komposisi, override command-line, direktori output otomatis, dan multirun.
Instalasi
Hydra dipublikasikan sebagai hydra-core di PyPI. Pasang ke environment proyek Anda:
pip install hydra-core
Plugin opsional untuk sweeper dan launcher adalah paket terpisah, dipasang saat dibutuhkan:
pip install hydra-optuna-sweeper
pip install hydra-joblib-launcher
pip install hydra-submitit-launcher
Verifikasi instalasi:
python -c "import hydra; print(hydra.version)"
Tutorial ini menargetkan Hydra 1.3.x, yaitu jalur stabil saat ini.
Dasar: Entry Point, File Konfigurasi, dan cfg
Aplikasi Hydra memiliki tiga bagian: direktori konfigurasi, file YAML konfigurasi, dan fungsi entry-point yang didekorasi. Buat struktur proyek seperti ini:
project/
├── train.py
└── conf/
└── config.yaml
Mulai dengan conf/config.yaml minimal:
epochs: 10
batchsize: 32
optimizer:
name: adam
lr: 0.001
Sekarang entry point di train.py:
import hydra
from omegaconf import DictConfig, OmegaConf
@hydra.main(versionbase=None, configpath="conf", configname="config")
def main(cfg: DictConfig) -> None:
print(OmegaConf.toyaml(cfg))
print(f"Training selama {cfg.epochs} epoch")
print(f"Optimizer: {cfg.optimizer.name} @ lr={cfg.optimizer.lr}")
if name == "main":
main()
Beberapa catatan tentang dekorator. versionbase=None memilih perilaku modern dan menghilangkan peringatan kompatibilitas; setel secara eksplisit agar skrip Anda berperilaku konsisten di berbagai versi Hydra. configpath relatif terhadap file yang mendefinisikan main, dan configname adalah nama file YAML tanpa ekstensinya.
Jalankan:
python train.py
Objek cfg adalah DictConfig dari OmegaConf. Anda mengakses nilai dengan notasi titik (cfg.optimizer.lr) atau sintaks kamus (cfg["optimizer"]["lr"]). Objek ini berperilaku seperti namespace bersarang, dan OmegaConf mempertahankan tipe yang dideklarasikan di YAML, sehingga cfg.epochs bertipe int dan cfg.optimizer.lr bertipe float.