Tanda, Eksponen, Mantisa
Format Floating-Point IEEE 754
Setiap bilangan floating-point menyimpan tiga bidang:
- Bit tanda (1 bit): positif atau negatif
- Eksponen (bit E): skala magnitudo, pangkat bulat dari 2
- Mantisa (bit M): presisi pecahan, angka antara 1.0 dan ~2.0
Total bit = 1 + E + M. Nilainya kira-kira (-1)^sign (1 + mantissa) 2^(exponent - bias).
Dua properti penting untuk pelatihan:
Rentang dinamis = 2^(2^E) (kira-kira). Semakin banyak bit eksponen, semakin mampu merepresentasikan angka yang sangat kecil maupun sangat besar tanpa overflow.
Presisi = 2^M nilai berbeda per pangkat 2. Semakin banyak bit mantissa, semakin halus representasi di antara dua pangkat 2 yang berurutan.
Tiga Format
| Format | Total bit | Tanda | Exp | Mant | Rentang dinamis | Presisi |
|---|---|---|---|---|---|---|
| FP32 | 32 | 1 | 8 | 23 | ~10^-38 hingga ~10^38 | ~7 digit |
| FP16 | 16 | 1 | 5 | 10 | ~10^-5 to ~10^5 | ~3 digit |
| FP8 E4M3 | 8 | 1 | 4 | 3 | ~2^-9 to ~448 | ~2 digit |
FP8 E4M3 dibaca "4 bit eksponen, 3 bit mantisa". Alternatif FP8 E5M2 mengorbankan presisi demi jangkauan yang lebih luas; eksperimen ANDREA menggunakan E4M3 karena aktivasi transformer tetap berada dalam rentang magnitudo sempit di mana presisi ekstra lebih unggul daripada jangkauan ekstra.
Bytes Per Parameter
Mengapa Presisi Lebih Rendah Berjalan Lebih Cepat
Bandwidth Memori Mendominasi Kecepatan Pelatihan
GPU modern menghabiskan lebih banyak waktu menunggu memori daripada melakukan komputasi. RTX 4090 memiliki bandwidth memori 1008 GB/s & 165 TFLOPS komputasi FP16. Lapisan tipikal membaca bobot dari VRAM, mengalikan aktivasi, lalu menulis hasil kembali. Bandwidth, bukan komputasi, yang menentukan throughput.
Mengurangi presisi menjadi setengah akan mengurangi jumlah byte per parameter menjadi setengah, sehingga membaca bobot yang sama hanya menggunakan setengah bandwidth memori. Throughput kira-kira menjadi dua kali lipat.
Tensor Cores: Perkalian Matriks yang Dipercepat Perangkat Keras
RTX 4090 dilengkapi unit tensor core khusus yang menghitung perkalian matriks secara langsung pada FP16 atau FP8. Satu operasi tensor core mengalikan blok kecil (misalnya 16x16) dalam satu siklus, jauh lebih cepat daripada perkalian skalar FP32.
Angka empiris dari ANDREA-120M:
| Presisi | Langkah/menit | Catatan |
|---|---|---|
| FP32 | ~3 | baseline; tanpa akselerasi tensor core |
| FP16 | ~6 | cuBLAS tensor cores; 2x speedup |
| FP8 E4M3 | ~6 | tensor cores; comparable to FP16 |
FP8 tidak mengalahkan FP16 dalam throughput pada beban kerja ini karena compute throughput bukan lagi bottleneck; memory bandwidth & launch overhead menjadi pembatas. ANDREA-120M v3 menggunakan FP16 cuBLAS pada 6 langkah/menit untuk margin keamanan yang nyaman tanpa kehilangan throughput.
Risiko NaN pada FP8
FP8 E4M3 merepresentasikan angka dari ~2^-9 hingga ~448. Aktivasi atau gradien di luar rentang tersebut akan overflow menjadi NaN (bukan angka) atau underflow menjadi nol. Satu NaN meracuni setiap komputasi berikutnya: perkalian matriks dengan NaN menghasilkan semua-NaN; gradien semua-NaN merusak state AdamW; AdamW dengan m & v NaN menghasilkan update NaN; bobot menjadi NaN; seluruh proses pelatihan gagal.
Eksperimen FP8 ANDREA menghasilkan NaN cliffs sesekali yang memerlukan loss scaling, scheduled precision switching, atau fallback paths. Dynamic range FP16 (~10^-5 hingga ~10^5) cukup lebar sehingga kejadian NaN tetap jarang tanpa trik scaling yang rumit.
Memilih Presisi untuk Run Baru
Menempatkan 120M pada Satu 4090
Pengganda 6-8x dari Pelajaran Pendahuluan
Ingat dari grow_a_language_model_intro bahwa memori pelatihan kira-kira sama dengan 6-8x jumlah bobot mentah, yang mencakup:
- Bobot (1x)
- Momen pertama Adam m (1x)
- Momen kedua Adam v (1x)
- Gradient buffer (1x)
- Aktivasi & temporaries (~2-4x, tergantung batch & context)
ANDREA-120M pada FP16 dengan batch_size=8, context=1024:
| Komponen | Ukuran FP16 |
|---|---|
| Bobot | 240 MB |
| m (first moment) | 240 MB |
| v (second moment) | 240 MB |
| Gradients | 240 MB |
| Activations | ~2-4 GB (batch, ctx) |
| Total | ~3.5 GB |
RTX 4090 memiliki 24 GB VRAM. ANDREA-120M menggunakan ~14% pada FP16. Masih banyak ruang untuk ukuran batch yang lebih besar atau jendela konteks yang lebih panjang. ANDREA-12M hanya menggunakan total 1.4 GB.
Di Mana Mixed Precision Berada
ANDREA TIDAK menyimpan semuanya pada satu presisi. Pelatihan mixed-precision menyimpan:
- Bobot utama (Master weights): FP32 (menjaga stabilitas pelatihan)
- Komputasi forward & backward: FP16 (menggunakan tensor cores)
- Status optimizer AdamW: FP32 (m & v memerlukan presisi untuk pembaruan long-tail)
- Buffer gradien: FP16 (sisi komputasi)
Anggaran memori akhir menggabungkan keduanya. Jejak aktual ANDREA berada di antara FP16 murni (720 MB optimizer state) dan FP32 murni (1.44 GB optimizer state), lebih dekat ke FP32 karena m & v tetap dalam FP32.
Menentukan Anggaran untuk ANDREA-480M
Presisi dalam Praktik
Aktivitas Berdekatan
Tiga saudara terkait dengan presisi:
- Aktivitas 1: Pengantar / Anggaran VRAM. Presisi mengalikan setiap suku dalam aritmetika anggaran memori. Aturan praktis pengali 6-8x bersifat unitless; bytes-per-param memberinya satuan.
- Aktivitas 10: AdamW. Status pengoptimal (m & v) biasanya tetap di FP32 meskipun komputasi forward/backward berjalan di FP16. Alasan: presisi akumulator long-tail lebih penting daripada kecepatan runtime untuk pengoptimal.
- Aktivitas 12: Gradient clipping. Clipping membatasi magnitudo gradien sebelum pembaruan status pengoptimal. Dengan forward/backward FP16 & pengoptimal FP32, clipping terjadi di batas tempat presisi berubah & di mana risiko overflow terkonsentrasi.
Presisi adalah tombol bebas: ubah presisi, model melatih lebih cepat & menggunakan lebih sedikit memori. Biayanya adalah kehati-hatian numerik: penanganan NaN, loss scaling, disiplin mixed-precision. ANDREA-120M v3 menunjukkan hasilnya: 120M parameter dilatih di perangkat keras konsumen dalam 23 hari karena FP16 memotong semuanya menjadi setengah.