Pelatihan dan penalaran model besar sering melibatkan konsep akurasi, dan ada banyak jenis, dan mereka juga dibagi menjadi format yang berbeda pada tingkat akurasi yang sama. Selain itu, ada juga konsep multi-presisi dan presisi campuran dalam skenario penggunaan praktis.
Presisi umum
Akurasi floating-point: presisi ganda (FP64), presisi tunggal (FP32, TF32), presisi setengah (FP16, BF16), akurasi 8-bit (FP8), akurasi 4-bit (FP4, NF4) Akurasi kuantifikasi: INT8, INT4 (juga INT3 / INT5 / INT6)
Bilangan floating-point terdiri dari tiga bagian: bit tanda, eksponensial, dan mantissa. Semakin besar bit eksponensial, semakin besar rentang angka yang dapat diwakili. Semakin besar digit mantissa, semakin tinggi akurasi angkanya.
Tabel meringkasnya sebagai berikut
| format | bit simbol | Bit eksponensial | Tempat desimal | Total digit | | FP64 | 1 | 11 | 52 | 64 | | FP32 | 1 | 8 | 23 | 32 | | TF32 | 1 | 8 | 10 | 19 | | BF16 | 1 | 8 | 7 | 16 | | FP16 | 1 | 5 | 10 | 16 | | FP8 E4M3 | 1 | 4 | 3 | 8 | | FP8 E5M2 | 1 | 5 | 2 | 8 | | FP4 | 1 | 2 | 1 | 4 |
FP32: Nomor floating-point 32-bit, 4 byte per data TF32: Nomor floating-point 19-bit, setiap data adalah 2 byte FP16: Nomor floating-point 16-bit, 2 byte per data BF16: Nomor floating-point 16-bit, setiap data adalah 2 byte Int8: bilangan bulat 8-bit, setiap data menyumbang 1 byte Int4: bilangan bulat 4-bit, setiap data adalah 0,5 byte
Mengapa begitu banyak presisi
Karena biaya dan akurasi. Kita semua tahu bahwa akurasi tinggi pasti lebih akurat, tetapi juga akan membawa biaya komputasi dan penyimpanan yang lebih tinggi. Presisi yang lebih rendah mengurangi akurasi perhitungan tetapi dapat meningkatkan efisiensi dan kinerja komputasi. Jadi berbagai presisi yang berbeda memungkinkan Anda memilih yang paling cocok dalam situasi yang berbeda. Presisi ganda lebih akurat daripada ekspresi presisi tunggal, tetapi membutuhkan penyimpanan dua kali lebih banyak dan membutuhkan lebih banyak waktu untuk menghitung.
Mengapa model besar perlu diukur?
1. Kurangi penggunaan memori Model besar biasanya menggunakan angka floating-point 32-bit (FP32) atau angka floating-point 16-bit (FP16) untuk mewakili bobot dan nilai aktivasi. Dengan mengkuantifikasi, nilai presisi tinggi ini dapat diubah menjadi representasi presisi yang lebih rendah (misalnya, bilangan bulat 8-bit, INT8), secara signifikan mengurangi ruang penyimpanan model. Ini penting untuk penerapan pada perangkat dengan sumber daya terbatas seperti perangkat seluler, sistem tertanam, dll.
2. Mempercepat kecepatan penalaran Model terkuantisasi dapat berjalan lebih efisien pada perangkat keras. Banyak perangkat keras modern (seperti GPU, TPU, NPU, dll.) memiliki dukungan pengoptimalan khusus untuk komputasi presisi rendah, memungkinkan operasi kuantisasi yang lebih cepat. Selain itu, perhitungan presisi rendah seringkali melibatkan lebih sedikit operasi bit, mengurangi kompleksitas komputasi dan dengan demikian mempercepat inferensi.
3. Kurangi konsumsi daya Model terkuantisasi tidak hanya mengurangi kebutuhan akan sumber daya komputasi tetapi juga mengurangi konsumsi daya. Ini sangat penting untuk perangkat bertenaga baterai seperti smartphone, perangkat IoT, dll., di mana konsumsi daya rendah berarti masa pakai baterai yang lebih lama.
4. Perangkat edge yang mudah digunakan Banyak model besar awalnya dilatih dan diterapkan di cloud, tetapi dengan perkembangan komputasi edge, semakin banyak skenario aplikasi yang memerlukan model untuk diterapkan di perangkat edge. Dengan daya komputasi dan sumber daya penyimpanan yang terbatas pada perangkat edge, kuantisasi dapat membantu model ini berjalan lebih efisien pada perangkat edge.
5. Kurangi kebutuhan bandwidth Dalam proses inferensi terdistribusi atau pembaruan model, kuantisasi dapat mengurangi bandwidth yang diperlukan untuk transfer model. Ini berguna untuk lingkungan dengan bandwidth jaringan terbatas, seperti perangkat IoT di area terpencil.
6. Pertahankan kinerja model Meskipun kuantisasi memperkenalkan kehilangan presisi tertentu, kinerja asli model sebagian besar dapat dipertahankan melalui metode kuantisasi yang tepat (seperti kuantisasi presisi campuran, kuantisasi pasca-pelatihan, pelatihan persepsi kuantitatif, dll.). Oleh karena itu, dalam aplikasi praktis, kuantifikasi dapat mencapai keseimbangan yang baik antara kinerja dan efisiensi.
Referensi memori
| jenis | Setiap miliar parameter perlu menempati memori | | mengapung32 | 4G | | FP16 / BF16 | 2G | | int8 | 1G | | int4 | 0.5G |
FP64 (Presisi Ganda)
Floating-point 64-bit, biasanya format floating-point biner presisi ganda yang ditentukan oleh IEEE 754, memiliki:
Simbol 1 digit Indeks 11 digit 52 tempat desimal
Rentang: ~ 2.23e-308 ... ~ 1.80e308 dengan presisi desimal 15-17 penuh.
Penggunaan:
Format ini digunakan untuk perhitungan ilmiah yang membutuhkan presisi tinggi. Ini biasanya tidak digunakan untuk komputasi pembelajaran mendalam. Dukungan perangkat lunak: Mewakili tipe ganda pada sebagian besar sistem C/C++. Didukung di TensorFlow (misalnya tf.float64) / PyTorch (misalnya torch.float64 atau torch.double). Dukungan perangkat keras: Biasanya didukung di CPU x86. Sebagian besar GPU, terutama GPU gaming, termasuk seri RTX, sangat terbatas dalam kinerja FP64 (biasanya 1/32 kinerja FP32, bukan 1/2). GPU yang didukung FP64 tanpa batas baru-baru ini termasuk GP100/100/102/104 di Tesla P40/P4 dan Quadro GP100, GV100 di Tesla V100/Quadro GV100/Titan V, dan GA100 yang baru-baru ini diumumkan di A100 (menariknya, arsitektur Ampere baru memiliki generasi ketiga) dibandingkan dengan Tensor Cores yang mendukung FP64 Pemrosesan FP64 baru yang sesuai dengan IEEE sekarang disertakan, yang memberikan kinerja FP64 2,5x lipat dari V100.
FP32 (Akurasi Penuh)
Format ini telah lama menjadi pekerja keras untuk pembelajaran mendalam. Format IEEE 754 lainnya, floating-point presisi tunggal memiliki:
Simbol 1 digit Indeks 8 digit 23 tempat desimal Idealnya, pelatihan dan inferensi harus dilakukan di FP32, tetapi FP32 dua kali lebih lambat dari FP16/BF16, sehingga metode presisi campuran sering digunakan dalam praktik, di mana bobot FP32 digunakan sebagai "bobot induk" yang tepat, bobot FP16/BF16 digunakan untuk perhitungan propagasi maju dan mundur untuk meningkatkan kecepatan latihan, dan akhirnya bobot berdaulat FP32 diperbarui dengan gradien FP16/BF16 dalam fase pembaruan gradien.
Selama latihan, bobot berdaulat selalu FP32. Dalam praktiknya, bobot setengah presisi sering memberikan akurasi yang sama dengan FP32 saat inferensi - karena bobot FP32 yang tepat hanya diperlukan saat gradien model diperbarui. Ini berarti bahwa kita dapat menggunakan bobot setengah presisi saat inferensi, sehingga kita bisa mendapatkan hasil yang sama hanya dengan setengah memori GPU.
Rentang: ~1.18e-38 ... ~3.40e38 dengan akurasi 6-9 desimal signifikan.
Penggunaan:
Jenis standar komputasi jaringan saraf untuk waktu yang lama. Bobot, aktivasi, dan nilai lain dalam jaringan saraf telah lama default ke FP32. Untuk banyak perhitungan ilmiah, terutama yang berulang, akurasinya tidak cukup, yang menyebabkan akumulasi kesalahan. Dukungan perangkat lunak: Mewakili jenis float pada sebagian besar sistem C/C++. Didukung di TensorFlow (misalnya tf.float32) / PyTorch (misalnya torch.float32 atau torch.float). Dukungan perangkat keras: Biasanya didukung di CPU x86. Biasanya didukung oleh NVIDIA/AMD GPU.
FP16 (Setengah Akurasi)
Demikian pula, format standar IEEE 754, format floating-point setengah presisi memiliki:
Simbol 1 digit Indeks 5 digit 10 tempat desimal Nomor FP16 memiliki rentang numerik yang jauh lebih rendah daripada FP32. Oleh karena itu, FP16 berisiko meluap (bila digunakan untuk mewakili angka yang sangat besar) dan underflow (bila digunakan untuk mewakili angka yang sangat kecil). Misalnya, ketika Anda melakukan 10k * 10k, hasil akhirnya harus 100M, yang tidak dapat diwakili oleh FP16 karena jumlah maksimum yang dapat diwakili FP16 adalah 64k. Jadi Anda berakhir dengan NaN (Bukan Angka) dalam perhitungan jaringan saraf, karena perhitungan dilakukan dalam urutan berlapis dan batch, jadi begitu NaN muncul, semua perhitungan sebelumnya dihancurkan. Secara umum, ini dapat dikurangi dengan penskalaan kerugian, tetapi pendekatan ini tidak selalu berhasil.
Rentang: ~5.96e−8 (6.10e−5) ... 65504, dengan akurasi 4 digit desimal yang signifikan.
Penggunaan:
Pembelajaran mendalam cenderung menggunakan FP16 alih-alih FP32, karena komputasi presisi rendah tampaknya tidak penting untuk jaringan saraf. Presisi ekstra tidak melakukan apa-apa, dan pada saat yang sama lebih lambat, membutuhkan lebih banyak memori dan memperlambat komunikasi. Dapat digunakan untuk pelatihan, biasanya menggunakan pelatihan presisi campuran (TensorFlow/PyTorch). Dapat digunakan untuk kuantisasi pasca-pelatihan untuk mempercepat inferensi (TensorFlow Lite). Format lain yang digunakan untuk kuantisasi pasca-pelatihan termasuk bilangan bulat INT8 (bilangan bulat 8-bit), INT4 (4-bit), dan bahkan INT1 (nilai biner). Dukungan perangkat lunak: Saat ini tidak dalam standar C/C++ (tetapi ada proposal float singkat). Beberapa sistem C/C++ mendukung jenis __fp16. Jika tidak, dapat digunakan dengan perpustakaan khusus. Didukung di TensorFlow (misalnya tf.float16) / PyTorch (misalnya torch.float16 atau torch.half). Dukungan perangkat keras: CPU x86 tidak didukung (sebagai jenis unik). Dukungan pada GPU gaming lama buruk (kinerja 32/1 untuk FP64, lihat posting tentang GPU untuk lebih jelasnya). Saat ini didukung dengan baik pada GPU modern, seperti seri NVIDIA RTX.
BFLOAT16 (Setengah Presisi)
Format 16-bit lain yang awalnya dikembangkan oleh Google disebut "Brain Floating Point Format", atau disingkat "bfloat16". Namanya berasal dari Google Brain.
IEEE FP16 asli dirancang tanpa mempertimbangkan aplikasi pembelajaran mendalam, dan rentang dinamisnya terlalu sempit. BFLOAT16 memecahkan masalah ini, memberikan rentang dinamis yang sama dengan FP32.
Oleh karena itu, BFLOAT16 memiliki:
Simbol 1 digit Indeks 8 digit 7 tempat desimal
Format bfloat16 dipotong ke IEEE 754 FP32, memungkinkan konversi cepat ke dan dari IEEE 754 FP32. Saat mengonversi ke format bfloat16, bit eksponensial dipertahankan, sedangkan bidang mantissa dapat dikurangi dengan pemotongan.
Rentang: ~1.18e-38 ... ~3.40e38 dengan 3 tempat desimal yang signifikan. Penggunaan:
Sekarang tampaknya menggantikan FP16. Tidak seperti FP16, yang seringkali membutuhkan pemrosesan khusus melalui teknik seperti loss scaling, BF16 hampir merupakan pengganti langsung untuk FP32 saat berlatih dan menjalankan jaringan saraf dalam. Dukungan perangkat lunak: Tidak dalam standar C/C++. Dapat digunakan dengan perpustakaan khusus. Didukung di TensorFlow (misalnya tf.bfloat16) / PyTorch (misalnya obor.bfloat16).
TF32
TensorFloat-32 atau TF32 adalah mode matematika baru di GPU NVIDIA A100.
Menggunakan mantissas 10-bit yang sama dengan matematika half-precision (FP16), TF32 terbukti memiliki ruang kepala yang cukup untuk memenuhi persyaratan presisi beban kerja AI. Dan TF32 menggunakan indeks 8-bit yang sama dengan FP32, sehingga dapat mendukung rentang numerik yang sama.
Secara teknis, ini adalah format 19-bit. Anggap saja sebagai BFLOAT16 presisi yang diperpanjang, seperti "BFLOAT19" atau penurunan presisi seperti FP32.
Jadi, TF32 memiliki:
Simbol 1 digit Indeks 8 digit 10 tempat desimal Keuntungan dari TF32 adalah memiliki format yang sama dengan FP32. Saat menghitung produk bagian dalam dengan TF32, mantissa operan input dibulatkan dari 23 hingga 10 bit. Operan pembulatan dikalikan dengan tepat dan terakumulasi dalam FP32 normal.
TF32 Tensor Core berjalan pada input FP32 dan menghasilkan hasil di FP32 tanpa perubahan kode. Operasi non-matriks terus menggunakan FP32. Ini memberikan cara mudah untuk mempercepat data input/output FP32 dalam kerangka kerja pembelajaran mendalam dan HPC.
Rentang: ~1.18e-38 ... ~3.40e38 dengan akurasi 4 tempat desimal yang signifikan. Penggunaan:
Salah satu hal hebat tentang TF32 adalah hanya membutuhkan dukungan kompiler pada tingkat terdalam, yaitu di dalam kompiler CUDA. Sisa kode hanya melihat FP32 dengan presisi yang lebih sedikit, tetapi jangkauan dinamis yang sama. Menggunakan TF32 terutama untuk melakukan panggilan ke perpustakaan untuk menunjukkan apakah itu berfungsi dengan baik. Kehadiran TF32 memungkinkan plug-in cepat, memanfaatkan kecepatan Tensor Cores tanpa banyak pekerjaan. Format seperti FP16 dan BFLOAT16 memerlukan lebih banyak penyesuaian karena melibatkan tata letak bit yang berbeda. Tetapi menggunakan format ini mengurangi bandwidth memori, memungkinkan eksekusi yang lebih cepat. Sebagai perbandingan, kinerja puncak A100 adalah:
FP32 tanpa inti tensor: 19.5 TFLOPS Inti Tensor TF32: 156 TFLOPS (jadi menggunakan TF32 alih-alih FP32 memudahkan untuk meningkatkan kecepatan). Inti Tensor FP16/BF16: 312 TFLOPS (oleh karena itu, peralihan yang masuk akal ke FP16/BF16 dapat membawa lebih banyak perolehan kecepatan, tetapi dengan biaya yang lebih tinggi). Dukungan perangkat lunak: Tidak dalam standar C/C++. CUDA 11 didukung. Dukungan perangkat keras: GPU: NVIDIA A100 adalah model pertama yang didukung
FP8
Diperkenalkan oleh GPU H100, ini memungkinkan perkalian dan konvolusi matriks yang lebih besar, tetapi dengan presisi yang lebih rendah.
Tipe data FP100 yang didukung oleh H8 sebenarnya adalah 2 tipe data berbeda yang dapat digunakan untuk berbagai bagian pelatihan jaringan saraf:
E4M3 - terdiri dari 1 bit simbolis, 4 bit eksponensial, dan 3 tempat desimal. Itu dapat menyimpan hingga +/- 448 dan nan. E5M2 - terdiri dari 1 bit tanda, 5 bit eksponensial, dan 2 tempat desimal. Itu dapat menyimpan nilai hingga +/-57344, +/-inf, dan nan. Trade-off dari peningkatan rentang dinamis adalah bahwa nilai yang disimpan kurang akurat.
Struktur tipe data floating-point. Semua nilai yang ditampilkan (dalam FP16, BF16, FP8 E4M3, dan FP8 E5M2) adalah representasi terdekat dari nilai 0.3952.
Kedua jenis tersebut dapat digunakan selama pelatihan jaringan saraf. Secara umum, aktivasi maju dan bobot membutuhkan presisi yang lebih tinggi, jadi yang terbaik adalah menggunakan tipe data E4M3 selama umpan maju. Namun, dalam propagasi balik, gradien yang mengalir melalui jaringan umumnya kurang rentan terhadap hilangnya presisi tetapi membutuhkan rentang dinamis yang lebih tinggi. Oleh karena itu, yang terbaik adalah menyimpannya menggunakan format data E5M2. H100 TensorCore mendukung kombinasi semua jenis ini sebagai input, memungkinkan kami untuk menyimpan setiap tensor dengan presisi yang disukai.
Referensi:
Login hyperlink terlihat.
Login hyperlink terlihat. |