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
Community Posts
No posts yet. Be the first to write about this video!
Write about this video