- Kernel attention direfaktorisasi ke bentuk persistent untuk meningkatkan performa pada panjang context yang pendek
- Pada fp16, untuk context besar, terjadi penurunan performa akibat masalah penjadwalan instruksi ptxas pada partisi softmax
- Pada fp8, jika nama kernel menyertakan "cutlass", teramati peningkatan performa sekitar 100 TFLOPS
- Optimasi ini dianalisis sebagai trik optimasi hardcoded melalui penamaan kernel
- Dampak performa dan penyebab perilakunya merupakan fenomena khusus akibat implementasi internal NVIDIA ptxas
Ringkasan: Refaktorisasi kernel Persistent Attention dan efek penamaan "cutlass"
Ikhtisar
- Pull Request ini berisi refaktorisasi kernel attention Triton ke pendekatan persistent attention
- Tujuan utamanya adalah memperoleh optimasi performa pada rentang context yang pendek
- Namun, pada tipe fp16, seiring membesarnya ukuran context, muncul penurunan performa akibat masalah penjadwalan instruksi ptxas di bagian softmax
Efek penggunaan nama "cutlass" pada fp8
- Saat memakai model fp8, menyertakan "cutlass" di nama kernel menghasilkan peningkatan performa hingga sekitar 100 TFLOPS
- Hal ini terjadi karena ptxas (assembler PTX) milik NVIDIA secara internal menerapkan optimasi khusus ketika nama kernel mengandung "cutlass"
- Dalam kode sebenarnya, ketika dtype adalah float8e5, nama kernel diatur menjadi "cutlass_gluon_attention" dan sejenisnya
- Hasil analisis disassembly ptxas menunjukkan bahwa memang ada kondisi
strstr(kernel_name, "cutlass") di kode internal
Benchmark performa
- Pada data benchmark sebelum dan sesudah refaktorisasi, teramati penurunan performa relatif pada D=64 dibandingkan sebelum penerapan persistent attention
- Ini disebabkan oleh masalah penjadwalan instruksi pada bagian softmax
- Namun, ketika tipe fp8 dikombinasikan dengan penamaan "cutlass", pada context dan ukuran tertentu tercatat throughput yang jauh lebih tinggi
- Ringkasan hasil representatif:
- Attention Z=4, H=32, D=64, causal=False:
- sebelum persistent: triton-fp16 sekitar 383, triton-fp8 sekitar 413, cudnn-fp16 sekitar 565
- sesudah persistent: triton-fp16 sekitar 360, triton-fp8 sekitar 370
- Attention Z=4, H=32, D=128, causal=True:
- sebelum persistent: triton-fp16 sekitar 312, triton-fp8 sekitar 345, cudnn-fp16 sekitar 553
- sesudah persistent: triton-fp16 sekitar 356, triton-fp8 sekitar 351
Penemuan dan analisis trik penamaan
- Jika string
"cutlass" disertakan dalam nama kernel, analisis komunitas mengonfirmasi bahwa rutin optimasi eksperimental di NVIDIA ptxas diaktifkan
- Di ptxas terdapat logika hardcoded untuk pencocokan nama (
strstr(kernel_name, "cutlass"))
- Trik ini merupakan optimasi agresif dan eksperimental, sehingga perubahan akurasi kernel dapat bervariasi tergantung perangkat keras dan situasi
Diskusi komunitas
- Beberapa reviewer mengajukan pertanyaan dan analisis terkait perbandingan performa, akurasi, dan metode optimasi
- Isi laporan teknis Deepseek, perbedaan pada arsitektur tertentu seperti GPU Hopper, dan sebagainya juga ikut dibahas
- Sejauh mana optimasi melalui perubahan nama ini diterapkan secara luas, serta isu stabilitasnya, juga turut diangkat
Kesimpulan dan implikasi
- Fakta bahwa hanya dari nama kernel saja dapat muncul perubahan performa nyata pada level perangkat keras adalah fenomena yang sangat tidak biasa
- Adanya trigger optimasi tersembunyi di stack software NVIDIA (ptxas) menyiratkan bahwa aturan penamaan juga bisa memengaruhi performa saat mengembangkan framework AI
- Dalam praktiknya, saat memakai trik ini, reproducibility dan stabilitas wajib diuji, dan kebijakan optimasi dari vendor hardware perlu terus dicermati
1 komentar
Komentar Hacker News
Jika
ptxasdibongkar, terlihat ada logika yang di-hardcode untuk mendeteksi nama kernelcutlassSaya menduga NVIDIA menerapkan optimisasi yang tidak stabil, eksperimental, dan agresif di sini; kalau optimisasi ini selalu dinyalakan tanpa syarat, bisa muncul bug yang rumit
Compiler GPU itu sangat sulit, dan begitu mencoba melangkah lebih jauh dari optimisasi dasar, hasilnya hampir selalu campuran antara manfaat dan masalah
Ada kernel yang jadi lebih cepat dan ada yang justru lebih lambat, dan sangat sulit berharap performa keseluruhan naik secara konsisten
Hampir tidak pernah ada satu optimisasi tunggal yang selalu meningkatkan kecepatan di seluruh rangkaian pengujian
Pengalaman saya memang di sistem GPU non-Nvidia, tetapi situasi ini terasa sangat familier
Mungkin Nvidia juga menemukan optimisasi yang memberi hasil luar biasa untuk sebagian kumpulan kernel, namun buruk untuk kumpulan lain, dan mereka tampaknya tidak menemukan kriteria andal untuk menerapkannya secara otomatis
Terima kasih atas konteks tambahannya
Saya bukan dari bidang ini (bahkan baru pertama kali mendengar proyek ini), jadi judul dan isi PR-nya sama sekali tidak masuk akal bagi saya
Ini mengingatkan saya pada kejadian 25 tahun lalu saat ATI (AMD) ketahuan memanipulasi benchmark Quake III karena performanya berubah ketika nama executable diganti menjadi
quackAda juga tautan terkait: ulasan techreport.com, ulasan hardocp.com, artikel 3dcenter.de
Kalau ada yang salah paham seperti saya, saya rangkum:
ATI mendeteksi nama executable
quakelalu mengubah kualitas tekstur dan hal lain untuk menaikkan skor benchmarkIni terungkap ketika orang-orang mengganti nama executable menjadi
quack, lalu kualitas gambar naik dan skornya turun; artinya driver ATI sengaja menurunkan kualitas demi menambah kecepatanJadi bukan ATI yang mengganti nama file, melainkan para pengguna
Atau isu Intel C++ Compiler yang memeriksa string
"GenuineIntel"di outputTautan wiki terkait ada di sini
Sampai hari ini semua vendor masih melakukan hal seperti ini
Driver mencegat rendering loop game populer untuk memperbaiki bug, mengganti shader dengan versi yang lebih optimal, atau membuka jalur kode yang lebih cepat, dan sebagainya
Perubahan seperti ini seharusnya hanya berdampak minimal pada hasil akhir, tetapi dalam beberapa kasus intervensinya terlalu agresif sampai kualitas turun drastis
Jadi mereka mengutak-atik agar game berjalan lebih cepat di hardware mereka sendiri
Ada thread yang membahas topik ini lebih dalam, jadi saya sarankan lihat di sini
Lucunya, itu juga tulisan lama tentang optimisasi
cutlassyang samaKasus seperti ini sangat umum
Pabrikan chipset ponsel pernah curang untuk benchmark (VW untuk emisi, Nvidia untuk benchmark 3DMark, Intel untuk benchmark SPEC pada Xeon, dan seterusnya)
Dalam grafis komputer, sekarang nyaris sudah jadi kebiasaan bahwa driver menyisipkan tweak, pengaturan, workaround, dan sejenisnya untuk tiap game
(Sayangnya sekarang terlalu sering tautan sumber yang layak hilang, jadi harus memakai archive.org. Menurut saya ingatan seperti ini memang perlu dipertahankan.)
Tautan referensi: kecurangan benchmark Mediatek, skandal manipulasi emisi Volkswagen, kontroversi Nvidia 3DMark, dampak compiler Intel pada benchmark SPEC
Dari sudut pandang orang yang bekerja dengan compiler, optimisasi seperti ini kadang memang bergantung pada nama (schema, substring, dan sebagainya)
Meski tidak ideal, dalam praktik memang begitu cara kerjanya
Tidak selalu berniat jahat; merancang agar optimisasi hanya diterapkan ke library sendiri bisa jadi pilihan yang lebih aman daripada berisiko merusak semuanya
Atau bisa juga karena frontend tidak mampu menyediakan informasi yang lebih bisa dipercaya (misalnya informasi struktural)
Saya rasa pendekatan seperti ini tidak membantu
Menurut saya ini tidak terlalu baru
Ini mengingatkan saya pada sekitar 10 tahun lalu, di versi tertentu Webpack build akan rusak jika memakai nama file
add.svgPada akhirnya saya menyelesaikannya dengan mengganti nama file menjadi
plus.svgnumpyjuga miripAda juga yang pernah tanpa sengaja merusak
numpyhanya karena menaruh file bernamasecret.pySaya terkesan dengan kejujuran commit message-nya
Ada kritik terhadap cara diff commit itu disusun
Ketika seseorang menulis “membuat sesuatu sekitar 100 tflops lebih cepat”, malah ada yang menilai “commit message-nya jelek”... kalau begitu saya rasa mereka juga akan tidak suka gaya commit John Carmack
Secara pribadi saya suka pesan yang sejujur ini
Jauh lebih baik daripada linimasa penuh commit message buatan AI yang berulang-ulang seperti
"refactored X"Menurut saya riwayat commit sebaiknya di-
squashSaya kurang paham kenapa tidak di-
squashsaat diunggah ke GitHubIni mengingatkan saya saat belajar memakai NVIDIA Jetson
Waktu itu saya sadar bahwa hanya dengan menjalankan satu perintah, semuanya bisa jadi lebih cepat (tautan terkait)
Kalau mengikuti artikelnya, ada dua mode yaitu 5W dan 10W, dan 10W adalah default, jadi justru bisa ditafsirkan bahwa “lebih cepat” hanya berlaku saat berpindah dari default ke 5W; atau mungkin saya salah paham?
Ada kalanya Anda menulis kode yang sangat dituning dalam bahasa tingkat tinggi (C++ dan sejenisnya), lalu mengharapkan hasil tertentu sampai level assembly GPU, tetapi compiler tidak mengeluarkan hasil seperti yang Anda inginkan
Jika bertanya ke tim komputer, mereka mungkin akan menawarkan berbagai solusi, tetapi untuk kode open source banyak di antaranya sulit diterapkan (misalnya
#pragmaproprietari, intrinsic, dan sebagainya)Dari sudut pandang pembuat library berkinerja tinggi, kalau performanya tidak keluar maka produk itu praktis tidak bisa dirilis
Dalam situasi seperti ini, tidak ada pilihan selain memakai trik seperti memicu transformasi kode tertentu lewat nama fungsi dan sebagainya
Optimisasi seperti ini umum dipakai di dunia nyata, dan menurut saya tidak setara dengan tindakan menurunkan kualitas gambar demi memanipulasi benchmark
Hal ini sudah dibahas saat PR ini pertama kali muncul
Rasanya tidak ada hal baru
Diskusi sebelumnya
Saya berharap ada struktur ekonomi yang memudahkan berbagi kode
Bukan driver binary blob, baseband, dan struktur rumit lain, melainkan situasi di mana semua orang bisa dengan mudah mendapat informasi sehingga waktu dan tenaga yang terbuang bisa dikurangi
Begitu banyak engineer dan peneliti hebat menghabiskan berbulan-bulan atau bertahun-tahun untuk merekayasa balik dan menguraikan dokumen, skematik, dan kode biner yang sebenarnya sudah dimiliki seseorang
CUDA dan perusahaan seperti NVIDIA terasa sangat membuat frustrasi
Untuk aplikasi desktop, biaya tambahan per pengguna nyaris mendekati nol
Karena itu perangkat lunak memerlukan struktur pendapatan berkala yang berkelanjutan, tetapi pendapatannya tidak boleh terus meningkat sebanding dengan jumlah pengguna
Orang-orang yang berinvestasi dalam pengembangan kode baru harus bisa mendapatkan kembali investasinya saat produk menjadi populer, tetapi crowdfunding yang ada sekarang tidak memenuhi struktur seperti ini
Semakin banyak pengguna, kontribusi per orang justru turun tajam; bahkan jika semua orang hanya menyumbang 100%, atau 10%, bahkan 1%, total investasi bisa menjadi sangat besar
Pada akhirnya menurut saya dibutuhkan model pledge berbasis lelang
Model ini juga punya masalah, dan yang paling merepotkan terutama adalah peralihan antara mode eksklusif dan non-eksklusif
Jika beberapa perusahaan besar menanggung seluruh biaya pengembangan lalu hasilnya dirilis sebagai open source, maka semua individu atau perusahaan lain pada dasarnya menjadi penumpang gratis