Show HN: Kemungkinan meningkatkan kecepatan inferensi LLM 2x (Speeding up LLM inference 2x times (possibly))
(asciinema.org)Apa itu Effort?
- Effort adalah energi, waktu, dan sumber daya yang dicurahkan untuk menyelesaikan suatu pekerjaan atau mencapai tujuan
- Ini berarti usaha dan jerih payah yang diperlukan untuk mengatasi hambatan atau memperoleh hasil yang diinginkan
- Effort bisa bersifat fisik maupun mental
- Usaha fisik seperti energi yang digunakan untuk mengangkat benda berat atau berlari maraton
- Usaha mental seperti konsentrasi dan daya pikir yang diperlukan untuk memecahkan masalah kompleks atau mempelajari keterampilan baru
- Merupakan elemen kunci untuk meraih keberhasilan di berbagai bidang kehidupan, seperti pertumbuhan pribadi, pekerjaan, dan pendidikan
Opini GN⁺
- Effort bukan sekadar jumlah waktu atau energi yang dicurahkan, tetapi konsep yang dipengaruhi oleh berbagai faktor seperti keberlanjutan, fokus, dan motivasi. Karena itu, bekerja keras tidak selalu menjamin keberhasilan
- Terutama pada pekerjaan yang menuntut Effort mental, perlu berhati-hati agar tidak mengalami burn out. Penting untuk menemukan cara mempertahankan Effort melalui istirahat dan penghargaan yang tepat
- Cara setiap orang mencurahkan Effort bisa berbeda. Ada yang mampu fokus secara intensif dalam jangka pendek, ada pula yang bisa mencurahkan Effort secara konsisten dalam jangka panjang. Menemukan cara yang paling sesuai untuk diri sendiri adalah pendekatan yang efektif
1 komentar
Komentar Hacker News
Inti algoritmanya tampaknya adalah memangkas parameter saat eksekusi, lalu di dalam setiap grup menentukan bobot yang kurang penting berdasarkan peringkat nilai absolut bobot yang akan dipangkas, menjadikannya 0, sehingga membuat matriks bobot menjadi sparse
Jika mencari pemangkasan model, ada banyak hasil, dan https://arxiv.org/abs/2305.11627 juga membahas “pemangkasan berbasis magnitudo” sebagai baseline serta mengutip https://arxiv.org/pdf/2301.00774.pdf
Saya kurang suka cara makalah-makalah mengimplementasikan baseline secara asal lalu membanggakan metode sendiri, atau membungkusnya dengan banyak istilah matematika. Tulisan blog di artikel asli menyampaikan metodenya jauh lebih mudah bahkan bagi orang yang hampir tidak punya pengetahuan latar belakang
Pendekatan dalam makalah yang disebutkan tampaknya bersifat statis, dan sepertinya tidak menyajikan algoritma yang benar-benar mempercepat komputasi dengan hasil 20–50%. Itu adalah sebagian besar dari bagian yang sulit. Suatu saat saya ingin meluangkan waktu untuk menelusuri literatur terkait dengan benar
Pada akhirnya saya ingin menambahkan halaman sitasi bersama makalah-makalah yang orang-orang unggah di komentar. Saya rasa tidak lama lagi seseorang mungkin akan menemukan tulisan yang sudah merangkum algoritma ini
Selama pengembangan saya juga bertanya ke gpt-4 dan mencari di Google, tetapi yang saya temukan umumnya bersifat statis atau menghapus seluruh dimensi/layer secara acak lalu melakukan pelatihan ulang. Saya tidak menemukan sesuatu yang persis cocok dengan ide ini
Semakin padat dan sulit dipahami sebuah tulisan, semakin besar kemungkinan ia menyembunyikan sains yang lemah di dalamnya
Saya suka kalimat di bagian implementasi GPU ini
“Pembaca yang baru mengenal pemrograman GPU sekarang mungkin bertanya - bagaimana ini bisa bekerja?
Pembaca yang berpengalaman dalam pemrograman GPU mungkin bertanya - bagaimana mungkin ini bisa bekerja?”
Akan bagus kalau seseorang yang benar-benar paham Metal bisa meninjau kode ini. Ini adalah percobaan pemrograman GPU pertama saya
“Balik matriksnya, urutkan elemen per baris, lalu lihat kembali perkalian dari arah itu. Orang-orang pintar menyebut ini format compressed sparse row (CSR). Sekarang untuk melakukan perkalian, ambil nilai 1 dari vektor, kalikan dengan 256, lalu tambahkan ke baris ke-3 pada vektor keluaran, dan seterusnya. Sekarang mari lihat apa yang terjadi jika kita memotong kolom terakhir yang berisi nilai terendah.”
Saya penasaran bagaimana CSR berinteraksi dengan cara mengurangi jumlah perkalian
Metode ini terlihat mirip dengan sparsity semiterstruktur, yang disebut sparsity 2:4, jadi layak dibandingkan secara eksplisit. Dari yang saya lihat sekilas, teknik ini dioptimalkan untuk Apple Silicon, memberikan kecepatan sekitar 2x pada sparsity 75%, bersifat dinamis dan diterapkan saat runtime bergantung pada input, serta memungkinkan pemilihan tingkat sparsity
Sebaliknya, sparsity semiterstruktur 2:4 dioptimalkan untuk GPU yang memiliki sparse tensor core, yaitu Nvidia Ampere dan setelahnya, memberikan kecepatan sekitar 2x pada sparsity 50%, bersifat statis dan diterapkan pada status model yang tersimpan, dan pada sparsity 50% kemungkinan hasilnya lebih buruk daripada teknik ini
Perbandingan yang ingin saya lihat adalah hasil sparsity semiterstruktur pada sparsity 50% dengan peningkatan kecepatan 2x, dibandingkan dengan teknik ini pada sparsity 75% dengan peningkatan kecepatan 2x
Saya memilih Apple Silicon karena mudah dikembangkan. Ada kemungkinan algoritma ini juga berkinerja baik di arsitektur lain
Sebagai orang yang pernah memakai CSR, ini tidak mengejutkan. Di antara format yang lebih baru, mungkin ada yang lebih sesuai dengan karakteristik perangkat keras, seperti block ELL
Format seperti itu menghindari pembacaan yang tidak tergabung atau gather, tetapi kodenya menjadi lebih rumit
bucketMul hampir tidak memiliki pembacaan yang tidak tergabung, dan memakai struktur data yang berbeda dari CSR biasa. Dijelaskan di sini: https://kolinko.github.io/effort/bucketmul.html
Setiap baris matriks dibagi menjadi 16 bagian, lalu dipilih bagian mana yang harus dibaca. Penulisannya sepenuhnya linear
Namun saya tidak yakin apakah yang saya katakan sekarang masuk akal. Hari ini sudah agak larut dan harinya panjang
Ide bagus dan tulisan yang bagus. Saya juga menangani bidang sparsity dalam inferensi jaringan saraf, dan ada beberapa hal yang terpikir yang bagus untuk diketahui
Dibandingkan dengan implementasi perkalian matriks-vektor yang padat, algoritme ini menambah kompleksitas algoritmik tetapi mengurangi lalu lintas memori. Perkalian matriks-vektor biasanya mengalami bottleneck memori, jadi mengurangi akses memori akan meningkatkan throughput. Namun, begitu ukuran batch lebih besar dari 1, akses memori kemungkinan besar tidak lagi menjadi bottleneck, sehingga peningkatan kecepatannya bisa hilang dengan sangat cepat
Sebagai pembanding, saya ingin melihat bukan hanya model yang sama, tetapi juga model lain dengan arsitektur yang 2x lebih cepat. Misalnya, saya penasaran bagaimana hasilnya ketika metode ini diterapkan pada LLM 13B parameter dengan sparsity 50% dibandingkan dengan LLM 7B parameter, dan dibandingkan dengan LLM yang sama yang dikuantisasi ke setengah bit-width acuan. Jika dalam waktu yang sama ia bisa menghasilkan keluaran dengan fidelity lebih tinggi daripada framework inferensi yang ada, sepertinya ini bisa menjadi makalah yang menarik
Karena perkalian dilewati, galat aproksimasi kemungkinan besar selalu bias ke arah nilai absolut yang lebih kecil daripada hasil sebenarnya. Jika bisa menambahkan term koreksi untuk mengompensasi galat sistematis itu, performanya tampaknya bisa sedikit lebih baik
Notasi Big-O memang tidak terlalu cocok untuk pekerjaan GPU, tetapi dalam kasus ini kira-kira tepat
Masalah utamanya adalah batasan arsitektur GPU. Algoritme ini membutuhkan lebih banyak register/threadgroup/memori cache dibandingkan cara tradisional, dan itulah bottleneck utamanya. Selain itu, karena semua perkalian memakai bucket yang berbeda, memparalelkan pekerjaan tidak sesederhana model MoE
Untuk arsitektur yang lebih besar, saya banyak mengujinya pada Mixtral, yang pada dasarnya model 13B, dan menurut saya ia bertahan jauh lebih baik di sana. Kecepatan inferensi terhadap effort tetap terjaga, dan kualitas terhadap effort masih menghasilkan keluaran yang layak dibaca sampai 12–16%, bukan 20–25%. Pengujiannya terbatas, dan saat memasukkan implementasi Mistral saya merusak implementasi Mixtral, jadi belum ada data yang pasti, tetapi saya akan segera memperbaikinya
Secara intuitif, menurut saya semakin besar modelnya, semakin banyak effort yang bisa dipangkas
Awalnya saya juga menduga bahwa melewati perkalian akan menimbulkan bias, tetapi bertentangan dengan intuisi, ternyata tidak begitu. Ada beberapa chart, tetapi belum siap untuk dipublikasikan
Karena nilai-nilai matriks tersebar merata antara positif dan negatif, setelah ambang tertentu drift pada nilai hasil tidak besar
Terlihat hebat. Namun latensi 15ms mirip dengan 16,7ms pada sinkronisasi vertikal 60Hz
Jika layar diperbarui setiap token, bisa jadi ada sinkronisasi yang terjadi di suatu tempat
Namun terima kasih atas idenya. Saya akan menganggapnya sebagai kontribusi komunitas pertama :D
Kontribusi yang benar-benar keren dan terbuka. Saya akan memperhatikan apakah llama.cpp mengimplementasikan ini
Saya sedang mencari cara mempercepat inferensi CPU, dan saya sangat menyukai ide effort ini
Namanya diusulkan oleh chatgpt. Karena ia bilang tidak mengenali pendekatan ini, mungkin saja ini benar-benar baru
Saya ingin menghubungi llama.cpp dan proyek-proyek lain, dan berharap ini diimplementasikan. Saya juga sempat mempertimbangkan menulis patch untuk llama sendiri, tetapi C++ dan skala proyek itu terasa terlalu berat bagi saya
Inferensi CPU juga akan menjadi lebih cepat dengan cara yang sama. Selain itu, karena hanya sebagian bobot yang bisa dimuat—misalnya melewati yang kurang penting dan hanya memuat 70%—model bisa dijalankan dengan VRAM lebih kecil daripada sebelumnya. Namun implementasi Q8 masih diperlukan
Menariknya, ketika saya mencoba membandingkan benchmark dengan llama.cpp, saya tidak bisa menemukan kecepatan 7B/FP16 di MB Air 16GB. Itu karena dengan cara biasa memang tidak mungkin dijalankan. Dengan Effort, bisa
Demikian pula, saya menjalankan Mixtral resolusi penuh tetapi dipangkas pada M2 96GB. Biasanya membutuhkan RAM 114GB, tetapi karena hanya memuat 75% bobot, ia berjalan mulus. Sekarang implementasinya agak rusak dan menghasilkan output sampah, jadi perlu diperbaiki
Tulisan yang bagus. Saya benar-benar penasaran bagaimana performa per VRAM dibandingkan dengan kuantisasi sederhana
Saya juga penasaran apakah ada rencana mengimplementasikan versi lintas platform
Tentu saja bobot bisa dimuat lebih sedikit, tetapi kalau bobot dikurangi lebih dari 20–30%, kualitas tampaknya cepat memburuk
Dengan kata lain, algoritme ini memisahkan waktu inferensi dari penggunaan VRAM
Meski begitu, saya juga penasaran apakah dengan effort, Q8 yang dipangkas menjadi 75% bisa memberikan hasil lebih baik daripada Q6
Namun sepertinya masih perlu beberapa minggu sampai implementasinya cukup rapi untuk diuji dengan benar
Cara ini tidak melakukan retraining, tetapi saya penasaran apakah jika pendekatan seperti ini dipakai bersama kuantisasi lalu dilakukan pelatihan tambahan setelahnya, sebagian kualitas yang hilang bisa dipulihkan
Senang melihat hal seperti ini, dan menyenangkan bisa membayangkan sejauh apa performa dan biaya dapat membaik ke depannya. Terima kasih sudah mengembangkannya sebagai open source
Salah satunya adalah post-training sesudahnya, dan yang lain adalah quantization-aware training, yaitu melakukan kuantisasi selama pelatihan tetapi tetap mempertahankan nilai aktivasi dan gradien dalam presisi penuh