Pelacakan eksperimen adalah disiplin mencatat setiap pelatihan beserta konfigurasi, benih, dan hasilnya, sehingga angka yang dilaporkan dapat dihasilkan ulang oleh siapa pun dengan berkas yang sama. Topik ini menetapkan isi catatan minimum satu run, memeragakan reproduksi penuh dari konfigurasi yang tersimpan, dan menutup dengan struktur folder hasil pelatihan. Setelah selesai, perbedaan antara eksperimen yang dapat dipercaya dan yang hanya sekali terjadi menjadi tegas.
Isi catatan minimum satu run#
Satu run yang dapat dipercaya menyimpan empat kelompok informasi. Identitasnya, yaitu nama run, waktu, dan tujuan eksperimen yang ditulis satu kalimat. Konfigurasinya, yaitu arsitektur, hyperparameter, dan sumber data, dan seluruhnya berasal dari satu berkas konfigurasi dan bukan dari argumen yang diketik ulang. Benih keacakannya, yaitu benih untuk torch dan pembagi data, sebagaimana dilatih sejak topik Penyiapan lingkungan. Hasilnya, yaitu kurva loss train dan validasi, metrik akhir, serta komentar kejadian yang tidak biasa selama pelatihan.
Kebutuhan yang menyatukan keempatnya adalah penurunan konfigurasi ke satu berkas yang ditandatangani hash, sehingga dua run yang klaimnya sama dapat diperiksa kesamaannya tanpa membaca ulang seluruh riwayat percakapan. Kerangka pelacak seperti Weights and Biases atau MLflow mengotomatiskan catatan ini, dan mekanikanya tetap sama, yaitu serialisasi konfigurasi, hash, dan metrik yang ditulis seiring berjalannya pelatihan.
Konfigurasi, hash, dan run yang direproduksi#
Contoh berikut menyimpan konfigurasi dalam kamus, menghitung hashnya, menjalankan pelatihan mini sesuai konfigurasi itu, lalu menjalankan ulangnya untuk membuktikan identitas hasil. Hash dihitung dari teks JSON yang terurut agar dua kamus yang isinya sama selalu menghasilkan tanda tangan yang sama.
import hashlib
import json
import torch
import torch.nn as nn
def jalankan_run(config):
torch.manual_seed(config["benih"])
w = torch.randn(1, config["dim"])
X = torch.randn(64, config["dim"])
t = X @ w.T + 0.1 * torch.randn(64, 1)
model = nn.Linear(config["dim"], 1)
opt = torch.optim.SGD(model.parameters(), lr=config["lr"])
for _ in range(config["langkah"]):
opt.zero_grad()
((model(X) - t) ** 2).mean().backward()
opt.step()
with torch.no_grad():
return round(float(((model(X) - t) ** 2).mean()), 6)
config = {"benih": 0, "dim": 4, "lr": 0.05, "langkah": 200}
tanda = hashlib.sha256(json.dumps(config, sort_keys=True).encode()).hexdigest()[:12]
loss1 = jalankan_run(config)
loss2 = jalankan_run(config)
print("hash konfigurasi :", tanda)
print("run pertama :", loss1)
print("run kedua :", loss2)
print("reproduksi persis:", loss1 == loss2)hash konfigurasi : e14ea5ff5f88
run pertama : 0.008153
run kedua : 0.008153
reproduksi persis: TrueKedua run menghasilkan loss yang persis sama karena benih yang menyatukan seluruh sumber keacakan, dan hash konfigurasinya menjadi nama yang layak untuk berkas hasilnya. Perhatikan bahwa determinisme ini berlaku penuh pada CPU dan konfigurasi yang sama, sedangkan GPU dan variasi pustaka dapat menggeser digit akhir, sehingga perbandingan antar mesin memakai toleransi dan bukan kesamaan persis.
Struktur hasil dan kebiasaan pencatatan#
Struktur folder yang memisahkan setiap run menjadi kebiasaan yang murah dan menguntungkan lama. Satu folder per run memuat konfigurasi, benih, berkas checkpoint, dan ringkasan metriknya, dan nama foldernya memuat hash konfigurasi itu. Pola simpan-teratur ini memudahkan tiga pekerjaan yang datang belakangan, yaitu membandingkan run pada tabel, memilih checkpoint terbaik untuk deployment, dan menelusuri sejak kapan sebuah regresi muncul.
Kebiasaan pencatatannya dapat dirangkum menjadi tiga. Pertama, catat sebelum melatih, karena konfigurasi yang ditulis setelah hasil terlihat cenderung menyempurnakan cerita dan bukan fakta. Kedua, satu perubahan konfigurasi per run, karena dua perubahan sekaligus membuat perbandingannya tak terbaca, sejalan dengan kaidah strategi hyperparameter. Ketiga, simpan checkpoint bersama metrik validasi yang terbaik, bukan hanya checkpoint terakhir, sebagaimana kurva validasi menentukan titik terbaiknya.
Checkpoint itu sendiri disimpan sebagai pasangan yang lengkap, yaitu state_dict model dan state_dict optimizer beserta konfigurasinya, sehingga pelatihan dapat dilanjutkan tanpa tebak-tebakan. Kelanjutan pelatihan dari checkpoint adalah kemampuan yang diuji pada topik Kampanye pelatihan, dan strukturnya dibangun sejak sekarang.
Ringkasan#
- Satu run yang dapat dipercaya mencatat identitas, konfigurasi, benih, dan hasilnya, dan konfigurasinya berasal dari satu berkas yang di-hash.
- Hash JSON yang terurut menjadi tanda tangan konfigurasi, dan benih yang sama menghasilkan loss yang persis sama pada CPU.
- Satu folder per run memuat konfigurasi, checkpoint, dan metrik, dengan checkpoint terbaik yang dipilih dari validasi.
- Catatan ditulis sebelum melatih, satu perubahan per run, dan checkpoint disimpan bersama state_dict optimizer.
Referensi#
- Weights & Biases documentation — Dokumentasi kerangka pelacakan eksperimen yang lazim dipakai industri.
- MLflow Tracking — documentation — Dokumentasi pelacakan sumber terbuka beserta strukturnya.
- Reproducibility — PyTorch — Catatan resmi PyTorch tentang benih, determinisme, dan batasnya antar perangkat.