Bagaimana kami membangun model bahasa besar (LLM) generasi berikutnya DeepL dengan FP8 untuk melatih dan inferensi.

Ketika DeepL menerapkan sistem NVIDIA DGX SuperPOD kami yang saat ini dilengkapi dengan 544 GPU NVIDIA H100 Tensor Core, kami tidak hanya mendapatkan peningkatan signifikan dalam daya komputasi. H100 juga memperkenalkan dukungan asli untuk tipe data bilangan floating point 8-bit (FP8) melalui generasi baru Tensor Cores, yang memungkinkan GPU untuk melakukan perkalian matriks dan operasi tensor lainnya dengan presisi FP8. Dengan melakukan perkalian matriks dalam format FP8, kita dapat meningkatkan throughput saat melatih dan menerapkan Model Bahasa Besar (LLMs) kita, karena sebagian besar perhitungan yang terlibat dalam LLMs modern berbentuk perkalian matriks.

Peralihan perhitungan dari presisi 16-bit ke 8-bit memiliki dampak besar dalam pengembangan model bahasa besar (LLM) generasi berikutnya DeepL. Hal ini memungkinkan kami untuk membangun model AI bahasa yang jauh lebih besar, dengan jumlah parameter yang jauh lebih banyak, yang menghasilkan perbaikan signifikan dalam kualitas saat dievaluasi oleh ahli bahasa, namun tetap dalam jendela latensi yang sama untuk inferensi produksi. Ini berarti terjemahan yang outperform model-model sebelumnya kami sebesar 1,4 kali untuk bahasa-bahasa Eropa dan 1,7 kali untuk pasangan bahasa yang lebih kompleks seperti Inggris dan Jepang, namun tetap memberikan hasil dengan efektif dan cepat. Hal ini juga berarti bahwa model kami dapat menangani jumlah permintaan yang lebih besar di berbagai fitur dan fungsi, tanpa mengorbankan pengalaman pengguna.

Dengan kata lain, melatih dan inferensi FP8 telah memainkan peran sentral dalam pengembangan AIBahasa DeepL.

Dalam posting ini, kami ingin menjelaskan perjalanan yang telah kami tempuh untuk menerapkan FP8 dalam melatih dan inferensi, berbagi beberapa alat dan teknik yang mendasari kesuksesan ini, serta memberikan gambaran tentang hasil yang kami hasilkan dalam istilah kinerja melatih dan inferensi sepanjang proses tersebut. 

Apa perbedaan antara format BF16 dan FP8?

Penjelasan sederhana tentang perbedaan antara BFloat16 (BF16) dan FP8 adalah bahwa FP8 menggunakan setengah jumlah bit untuk mewakili nilai-nilai. Secara efektif, BF16 menggunakan 16 posisi yang tersedia dalam dua byte masing-masing berukuran 8 bit. FP8 hanya menggunakan satu byte. 

Jumlah bit yang tersedia menentukan tingkat presisi dengan cara menerapkan elemen mantissa dan eksponen pada bilangan floating-point dalam notasi ilmiah. BF16 memiliki 1 bit tanda, 8 bit untuk eksponen, dan 7 bit untuk mantissa. FP8 memiliki setengah jumlah bit yang dapat digunakan, dengan 1 bit tanda dan 7 bit yang dibagi antara eksponen dan mantissa. Karena itu, ia memiliki jangkauan yang lebih kecil dan presisi yang lebih rendah dibandingkan dengan BF16. Hal ini dapat mewakili rentang yang lebih sempit dan jumlah yang lebih sedikit dalam rentang tersebut.

Sebagai contoh, misalkan kita ingin mewakili usia Bumi dalam miliar tahun (sekitar 4,543). Dalam BF16, kita dapat mewakili ini secara tepat sebagai 0100000010010001.  

Bagaimana dengan mewakili angka tersebut dalam FP8? Sebenarnya ada dua format FP8 yang dapat dipilih: E4M3 dan E5M2. Huruf dan angka di sini mewakili cara distribusi bit antara eksponen (E) dan mantissa (M). Semakin banyak bit yang Anda alokasikan untuk eksponen, semakin besar rentang angka yang dapat Anda gambarkan, dan semakin banyak bit yang Anda alokasikan untuk mantissa, semakin banyak angka yang dapat Anda gambarkan dalam rentang tersebut. 

