Weight Folding, Stream CUDA, dan Bug yang Membuat Model Saya Berbicara Terbalik — Filip Makraduli

AAI Engineer
Computing/SoftwareInternet Technology

Transcript

00:00:00.
00:00:13Halo semuanya, terima kasih sudah datang dan
00:00:18saya akan mulai presentasinya sekarang. Jadi,
00:00:22presentasi ini membahas tentang sebuah makalah
00:00:27yang saya buat, yang sangat sederhana.
00:00:33Gagasannya sangat jelas.
00:00:36Ini pada dasarnya adalah dua baris
00:00:39aljabar yang membuat lapisan RMS norm
00:00:42dalam transformer menjadi lebih murah,
00:00:45lebih cepat, dan meningkatkan kinerjanya
00:00:48sebagai sebuah lapisan dalam arsitektur
00:00:51transformer. Mirip dengan bagaimana
00:00:54layer norm dulunya menjadi standar
00:00:57lalu digantikan oleh RMS norm.
00:01:00Hal ini mengikuti cara berpikir yang sama.
00:01:04Dan saya mendapat kesempatan untuk bertemu
00:01:09beberapa orang dari dunia sumber terbuka
00:01:11dan saya ikut menulis makalah ini
00:01:14bersama Nils Graf yang merupakan
00:01:17pencipta dari hal ini.
00:01:21Dan pekerjaannya berlanjut dari sana.
00:01:23Jadi ini dipublikasikan di arXiv.
00:01:26Anda bisa melihatnya, membacanya, dan mencobanya.
00:01:29Ada repositorinya juga.
00:01:31Dan konsepnya, katakanlah ide
00:01:36serta cara berpikirnya, paling mudah
00:01:38dijelaskan mungkin dengan flash attention.
00:01:40Jadi dengan cara yang mirip seperti flash attention
00:01:45menunggu hingga ada perkalian
00:01:48dan mencoba membatasi komunikasi
00:01:52antar memori agar seluruh proses
00:01:54menjadi lebih cepat.
00:01:55Ini memiliki pemikiran yang mirip dengan hal tersebut.
00:01:58Dan ini melakukan peningkatan tertentu
00:02:01yang membuat proses RMS norm menjadi jauh lebih cepat
00:02:08dan pada akhirnya meningkatkan keseluruhan transformer.
00:02:15Dan pertanyaannya adalah, mengapa RMS norm?
00:02:19Padahal lapisan itu hampir tidak melakukan perhitungan matematika.
00:02:24Dan itu benar.
00:02:26Jadi porsi dari bagian matematika tersebut
00:02:29jika Anda lihat sebenarnya cukup kecil.
00:02:31Namun, waktu jam atau waktu proses (wall time),
00:02:34seperti yang mereka katakan, cukup besar.
00:02:36Dan contohnya, dalam satu langkah dekode,
00:02:40jadi tepat saat inferensi dilakukan,
00:02:43RMS norm bisa dimulai hingga 33 kali.
00:02:47Tentu saja, itu tergantung pada modelnya dan sebagainya.
00:02:50Di dalam makalah, Anda bisa melihat model spesifiknya
00:02:52dan bagaimana hal ini diuji.
00:02:54Dan pertanyaannya adalah bagaimana hal ini dapat ditingkatkan
00:02:59serta bagaimana bobot untuk perkalian matriks ini
00:03:03dapat dihindari.
00:03:06Dan alasan mengapa ini lambat
00:03:09bukan karena GPU lambat atau buruk dalam matematika,
00:03:15tetapi mereka buruk dalam segala hal di sekitar matematika aktual.
00:03:20Artinya, memulai pekerjaan, pekerjaan yang sebenarnya.
00:03:24Jadi sebagai contoh, memulai proses seperti yang terjadi
00:03:30dalam beberapa eksperimen sebanyak 33 kali,
00:03:32itu membutuhkan waktu yang lama.
00:03:35Dan misalnya, menggabungkan setiap normalisasi
00:03:40ke dalam perkalian matriks dapat membantu menghindari hal ini.
00:03:44Selain itu, melakukan pelipatan bobot (weight folding)
00:03:46dapat membantu dalam pemindahan data antar memori
00:03:50dan itu adalah proses yang juga lambat bagi GPU.
00:03:54Dan juga penundaan (waiting).
00:03:56Jadi contohnya, menunda pembagian
00:04:00yang dilakukan pada lapisan RMS norm
00:04:02juga merupakan cara untuk menghindari langkah penundaan ini.
00:04:06Jadi pada dasarnya apa yang dilakukan makalah ini
00:04:09adalah meningkatkan ketiga aspek ini
00:04:13dengan melakukan beberapa trik aljabar
00:04:16dalam cara RMS norm dihitung.
00:04:19Begitu saja.
00:04:21Dan dari segi matematika, inilah trik-triknya.
00:04:25Ini terutama berkisar pada dua proposisi pertama.
00:04:29Yang pertama adalah normalisasi tanpa bobot.
00:04:31Anda bisa melihatnya di sini.
00:04:33Dan normalisasi yang ditangguhkan.
00:04:35Jadi itu yang kedua.
00:04:37Dan sekarang pada arsitektur yang lebih baru,
00:04:39ada situasi di mana RMS bisa muncul dua kali.
00:04:44Sebagai contoh, pada Gemma 4 hal ini terjadi.
00:04:48Jadi pembatalan pra-normalisasi juga bisa dilakukan.
00:04:52Dan semua ini dibuktikan secara aljabar di dalam makalah.
00:04:58Dan proposisi pertama adalah ini
00:05:00di mana penguatan dan pelipatan bobot
00:05:04terlipat menjadi satu matriks.
00:05:06W yang bisa Anda lihat di sini dengan tanda bintang.
00:05:09Dan itu dihitung secara offline,
00:05:12mirip dengan bagaimana mungkin dalam flash attention
00:05:14Anda menghitung beberapa hal di samping
00:05:16sehingga tidak ada komunikasi
00:05:18antar memori sepanjang waktu.
00:05:20Jadi ini adalah satu langkah yang dilakukan,
00:05:24yaitu pelipatan bobot ini.
00:05:26Dan langkah lainnya adalah menunda pembagian skalar
00:05:32dari matmul sehingga dapat dilakukan secara paralel.
00:05:35Jadi dalam kasus normal, Anda harus menghitung sekali,
00:05:38lalu menunggu dan menghitung lagi.
00:05:41Dalam kasus ini, tujuannya adalah untuk membaginya
00:05:44sehingga dapat diparalelkan.
00:05:48Dan yang ketiga, yang merupakan semacam versi dari ini,
00:05:51adalah bahwa jika ada dua,
00:05:56karena ini bersifat invarian skala,
00:05:58salah satunya dapat dihilangkan dan ini tetap berfungsi.
00:06:01Dan ini dapat diterapkan pada model-model baru
00:06:04yang memiliki arsitektur dan implementasi seperti ini.
00:06:10Jadi agar hal ini bisa terwujud di dunia nyata,
00:06:13terutama proposisi nomor dua ini.
00:06:16Jadi untuk yang satu ini, misalnya, cukup mudah.
00:06:20Ada repositori bernama transformer tricks.
00:06:22Anda bisa menerapkannya ke model apa pun dan itu berhasil.
00:06:25Namun untuk melakukannya, diperlukan beberapa pekerjaan kernel.
00:06:29Sehingga tidak semudah itu untuk dilakukan.
00:06:31Jadi agar saya dapat melakukannya,
00:06:35saya mengimplementasikannya dan mendapati eksperimen ini suatu waktu.
00:06:42Jadi kelihatannya secara umum baik-baik saja di mana,
00:06:46oke, prompt-nya adalah arsitektur transformer,
00:06:48merevolusi NLP karena,
00:06:51dan kemudian ada semacam keluaran yang diharapkan.
00:06:54Tetapi pada keluaran yang saya dapatkan,
00:06:56saya melihat pengulangan ini dan jeda satu langkah.
00:06:59Seperti yang bisa Anda lihat di sini, kata karena muncul lagi.
00:07:01Dan ada sesuatu yang terjadi dengan alur kerja GPU
00:07:07dan saya mencoba mencari tahu apa yang sedang terjadi.
00:07:10Dan saya mendapati jeda satu langkah ini serta semacam keluaran
00:07:15yang berasal dari masa lalu.
00:07:18Dan dalam proses men-debug semua ini,
00:07:21saya menyadari bahwa dalam proses membangun sesuatu seperti ini.
00:07:26Jadi seperti yang saya jelaskan pada proposisi atau penundaan operasi ini,
00:07:32dalam CUDA, Anda dapat melakukan dua hal.
00:07:35Anda dapat menggunakan tensor core yang melakukan satu bagian dari perkalian matriks
00:07:39dan Anda dapat menggunakan CUDA core yang menjalankan hal-hal seperti operasi tingkat elemen,
00:07:44reduksi, akar kuadrat, dan sebagainya.
00:07:47Jadi tujuannya adalah untuk melakukan ini secara paralel dan mendapatkan manfaat
00:07:52dari apa yang saya jelaskan dalam makalah untuk menguji konsep ini secara nyata.
00:07:58Jadi begini bentuk yang seharusnya.
00:08:00Jadi, jika Anda melakukannya secara berurutan,
00:08:03ada waktu tunggu kosong saat unit vektor menghitung RMS dan penskalaan,
00:08:10lalu ada perkalian matriks.
00:08:12Jadi gagasannya adalah, dengan flash norm, yang merupakan teknik dalam makalah ini,
00:08:16keduanya harus dilakukan secara paralel.
00:08:19Jadi unit matriks menghitung matmul dan unit vektor menghitung RMS.
00:08:23Dengan begitu Anda menghemat waktu.
00:08:26Namun, Anda tidak bisa begitu saja melakukannya dengan Python.
00:08:28Anda harus masuk ke tingkat yang lebih rendah.
00:08:30Dan saya melakukannya dengan kode CUDA seperti ini.
00:08:35Dan ini terlihat secara umum baik-baik saja pada saat itu.
00:08:42Namun, saya menyadari bahwa saya telah melakukan sedikit kesalahan.
00:08:47Dan kesalahannya adalah penggabungan di akhir tempat Anda seharusnya menggabungkan kedua aliran tersebut bersifat implisit dalam kasus saya.
00:08:57Dan ketika saya mengujinya, uji unit tersebut berhasil.
00:09:01Kualitasnya tampak serupa seperti pengujian perplexity dan sebagainya karena ini hanya seperti pembuatan yang mirip.
00:09:08Tetapi selama pembuatan yang panjang, saya dapat melihat masalah ini.
00:09:11Jadi saya tidak tahu apa ini sebenarnya.
00:09:14Dan alasannya adalah ketika saya melakukan penggabungan implisit ini, pada dasarnya salah satu aliran belum selesai bekerja.
00:09:24Sehingga saya mengalami kondisi balapan (race conditions) yang membaca data masa lalu dari perkalian matriks yang belum selesai.
00:09:31Jadi gagasan yang saya miliki untuk memperbaikinya adalah seputar fakta bahwa saya harus secara eksplisit melakukan penggabungan.
00:09:40Dan menunggu hingga salah satu operasi selesai sehingga saya yakin saat menggabungkannya saya tidak membaca dari masa lalu.
00:09:48Jadi itulah kesadaran yang didapat dalam eksplorasi aliran CUDA ini.
00:09:54Dan beginilah cara saya mengerjakannya.
00:09:57Jadi penggabungannya bersifat implisit.
00:10:00Sehingga pembacaan pasca-penskalaan bernilai seperti nilai penyangga lama.
00:10:06Dan cara ini diperbaiki adalah dengan hal ini di mana pada dasarnya Anda perlu menandai akhir dari perkalian matriks.
00:10:14Kemudian tandai akhir dari RMS.
00:10:17Dan kemudian pasca-penskalaan menunggu aliran pertama.
00:10:21Dan kemudian menunggu aliran kedua.
00:10:24Dan itu memperbaiki bug tersebut serta membuat makalah itu berhasil dan modelnya berbicara ke depan alih-alih ke belakang.
00:10:33Dan itu mungkin sudut pandang akademis yang keren.
00:10:38Tetapi saya juga ingin mencoba berbagai hal, kan?
00:10:40Menerapkan ini, mengujinya, melihat bagaimana saya bisa membuatnya bekerja dalam pengaturan yang mungkin lebih mendekati produksi.
00:10:47Dan Anda juga dapat membaca makalah tersebut dan melihat semua pengujiannya.
00:10:50Beberapa telah selesai, sebagian besar dilakukan di sekitar model llama, tetapi ini juga berfungsi untuk arsitektur lain.
00:10:56Jadi apa yang dapat Anda lakukan untuk makalah khusus ini adalah, misalnya, pelipatan bobot yang saya jelaskan, proposisi pertama, Anda dapat melakukannya dengan beberapa kode di repo.
00:11:10Itu seperti flash, Anda katakan flashify dan itu melakukannya.
00:11:13Namun, dengan hal kedua yang saya sebutkan, Anda perlu sedikit bekerja pada kernel jika ingin melakukannya.
00:11:19Seperti yang saya jelaskan dalam contoh saya.
00:11:22Dan ini adalah beberapa hasil yang didasarkan pada model llama dan ada berbagai jenis detail yang dapat Anda lihat juga.
00:11:29Seperti apa yang terjadi jika Anda hanya melakukan normalisasi tertunda, apa yang terjadi jika Anda melakukan kernel gabungan penuh.
00:11:36Jadi ada banyak eksperimen untuk masuk ke tingkat lebih rendah di sini guna menguji semua proposisi.
00:11:41Dan inilah hasil kami dalam tingkat pengamatan dan detail yang berbeda, katakanlah.
00:11:48Tetapi bahkan yang sederhana dengan pelipatan bobot menunjukkan beberapa peningkatan.
00:11:54Dan ini juga bekerja dengan alat sehari-hari yang Anda gunakan dalam sebuah model.
00:11:59Jadi rasanya Anda tidak harus menemukan kembali roda atau, tahu kan, melakukan semuanya dari awal.
00:12:05Jadi ini bekerja dengan torch compile karena ini seperti titik pemeriksaan (checkpoint) baru dan selesai.
00:12:13Flash attention melakukan trik serupa pada lapisan yang berbeda.
00:12:16Dan ini juga berfungsi dengan model terkuantisasi.
00:12:18Jadi sangat keren untuk benar-benar menerapkannya dan Anda bisa mendapatkan model yang memiliki lapisan normalisasi baru yang keren ini.
00:12:27Dan tempat di mana Anda bisa mendapatkan detail dan kode ini untuk benar-benar menjalankannya adalah repo transformer tricks ini.
00:12:34Jadi repositori ini memiliki trik aljabar yang berbeda seperti yang saya jelaskan serta makalah yang saya sebutkan.
00:12:41Dan ada juga GitHub, bukan GitHub, tetapi repo model HuggingFace tempat saya melakukan ini dengan beberapa model.
00:12:50Dan Anda dapat memiliki tautan HuggingFace ke model tersebut dan mengujinya.
00:12:54Dan apa yang juga dapat Anda lakukan dengan model HuggingFace ini adalah menerapkannya ke produksi.
00:13:00Jadi ketika saya berpikir untuk melakukan ini, saya menyadari bahwa, oke, sekarang katakanlah sainsnya selesai dan ada tautan ke model HuggingFace,
00:13:11mesin inferensi Superlink adalah cara yang keren untuk benar-benar menerapkan model HuggingFace apa pun.
00:13:19Dan kami telah melakukan ini di hackathon di mana orang-orang membawa model atau titik pemeriksaan HuggingFace kustom yang mereka miliki dengan materi fine-tune mereka.
00:13:27Dan Anda dapat menguji, bahkan jika Anda memiliki beberapa versi dari trik aljabar ini yang ingin Anda gunakan untuk meningkatkan model dan menguji ide penelitian Anda sendiri,
00:13:37Anda benar-benar dapat mencobanya dan memiliki versi yang diterapkan pada kluster model ini tanpa harus khawatir tentang kode perekat di sekitar penerapan model.
00:13:48Jadi itu cukup keren. Dan intinya adalah jika Anda memiliki kluster sumber terbuka penuh dan inferensi model bersumber terbuka,
00:13:58Anda benar-benar dapat menguji jenis ide penelitian yang mungkin lebih baru ini di mana jika Anda ingin melakukan manipulasi kernel atau flash norm dan hal-hal semacam itu,
00:14:12jauh lebih sulit untuk melakukannya di titik akhir sewaan di mana Anda tidak memiliki kendali atas inferensinya.
00:14:18Jadi, Anda menginginkan sesuatu yang portabel dan fleksibel untuk benar-benar memungkinkan Anda melakukan hal ini,
00:14:23tetapi juga cukup siap produksi sehingga Anda dapat menguji berbagai hal dalam skala besar.
00:14:27Dan Anda dapat, misalnya, menggunakan site untuk menggabungkan ini dengan model lain.
00:14:33Seperti yang dapat Anda lihat di kiri atas, Anda dapat memiliki model berstandar flash ini dengan model lain yang berbeda untuk melakukan tugas agen (agentic tasks) jika Anda mau,
00:14:43dan semacam melakukan kasus penggunaan yang lebih besar dari ujung ke ujung.
00:14:46Dan cara kerja site adalah kluster produksi ini membantu Anda menerapkan model.
00:14:52Jadi, Anda juga dapat melihat repo site untuk rincian lebih lanjut tentang hal ini.
00:14:57Dan juga ada mekanisme antrean yang lebih cerdas yang membantu Anda, terutama jika Anda bekerja dengan model yang lebih kecil,
00:15:03karena saat melakukan hal-hal flash norm, saya bekerja dengan, misalnya, model llama yang lebih kecil dan juga dengan agen kecil dari HuggingFace.
00:15:11Jadi memiliki cara untuk menerapkan model yang lebih kecil yang juga dapat bekerja pada, misalnya, GPU yang sama sehingga Anda tidak perlu menghabiskan uang untuk biaya GPU,
00:15:24tetapi benar-benar dapat mengganti model, terutama model yang lebih kecil, itu cukup berguna.
00:15:30Dan Anda juga dapat mengontrol konfigurasi model melalui API serta klusternya,
00:15:35yang juga sangat nyaman tanpa harus memiliki, misalnya, teknisi infrastruktur yang mendukung Anda dalam penelitian sumber terbuka Anda.
00:15:40Jadi itu juga keren.
00:15:43Dan Anda memiliki cloud Anda sendiri, yang berguna jika Anda menginginkan bobot terbuka, model terbuka, sumber terbuka.
00:15:50Dan ada juga, katalog yang dimiliki Cy dari berbagai model, bukan hanya yang saya sebutkan,
00:15:57tetapi Anda bisa melihatnya.
00:15:59Ada juga model penyusunan ulang peringkat dan penyematan (re-ranking embedding models) jika Anda sedang membangun sesuatu yang sejalan dengan itu.
00:16:03Dan dengan itu, saya mengakhiri kisah perjalanan penelitian saya di mana saya ikut menulis makalah tentang teknik yang meningkatkan transformer ini,
00:16:15tetapi juga menemukan cara untuk membawa ini ke, katakanlah, produksi dan mengujinya serta menemukan cara untuk bereksperimen dengan model sumber terbuka ini.
00:16:24Dan jangan ragu untuk menghubungi saya di LinkedIn, mungkin jika Anda memiliki pertanyaan atau kontribusi.
00:16:30Banyak dari hal-hal yang saya sebutkan ini, beberapa di antaranya adalah PR pada, misalnya, VLLM atau pada Hugging Face.
00:16:36Anda mungkin menemukannya di sekitar sana.
00:16:38Anda juga dapat melihat, memeriksa makalahnya.
00:16:40Itu adalah tautan arsip yang Anda miliki di sana.
00:16:43Dan Anda juga memiliki repo Cy dan LinkedIn saya.
00:16:47Jadi, terima kasih banyak telah hadir.
00:16:58Dan Anda dapat menemui saya untuk mengajukan pertanyaan.
00:16:59Kami akan berada di sini.
00:17:00Di dekat sini.
00:17:13anda

