Enam Belas Hari Komputasi pada Satu GPU
Satu Eksekusi Panjang
ANDREA-120M memakan waktu ~23 hari pada RTX 4090 (FP16, 6 langkah/menit, 200K langkah). Daya listrik, kernel panic, crash proxy, & perubahan konfigurasi disengaja semuanya terjadi selama jendela tersebut. Tanpa checkpoint, satu gangguan membuang seluruh eksekusi.
v1 kehilangan 27K langkah karena satu kesalahan (lr=0.001 terlalu agresif) karena tidak ada checkpoint yang lebih dekat dari titik peluncuran. v2 menyerap pelajaran itu: cadence checkpoint turun menjadi setiap 100 langkah, & penanganan sinyal CUDA menjamin penulisan checkpoint pada SIGTERM.
Tiga Peran
Sebuah checkpoint melayani tiga pekerjaan sekaligus:
1. Titik pemulihan. Proses mati, mesin restart, kernel panic: lanjutkan dari step_NNNNNN.bin terbaru.
2. Pivot poles. Langkah 112,619: ubah kurikulum tanpa melatih ulang. SIGUSR1 memaksa checkpoint bersih, proxy berhenti, caps & floors baru dikirimkan, CUDA melanjutkan dari titik tersimpan di bawah kebijakan baru.
3. Fork audit. Bandingkan dua konfigurasi pada bobot awal yang sama: salin checkpoint, jalankan dua cabang yang berbeda ke depan, amati mana yang konvergen.
Setiap 100 langkah memberikan ~17 menit pelatihan antara penulisan pada 6 langkah/menit. 100 langkah juga cocok dengan sample_every: setiap checkpoint sesuai dengan satu audit sampel segar, & setiap audit sampel sesuai dengan titik pemulihan.
Tiga Peran untuk Satu File
Lima Wilayah dalam Satu File
Format
Setiap step_NNNNNN.bin mengemas lima wilayah kontigu:
[int32 step] [int32 n_params] [n_params x float32 weights] [n_params x float32 m] [n_params x float32 v]
Wilayah demi Wilayah
Header (total 8 byte). Nomor langkah 32-bit memberi tahu kita di mana snapshot ini berada dalam pelatihan; jumlah parameter 32-bit memberi tahu kita seberapa besar tiga array berikutnya masing-masing.
Bobot (n_params x 4 byte). Setiap parameter yang dipelajari, rata. Urutan sesuai dengan iterator parameter model: embedding token & posisi, kemudian bobot per-lapisan attention & MLP, kemudian kepala output.
Momen pertama Adam m (n_params x 4 byte). EMA dari gradien masa lalu (beta1 = 0.9). Bentuk sama seperti bobot. Diperlukan untuk kelanjutan AdamW.
Momen kedua Adam v (n_params x 4 bytes). EMA dari gradien kuadrat masa lalu (beta2 = 0.999). Bentuk sama seperti bobot. Diperlukan untuk resumsi AdamW.
Ukuran Total
Total byte = 8 + 12 x n_params. ANDREA-12M (12.8M params): 154 MB di disk (147 MB dibulatkan). ANDREA-120M (~120M params) FP32: ~1.44 GB. Tiga array dengan bentuk identik, disusun berurutan, dengan header kecil.
Mengapa Menyimpan m & v
Adam vanilla melacak laju pembelajaran per-parameter melalui m & v. Jika dibuang saat menulis checkpoint & run yang dilanjutkan dimulai dengan momentum nol & estimasi varians nol, setara dengan laju pembelajaran 0 untuk satu langkah kemudian lonjakan mendadak. Loss melonjak; model bisa keluar dari basin saat ini. Menyimpan m & v membuat resume setara bit (modulo keacakan dataloader) dengan baseline yang tidak pernah berhenti.
Menentukan Ukuran Satu Checkpoint
SIGTERM & SIGUSR1
Mengapa CUDA Menangani Sinyal
Pelatihan berjalan sebagai proses foreground yang panjang. Ketika proxy atau operator ingin GPU berhenti, sebuah sinyal dikirim ke engine CUDA. Tanpa handler, SIGTERM default langsung membunuh proses: komputasi gradien yang sedang berlangsung dibuang, bobot terbaru sejak checkpoint terakhir hilang. Dengan handler, engine menulis checkpoint terlebih dahulu lalu keluar dengan bersih.
SIGTERM: tulis & keluar
Dikirim oleh tombol stop, systemctl stop, atau kill dari proxy induk. CUDA menyelesaikan langkah saat ini, menulis step_NNNNNN.bin ke disk, lalu keluar. Pemulihan dari kondisi ini hanya membutuhkan .bin terbaru: nol pekerjaan hilang selain langkah parsial yang sedang berlangsung.
SIGUSR1: tulis & lanjutkan
Dikirim atas permintaan oleh operator atau skrip proxy. CUDA menyelesaikan langkah saat ini, menulis step_NNNNNN.bin, lalu melanjutkan pelatihan seolah tidak ada apa-apa. Berguna untuk: memicu titik audit tepat sebelum perubahan konfigurasi; menangkap bobot pada momen yang diketahui baik; menyelaraskan checkpoint dengan run penilaian kualitas sampel eksternal.
Urutan Pivot Polandia (langkah 112,619)
1. Operator mengirim SIGUSR1 ke CUDA. Checkpoint ditulis pada batas 100-langkah berikutnya (langkah 112,700).
2. Operator menghentikan proxy.
3. .samples.json & .state.json diarsipkan (log sampel & status bandit disimpan sebagai catatan historis).
4. .loss.json tetap di tempat. Riwayat pelatihan kumulatif; tidak pernah diarsipkan.
5. Proxy dimulai ulang dengan caps & floors baru.
6. CUDA dilanjutkan dari step_112700.bin dengan bandit baru tetapi bobot lengkap, m, & v.
Riwayat loss berlanjut tanpa putus melintasi pivot. Log sampel reset dengan bersih. Bandit mendapat awal baru di bawah kebijakan baru.
Memilih Sinyal
Riwayat Pelatihan Kumulatif
Tiga File Sidecar
Di samping setiap checkpoint, proxy mempertahankan tiga sidecar JSON di direktori run:
- .loss.json -- satu entri per langkah, selamanya. ~200.000 entri pada akhir run. Riwayat pelatihan kumulatif.
- .samples.json -- sampel yang dihasilkan baru-baru ini untuk audit. Direset pada polish pivots.
- .state.json -- bandit arm pulls, hadiah EMA, penghitung fase. Direset pada polish pivots.
Apa yang Direset, Apa yang Bertahan
Pivot poles adalah perubahan kebijakan, bukan reset run. Bobot model, m, v, & riwayat loss semuanya berlanjut tanpa putus. Hadiah akumulasi bandit TIDAK berlanjut: topi & lantai baru mendefinisikan kebijakan yang berbeda, & bandit harus belajar ulang di bawah kebijakan baru dari keadaan bersih.
Mengapa .loss.json Tetap
Riwayat loss berfungsi sebagai jejak audit run. Setiap klaim yang dipublikasikan tentang ANDREA-120M (EMA loss pada langkah 110K, pemulihan pivot-poles, konvergensi pada langkah 112K) dapat ditelusuri kembali ke entri dalam file ini. Mengarsipkan .loss.json antar fase akan memaksa pembaca menyusun potongan-potongan untuk merekonstruksi run; menjaganya append-only & tidak tersentuh melestarikan asal-usul.
Pelajaran Lengan Zombie
Langkah 112,619 menemukan lengan repo-docstrings di .state.json yang membawa bobot 1.546 dari run sebelumnya. Keadaan bandit telah dilestarikan melintasi restart sebelumnya tetapi sumber data tidak lagi tersedia, menghasilkan tarikan zombie yang mendistorsi akuntansi eksplorasi. Pelajaran: keadaan bandit DIIZINKAN berubah melintasi restart dengan cara yang mengejutkan. Riwayat loss adalah satu-satunya file yang harus tetap tidak tersentuh selama masa pakai run penuh.
Satu Aturan untuk Mengatur Semuanya
Arsipkan .samples.json & .state.json secara bebas antar fase. Jangan pernah arsipkan .loss.json. .loss.json terbaru selalu merupakan riwayat pelatihan kanonik.
Menerapkan Aturan
Apa yang Dibangun & Mengapa
Lima Keputusan
1. Cadence: setiap 100 langkah. Granularitas titik pemulihan ~17 menit. Selaras dengan sample_every sehingga setiap checkpoint sesuai dengan satu audit sampel segar.
2. Format: header + 3 array. Minimal: header 8-byte memberi tahu seberapa besar setiap array berikutnya. Tidak ada pembengkakan metadata. Resume bit-equivalent saat m & v disimpan.
3. Sinyal: SIGTERM & SIGUSR1. Dua peran, dua sinyal. Penutupan systemd default mendapatkan checkpoint bersih melalui SIGTERM; titik audit on-demand mendapatkan checkpoint bersih melalui SIGUSR1 tanpa berhenti.
4. Kontinuitas loss: tidak pernah diarsipkan. Riwayat pelatihan kumulatif bertahan melintasi pivot poles, restart, & perubahan kebijakan. Satu jejak audit untuk seluruh jalannya.
5. Status Bandit: reset diizinkan. Kebijakan Bandit hidup di bawah satu konfigurasi pada satu waktu. Pivot poles mereset; riwayat loss berlanjut. Dua masa pakai berbeda berbagi direktori jalannya yang sama.
Apa yang Terhubung dengan Pelajaran Ini
- Aktivitas 23 (grow_a_language_model_sample_audit). cadence sample_every cocok dengan cadence checkpoint; keduanya berjalan setiap 100 langkah.
- Aktivitas 24 (grow_a_language_model_microgpt_to_andrea). v1 collapse, v2.5 patch, v3 polish pivot semuanya memerlukan checkpoint bersih untuk beroperasi.
- Aktivitas 10 (grow_a_language_model_adamw). Menyimpan m & v di checkpoint penting karena aturan pembaruan AdamW bergantung pada keduanya. Jika dihapus & dilanjutkan, akan menyimpang.
Satu Kebenaran Teknik Lagi
Kode bertahan lebih lama daripada penulisnya. Infrastruktur bertahan lebih lama daripada pembuatnya. Format checkpoint sederhana bertahan lebih lama daripada setiap skema resume mewah yang menjanjikan untuk melewatkan penyimpanan status optimizer. Hemat byte; hemat pelatihan.