Terlepas dari format FP8 mana yang Anda pilih, sebenarnya tidak mungkin untuk mewakili angka 4.543 secara tepat. Jika Anda memilih E4M3 dengan presisi yang relatif lebih tinggi, Anda dapat mendapatkan hasil terdekat (4,5). Di E5M2, jarak terdekat yang bisa dicapai adalah 5.

Di sisi lain, kekurangan jangkauan dan presisi ini, FP8 memungkinkan perhitungan yang lebih cepat dan membutuhkan memori yang jauh lebih sedikit dibandingkan dengan BF16. Hal ini sangat berharga untuk inferensi, dan dengan pendekatan yang tepat, hal ini juga dapat sangat berharga untuk mempercepat proses melatih. Intinya, ini menyangkut pertanyaan seberapa besar jangkauan dan ketepatan yang sebenarnya dibutuhkan dalam melatih LLM. Apakah Anda perlu menentukan usia Bumi dengan tepat? Atau apakah mendekati 43 juta tahun sudah cukup dekat? Jika Anda tertarik pada alam semesta secara keseluruhan, Anda mungkin akan puas dengan tingkat presisi kedua itu. Kesalahan pembulatan pada akhirnya hanya mewakili sekitar 0,3% dari usia alam semesta.

Perjalanan DeepL membuktikan bahwa FP8 mampu memenuhi persyaratan yang diperlukan untuk pelatihan LLM berkualitas tinggi, dan hal ini telah membuka peluang baru dalam hal apa yang dapat kita melatih pada model-model kita, serta bagaimana kita menerapkan mereka dalam praktik.

Melatih awal untuk model bahasa besar DeepL

Perjalanan yang kita tempuh dengan melatih dan inferensi FP8 dimulai dengan pra-pelatihan model bahasa besar (LLMs) kita. Setelah pra-pelatihan, kami melatih model pada tugas-tugas tertentu, mengompres model besar menjadi model yang lebih kecil, melakukan pembelajaran penguatan, dan menerapkan serangkaian strategi paralelisasi agar dapat memanfaatkan jumlah GPU yang sangat besar yang kami miliki.

Menggunakan format FP8 untuk melatih presisi campuran

Kami telah beralih dari kode pelatihan yang ada dari BF16 ke FP8 menggunakan NVIDIA Transformer Engine: perpustakaan pelatihan yang disediakan oleh NVIDIA untuk mempercepat model transformer, dan mendukung FP8. Transformer Engine menyediakan komponen-komponen penting yang memfasilitasi melatih dengan presisi campuran, mengelola konversi antara format FP8 dan BF16 secara mulus, serta menangani faktor skala.

Kami menggunakan pengaturan default Transformer Engine, seperti yang direkomendasikan oleh NVIDIA, dengan menggunakan E4M3 pada tahap forward pass untuk melatih, dan kemudian menggunakan E5M2 pada tahap backward pass. Ini berarti secara efektif kita menggunakan format dengan presisi lebih tinggi untuk memprediksi distribusi probabilitas token berikutnya, dan kemudian format dengan presisi lebih rendah tetapi rentang yang lebih luas untuk menghitung gradien yang diperlukan untuk memperbarui model, ketika presisi tidak terlalu penting. Kami menggunakan masing-masing dari dua format tersebut untuk tugas yang paling sesuai dengan format tersebut.

Pada grafik di bawah ini, kami telah menampilkan semua angka yang dapat diwakili dengan format E4M3. Seperti yang Anda lihat, angka-angka tersebut terkonsentrasi di sekitar nol, dengan nilai maksimum kurang dari 500. Sebenarnya, jumlah nilai yang dapat direpresentasikan untuk format FP8 dapat dicantumkan dalam tabel yang sangat singkat. Kunci untuk membuat format ini efektif dalam melatih adalah memahami distribusi nilai-nilai tersebut dan bekerja sesuai dengan distribusi tersebut. 

Hal ini melibatkan penyimpanan faktor skala tambahan bersama dengan tensor bobot FP8 untuk mengatasi rentang yang terbatas dan mencegah overflow dan underflow. Saat melakukan perhitungan dengan tensor presisi rendah Anda, Anda juga harus mempertimbangkan faktor skala. Misalnya, saat mengalikan dua tensor, Anda menggunakan rumus: (A_fp8 * A_scale) x (B_fp8 * B_scale), di mana A_fp8 dan B_fp8 adalah tensor 8-bit dan skala-skala tersebut adalah skalar 32-bit. Perangkat keras mendukung operasi-operasi ini.

FP8 vs BF16 untuk kinerja melatih