Key Takeaway

Optimalisasi aljabar dan pemrosesan paralel CUDA pada lapisan RMS norm mempercepat performa transformator secara keseluruhan.

Highlights

  • Makalah RMS norm baru mengurangi komunikasi memori dan mempercepat lapisan transformator melalui aljabar sederhana.

  • Lapisan RMS norm dapat dipanggil hingga 33 kali dalam satu langkah dekode pada inferensi model.

  • Kesalahan penggabungan aliran CUDA menyebabkan kondisi balapan dan membuat model berbicara terbalik.

  • Repositori transformer tricks menyediakan kode implementasi pelipatan bobot dan kernel paralel.

  • Mesin inferensi Superlink memungkinkan penerapan model sumber terbuka yang dimodifikasi secara portabel.

Timeline

Optimalisasi RMS Norm dalam Transformator

  • Makalah ini menyederhanakan lapisan RMS norm agar lebih murah dan cepat.
  • Pemanggilan RMS norm mencapai 33 kali dalam satu langkah dekode inferensi.
  • Pelipatan bobot dan penundaan pembagian menghindari pemindahan data memori yang lambat.

Gagasan utama berfokus pada peningkatan efisiensi lapisan RMS norm dengan cara yang mirip dengan flash attention. Proses matematika pada lapisan ini sebenarnya kecil, tetapi waktu proses wall time cukup besar karena frekuensi pemanggilannya yang tinggi. Tiga aspek utama ditingkatkan melalui trik aljabar, yaitu normalisasi tanpa bobot, normalisasi yang ditangguhkan, dan pembatalan pra-normalisasi.

