Apa itu mixed precision training?
Mixed precision training menjalankan sebagian besar hitungan neural network dalam format float 16-bit, fp16 atau bf16, sambil menyimpan beberapa nilai yang sensitif dalam fp32 yang 32-bit. Forward pass dan backward pass memakai weight dan aktivasi 16-bit, lalu optimizer memperbarui salinan master weight dalam fp32. Pada fp16, loss scale menjaga gradient kecil agar tidak terbulatkan menjadi nol.
Hampir semua model besar sekarang dilatih dengan cara ini. Perkalian matriks 16-bit berjalan di tensor core GPU dengan laju berkali-kali lipat fp32, dan aktivasi 16-bit memangkas separuh memori yang harus disimpan backward pass. Framework menyediakannya sebagai satu sakelar: autocast dan GradScaler di PyTorch, atau pengaturan bf16 di DeepSpeed dan Megatron-LM. Ide yang sama berlaku untuk training fp8 di GPU terbaru.
Ide utama
- Mixed precision menjalankan hitungan matriks di fp16 atau bf16, sedangkan master weight dan state optimizer tetap di fp32.
- Training dengan Adam butuh sekitar 16 byte per parameter dalam mixed precision, sama dengan fp32 biasa; penghematan memorinya datang dari aktivasi.
- Rentang normal fp16 berakhir di 2^−14 pada sisi bawah dan 65.504 pada sisi atas, jadi gradient kecil terbulatkan ke nol kalau tidak dibantu.
- Loss scaling mengalikan loss dengan pangkat dari 2 sebelum backward dan membagi gradient dengan angka itu sesudahnya.
- Update yang lebih kecil dari separuh jarak fp16 hilang, karena itu optimizer memperbarui salinan weight dalam fp32.
- bf16 mempertahankan rentang eksponen fp32 dengan bit mantisa lebih sedikit, jadi bisa dilatih tanpa loss scaling.
Ulasan singkat tentang topik ini
Pertanyaan umum
Sebaiknya training dengan fp16 atau bf16?
Pakai bf16 jika perangkat kerasnya mendukung, termasuk GPU NVIDIA sejak A100 dan TPU Google. Format ini tidak butuh loss scaling dan jarang overflow, jadi run lebih sederhana dan stabil. fp16 tetap jadi pilihan di GPU lama seperti V100 dan T4, yang tidak punya tensor core bf16.
Apakah bf16 lebih cepat daripada fp16?
Di GPU yang mendukung keduanya, seperti A100 dan H100, bf16 dan fp16 berjalan pada laju tensor core yang sama dan sama-sama memakai 2 byte per nilai, jadi perkalian matriks sama cepatnya. Run bf16 bisa sedikit lebih cepat secara keseluruhan karena melewati loss scaling dan tidak pernah kehilangan langkah akibat gradient yang overflow. Di GPU lama tanpa tensor core bf16, seperti V100 dan T4, bf16 jauh lebih lambat daripada fp16 atau sama sekali tidak didukung.
Untuk inference, pakai bf16 atau fp16?
Pakai format yang dipakai saat model dilatih, yang untuk sebagian besar LLM terbaru adalah bf16. fp16 punya 10 bit mantisa, sedangkan bf16 punya 7, jadi lebih presisi. Namun nilai terbesarnya 65.504, dan sebagian model yang dilatih dengan bf16 menghasilkan aktivasi di atas angka itu, lalu mengembalikan inf atau NaN saat dijalankan di fp16. Jika perangkat keras tidak mendukung bf16, fp16 biasanya bisa dipakai untuk model yang dilatih dengan format itu, dan quantization int8 atau 4-bit menghemat memori lebih banyak daripada keduanya.
Apakah mixed precision menurunkan akurasi model?
Dengan loss scaling dan master weight fp32, Micikevicius et al. menyamai akurasi fp32 pada model gambar, suara, terjemahan, dan bahasa. Sebagian besar model besar sesudahnya dilatih dengan mixed precision tanpa laporan penurunan. Masalah biasanya muncul sebagai lonjakan loss atau NaN, yang menandakan overflow atau operasi yang seharusnya tetap di fp32.
Apa penyebab loss NaN saat training fp16?
Aktivasi atau gradient di atas 65.504 menjadi inf, dan inf berubah menjadi NaN lewat operasi seperti inf − inf atau 0 × inf. Dynamic loss scaling menangkap overflow di gradient, tetapi tidak di forward pass. Perbaikan yang umum: menjaga softmax dan normalisasi tetap di fp32, menurunkan learning rate, atau beralih ke bf16.
Apa itu TF32?
TF32 adalah mode tensor core di GPU A100 dan yang lebih baru. Mode ini membaca input fp32, membulatkannya ke 10 bit mantisa dengan 8 bit eksponen fp32, lalu mengakumulasi dalam fp32. Kode tetap melihat tensor fp32 biasa, jadi training fp32 menjadi lebih cepat tanpa perubahan lain. Mode ini lebih lambat daripada bf16, karena setiap nilai tetap memakai 4 byte di memori dan laju puncaknya separuh.
Penjelasan terkait
- Quantization · Mengecilkan weight model menjadi 8 dan 4 bit
- Backpropagation · Cara network belajar dari kesalahannya
- Optimizer · SGD, momentum, dan Adam: gradient descent yang lebih cerdas
- Vanishing dan Exploding Gradient · Kenapa deep network sulit dilatih dan cara mengatasinya
- KV Cache · Kenapa LLM menyimpan key dan value di cache, dan berapa biayanya
- Mixture of Experts · Mengirim tiap token ke beberapa expert dalam model yang jauh lebih besar
Referensi
- Micikevicius et al. (2017), "Mixed Precision Training"
- Rajbhandari et al. (2019), "ZeRO: Memory Optimizations Toward Training Trillion Parameter Models"
- Kalamkar et al. (2019), "A Study of BFLOAT16 for Deep Learning Training"
- Korthikanti et al. (2022), "Reducing Activation Recomputation in Large Transformer Models"
- Micikevicius et al. (2022), "FP8 Formats for Deep Learning"
Terakhir diperbarui