Ketika kita membicarakan kinerja melatih, kita mengacu pada seberapa cepat suatu model dapat dilatih berdasarkan daya komputasi yang tersedia untuknya. Untuk membandingkan kinerja pelatihan antara FP8 dan BF16, kami melihat pemanfaatan Model FLOPS (MFU), yang merupakan jumlah operasi bilangan floating-point per detik (FLOPS) yang dilakukan oleh model, sebagai persentase dari FLOPS yang secara teknis mungkin dilakukan dengan hardware yang tersedia.

Untuk perbandingan kami, kami menggunakan jumlah FLOPS yang mungkin dengan format BF16 sebagai pembanding umum dalam perbandingan kami, meskipun secara teknis, jumlah FLOPS yang mungkin akan lebih besar ketika beralih ke FP8. Hal ini memungkinkan kami untuk mengukur peningkatan penggunaan daya pemrosesan yang tersedia yang menjadi mungkin ketika beralih dari BF16 ke FP8.

Seperti yang ditunjukkan pada grafik di bawah ini, efisiensi penggunaan daya komputasi yang tersedia saat melatih model kami meningkat dari 44,6% MFU menjadi 67% MFU dengan FP8, yang secara efektif mempercepat melatih model kami sebesar 50%.

Itu adalah peningkatan kinerja yang mengesankan, secara sendiri-sendiri. Untuk mencapai hal tersebut, kami bekerja sama dengan NVIDIA untuk mengoptimalkan penggunaan fitur Transformer Engine. Berdasarkan pengaturan melatih lain, kami berhasil meningkatkan kinerja melatih secara bertahap sebesar 25% selama 15 bulan, sehingga mencapai 80% MFU.

FP8 vs BF16 untuk kualitas melatih LLM

Peningkatan istilah pelatihan FP8 sangat mengesankan. Namun, output yang benar-benar kami pedulikan di DeepL adalah kualitas melatih. Bagaimana perbandingannya dengan melatih kualitas menggunakan presisi BF16?

Untuk memeriksa kualitas yang dihasilkan oleh FP8, kami melatih salah satu model kami dalam kedua format tersebut. Hal ini memungkinkan kami untuk membandingkan kerugian melatih dan kualitas hasil akhir. 

Kami melatih model 1,5 miliar parameter pada tiga triliun token, lalu membandingkan kualitas pelatihan FP8 dengan BF16. Ukuran utama di sini adalah kerugian melatih, yang mengacu pada kemampuan model untuk memprediksi token berikutnya.

Seperti yang dapat Anda lihat dari grafik di bawah ini, kami dapat mendeteksi keunggulan kecil BF16 dibandingkan FP8, seperti yang ditunjukkan oleh garis FP8 yang berada sedikit di atas garis BF16. Namun, perbedaan ini tertutupi oleh fluktuasi yang jauh lebih besar dalam kerugian melatih dari satu langkah ke langkah berikutnya yang terjadi pada kedua format, dan dalam kedua kasus, kita melihat perbaikan nyata dalam meminimalkan kerugian melatih seiring waktu.

Kualitas melatih downstream FP8 versus BF16

Kami kemudian melanjutkan untuk menguji kualitas yang dihasilkan oleh melatih FP8 versus BF16 dalam aplikasi praktis hilir.

Dalam hal ini, kami menguji bagaimana model tersebut berkinerja saat bekerja dengan bahasa Inggris dan Jerman. Kami membandingkan perplexity validasi, yang mengukur ketidakpastian yang dialami model saat memprediksi token berikutnya dalam urutan. Sekali lagi, diharapkan bahwa tingkat kebingungan akan berkurang seiring berjalannya waktu. Dalam skenario praktis ini, kami sebenarnya tidak menemukan penurunan kualitas saat melatih FP8 dibandingkan dengan BF16.

Hasil akhir dari peralihan dari BF16 ke FP8 adalah bahwa kami dapat melatih model kami lebih cepat, dengan kebutuhan memori yang lebih rendah, dan mencapai kualitas pelatihan yang sama, dengan penurunan yang minimal dalam hal kerugian pelatihan dan perplexity validasi yang sebanding. Hal ini pada dasarnya berarti bahwa DeepL mampu mengembangkan model yang lebih canggih, menangani tugas-tugas yang lebih kompleks, dengan memaksimalkan pemanfaatan daya komputasi. Hal ini memperluas cakupan apa yang dapat kita lakukan dengan melatih LLM secara signifikan.

Dari pelatihan FP8 hingga inferensi