Debug Aliran CUDA dan Masalah Model Berbicara Terbalik

  • Penggunaan tensor core dan CUDA core secara paralel menghemat waktu proses.
  • Penggabungan aliran implisit memicu kondisi balapan yang membaca data masa lalu.
  • Penandaan akhir matriks dan RMS secara eksplisit memperbaiki bug model.

Implementasi tingkat rendah memerlukan pemisahan tugas antara tensor core untuk perkalian matriks dan CUDA core untuk operasi elemen. Penggabungan aliran yang tidak disengaja menyebabkan pembacaan penyangga lama, sehingga model menghasilkan keluaran yang terbalik. Perbaikan dilakukan dengan menandai akhir masing-masing aliran secara eksplisit sebelum tahap pasca-penskalaan.

Penerapan Produksi dan Penggunaan Model Sumber Terbuka

  • Repositori transformer tricks menyediakan kode untuk pelipatan bobot.
  • Mesin inferensi Superlink mendukung pengujian model kustom dalam skala produksi.
  • Katalog Cy memuat berbagai model sumber terbuka untuk tugas agen dan penyematan.

Hasil penelitian dapat diuji menggunakan alat sehari-hari seperti torch compile dan model terkuantisasi. Penerapan model kustom ke dalam lingkungan produksi dipermudah melalui kluster sumber terbuka Cy dan mesin inferensi Superlink. Pendekatan ini memungkinkan fleksibilitas penuh dalam manipulasi kernel tanpa kendala pada titik akhir sewaan.

Community Posts

No posts yet. Be the first to write about this video!

Write about this video