Tahap berikutnya dalam perjalanan ini melibatkan persiapan LLMs untuk inferensi produksi. Di sini, beban kerja utama dalam hal dukungan ditangani oleh NVIDIA TensorRT-LLM, yang merupakan solusi NVIDIA untuk inferensi LLM terukur, dan yang mendukung FP8. Algoritma ini mengambil bobot model Anda dari proses melatih dan membangun mesin untuk mengoptimalkan operasi model agar semaksimal mungkin efisien dalam penggunaan komputasi, dengan menggunakan teknik optimasi seperti penggabungan kernel, kode C++/CUDA yang dioptimalkan, penyimpanan cache KV, dan pemrosesan batch berkelanjutan selama eksekusi. 

Manfaat FP8 untuk inferensi

Penarikan kesimpulan untuk LLMs selalu melibatkan interaksi antara throughput (jumlah token yang dapat diproses dalam suatu rentang waktu) dan latensi. Tidak perlu diragukan lagi bahwa memberikan pengalaman pelanggan terbaik melibatkan pengendalian latensi. Namun, throughput juga sangat penting bagi DeepL karena menentukan jumlah permintaan yang dapat kami tangani pada suatu waktu tertentu, dan oleh karena itu, cakupan apa yang dapat dilakukan model kami dalam praktiknya.

Tidak dapat dihindari bahwa, seiring dengan peningkatan throughput, latensi cenderung meningkat pula. Mengelompokkan beberapa permintaan memungkinkan throughput yang lebih tinggi, tetapi dengan biaya latensi yang lebih tinggi untuk setiap permintaan individual. Hal ini berpotensi mempengaruhi pengalaman pelanggan. Namun, kinerja inferensi FP8 dibandingkan dengan BF16 secara signifikan mengubah keseimbangan ini menjadi menguntungkan bagi kami.

Seperti yang ditunjukkan pada grafik di bawah ini, untuk sebagian besar ukuran batch, FP8 dapat menangani throughput dua kali lipat dengan tingkat latensi yang sama seperti BF16. Jika kita menyetel anggaran latensi spesifik yang setara dengan pengalaman optimal bagi pengguna kita, kita dapat melihat hal ini dalam praktiknya. Pada dasarnya, FP8 telah secara efektif menggandakan kapasitas efektif model bahasa besar (LLM) kami dalam istilah throughput. 

Dengan kata lain, perjalanan dari BF16 ke FP8 tidak hanya memungkinkan kami untuk mengembangkan model bahasa besar (LLMs) yang lebih kuat dan canggih untuk DeepL. Hal ini juga memastikan bahwa kami dapat menerapkan model bahasa besar (LLMs) secara efektif, untuk memberikan pengalaman pelanggan yang optimal dan memperluas dampak AI bahasa kami di dunia nyata. Kami dapat melatih model yang lebih besar dengan lebih cepat, yang kemudian dapat beroperasi dalam parameter latensi yang sama, sambil menangani dua kali lipat jumlah permintaan.

Apa selanjutnya? Kami baru saja menerapkan sistem NVIDIA DGX SuperPOD dengan sistem NVIDIA DGX GB200, yang memberikan peningkatan daya komputasi yang hampir eksponensial. Yang benar-benar menarik bagi kami adalah bahwa mesin ini akan memperkenalkan generasi baru Tensor Cores yang dapat secara native mendukung operasi tensor FP4 seperti perkalian matriks. Itulah saat perjalanan kita dimulai kembali. Sungguh menarik melihat apa yang dapat kita lakukan dengan satu byte saat melatih dan saat melakukan inferensi. Pantau terus halaman ini untuk melihat apa yang bisa dilakukan dengan setengah byte.


Tentang Penulis

Markus Schnös, Insinyur Riset HPC

Markus Schnös adalah Insinyur Riset HPC di DeepL, di mana ia fokus pada skalabilitas melatih dan inferensi model bahasa besar (LLM). Dia memiliki minat khusus dalam melatih terdistribusi dan perhitungan bilangan floating point presisi rendah.

www.linkedin.com/in/markus-schnoes-349300185

https://github.com/Marks101

Fabian Joswig, Insinyur Riset HPC

Fabian Joswig adalah Insinyur Riset Staf di DeepL, dengan latar belakang dalam pembelajaran mesin, komputasi kinerja tinggi, dan fisika partikel teoretis. Dia berfokus pada pengembangan skala model AI dan infrastruktur untuk penerjemah paling akurat di dunia.

https://www.linkedin.com/in/fabianjoswig/

https://github.com/fjosw

Share