- Attention çekirdeği, düşük context uzunluklarında performansı iyileştirmek için persistent biçimde yeniden düzenlendi
- fp16'da büyük context boyutlarında, softmax bölümündeki ptxas komut zamanlama sorunu nedeniyle performans düşüşü oluşuyor
- fp8'de çekirdek adına "cutlass" eklendiğinde yaklaşık 100 TFLOPS performans artışı gözlemleniyor
- Bu optimizasyonun, çekirdek adlandırması üzerinden çalışan hard-coded bir optimizasyon hilesi olduğu değerlendiriliyor
- Performans etkisi ve çalışma nedeni, NVIDIA ptxas iç uygulamasından kaynaklanan sıra dışı bir davranış
Özet: Persistent Attention çekirdeğinin yeniden düzenlenmesi ve "cutlass" adlandırma etkisi
Genel bakış
- Bu Pull Request, Triton'un attention çekirdeğini persistent attention yaklaşımıyla yeniden düzenliyor
- Ana amaç, düşük context uzunluğu aralığında performans optimizasyonu sağlamak
- Ancak fp16 türünde, context boyutu büyüdükçe softmax bölümündeki ptxas komut zamanlama sorunu nedeniyle performans düşüşü görülüyor
fp8'de "cutlass" adını kullanmanın etkisi
- fp8 modeli kullanıldığında, çekirdek adına "cutlass" eklemek yaklaşık 100 TFLOPS'a kadar performans artışı sağlayabiliyor
- Bunun nedeni, NVIDIA'nın ptxas (PTX assembler) aracının çekirdek adında "cutlass" geçtiğinde dahili olarak özel bir optimizasyon uygulaması
- Gerçek kodda dtype
float8e5 olduğunda çekirdek adı "cutlass_gluon_attention" gibi atanıyor
- ptxas disassembly analizi sonucunda, dahili kodda gerçekten
strstr(kernel_name, "cutlass") koşulunun bulunduğu görülüyor
Performans benchmark'ları
- Yeniden düzenleme öncesi ve sonrası benchmark verilerinde, persistent attention uygulanmadan öncekine kıyasla D=64'te göreli performans düşüşü gözlemleniyor
- Bunun nedeni softmax kısmındaki komut zamanlama problemi
- Ancak fp8 türü ile "cutlass" adlandırması birlikte kullanıldığında, belirli context ve boyutlarda belirgin biçimde daha yüksek throughput elde ediliyor
- Öne çıkan sonuçların özeti:
- Attention Z=4, H=32, D=64, causal=False:
- persistent uygulanmadan önce: triton-fp16 yaklaşık 383, triton-fp8 yaklaşık 413, cudnn-fp16 yaklaşık 565
- persistent uygulandıktan sonra: triton-fp16 yaklaşık 360, triton-fp8 yaklaşık 370
- Attention Z=4, H=32, D=128, causal=True:
- persistent uygulanmadan önce: triton-fp16 yaklaşık 312, triton-fp8 yaklaşık 345, cudnn-fp16 yaklaşık 553
- persistent uygulandıktan sonra: triton-fp16 yaklaşık 356, triton-fp8 yaklaşık 351
Adlandırma hilesinin keşfi ve analizi
- Çekirdek adında
"cutlass" dizgesi bulunduğunda, NVIDIA ptxas içinde deneysel bir optimizasyon rutinini etkinleştirdiği topluluk analizlerinde doğrulandı
- ptxas içinde ad eşleştirmesi için hard-coded mantık (
strstr(kernel_name, "cutlass")) bulunuyor
- Bu hile agresif ve deneysel bir optimizasyon olduğundan, çekirdeğin doğruluğunu etkileyip etkilemeyeceği donanıma ve koşullara göre değişebilir
Topluluk tartışması
- Birden fazla reviewer, performans karşılaştırmaları, doğruluk ve optimizasyon yöntemi hakkında soru ve analizler yaptı
- Deepseek technical report içeriği ve Hopper GPU gibi belirli mimarilerdeki farklar da tartışıldı
- Ad değişikliğiyle yapılan optimizasyonun ne kadar geniş çapta uygulandığı ve olası kararlılık sorunları da gündeme geldi
Sonuç ve çıkarımlar
- Yalnızca çekirdek adıyla bile donanım seviyesinde gerçek performans farkı oluşabilmesi oldukça sıra dışı bir durum
- NVIDIA yazılım yığınında (ptxas) gizli optimizasyon tetikleyicileri bulunduğunu göstermesi açısından, yapay zeka framework geliştirmede adlandırma kurallarının da performansı etkileyebileceğine işaret ediyor
- Pratikte bu tür hileler kullanılırken yeniden üretilebilirlik ve kararlılık mutlaka test edilmeli; donanım üreticisinin optimizasyon politikaları yakından izlenmeli
1 yorum
Hacker News yorumu
ptxastersine incelendiğinde, çekirdek adındacutlassgeçmesini algılayan mantığın hardcoded olduğu görülüyorNVIDIA'nın burada kararsız, deneysel ve agresif optimizasyonlar uyguladığını düşünüyorum; bu optimizasyon her zaman koşulsuz açılırsa sinsi hatalara yol açabilir diye değerlendirmiş olmalılar
GPU derleyicileri son derece zordur ve temel optimizasyonların ötesine geçmeye çalıştığınızda sonuçlar her zaman sorunlarla karışık olur
Bazı çekirdekler hızlanır, bazıları yavaşlar ve genel performansın artmasını sağlamak çok zordur
Tüm testlerde tek bir optimizasyonla performansın sürekli artması neredeyse hiç görülmez
Benim deneyimim Nvidia dışı GPU sistemleriyle ilgili ama bu durum bana çok tanıdık geliyor
Nvidia da muhtemelen bazı çekirdek kümelerinde harika, bazılarında ise berbat sonuçlar veren bir optimizasyon buldu ve bunu otomatik uygulamak için güvenilir bir ölçüt de bulamadı
Bu bağlamı açıkladığınız için teşekkürler
Bu alanın insanı değilim (bu projeyi de ilk kez duyuyorum), o yüzden başlıkla PR içeriği bana hiç mantıklı gelmiyordu
Bu bana 25 yıl önce ATI'nin (AMD) Quake III benchmark'ında, çalıştırılabilir dosya adı
quackolarak değiştirildiğinde performansın farklılaştığının ortaya çıkmasıyla hile yaparken yakalanmasını hatırlattıİlgili bağlantılar: techreport.com incelemesi, hardocp.com incelemesi, 3dcenter.de yazısı
Benim gibi yanlış anlamış olabilecekler için özet geçeyim
ATI,
quakeadlı çalıştırılabilir dosyayı algılayıp doku kalitesi gibi ayarları değiştirerek benchmark puanını yükseltiyorduİnsanlar dosya adını
quackyapınca görüntü kalitesinin arttığı ve puanın düştüğü görüldü; yani ATI sürücüsü performans için kaliteyi bilerek düşürüyorduYani dosya adını ATI değiştirmedi, kullanıcılar değiştirdi
Ya da Intel C++ Compiler'ın çıktıdaki
GenuineInteldizgesini kontrol etmesi meselesi vardıİlgili wiki bağlantısı burada
Bugün bile tüm satıcılar bunu yapıyor
Sürücü, popüler oyunların render döngüsüne müdahale edip hataları düzeltiyor, shader'ları daha optimize sürümlerle değiştiriyor ya da hızlı kod yollarını açıyor
Bu değişikliklerin çıktıya etkisinin asgari düzeyde olması gerekir ama bazı durumlarda fazla agresif davranılıp kalite ciddi biçimde düşebiliyor
Yani oyunlar kendi donanımlarında daha hızlı çalışsın diye kurcalıyorlar
Bu konunun daha derin tartışıldığı bir başlık var, buraya bakmanızı öneririm
İlginç şekilde o da aynı
cutlassoptimizasyonuyla ilgili eski bir gönderiBu tür örnekler çok yaygındır
Telefon yonga seti üreticileri benchmark'lar için hile yaptı (VW emisyonlarda, Nvidia 3DMark benchmark'ında, Intel de Xeon için SPEC benchmark'larında vb.)
Bilgisayar grafiklerinde ise sürücülerin her oyun için tweak, ayar ve workaround eklemesi artık neredeyse bir gelenek haline geldi
(Ne yazık ki bugünlerde düzgün kaynak bağlantıları çok sık kayboluyor, bu yüzden archive.org kullanmak gerekiyor. Bence bu tür anıları korumak önemli.)
Referanslar: Mediatek benchmark hilesi, Volkswagen emisyon skandalı, Nvidia 3DMark tartışması, Intel compiler'ın SPEC benchmark'ına etkisi
Derleyicilerle çalışan biri olarak, bu tür optimizasyonların bazen ada (schema, substring vb.) bağlı olduğunu söyleyebilirim
Hoşunuza gitmese bile pratikte bazen işler böyle yürüyor
Bu her zaman kötü niyetli değil; optimizasyonun yalnızca kendi kütüphanelerinde uygulanmasını sağlamak, her şeyi bozma riskine kıyasla daha güvenli bir tercih olabilir
Ya da frontend daha güvenilir bilgi (örneğin yapısal bilgi) veremediği için böyledir
Bence bu yaklaşım faydalı değil
Bana pek yeni gelmiyor
Yaklaşık 10 yıl önce belirli bir Webpack sürümünde
add.svgadlı bir dosya kullanınca build'in bozulduğunu hatırladımSonunda dosya adını
plus.svgyaparak çözmüştüknumpyde benzersecret.pyadlı bir dosya kullanıp farkında olmadannumpy'yi bozmuş olanlar varCommit mesajının dürüstçe yazılmış olması etkileyici
Bunun üzerine commit diff'inin nasıl düzenlendiğine dair eleştiri gelmişti
Birisi “bir şeyi yaklaşık 100 tflops hızlandırdım” yazıldığında bile çıkıp “commit mesajı kötü” diyorsa… o kişi muhtemelen John Carmack'in commit tarzından da hoşlanmaz
Ben şahsen bu kadar dürüst mesajları seviyorum
AI tarafından otomatik üretilmiş, durmadan
refactored Xbenzeri tekrarlar yapan commit mesajlarını görmekten çok daha iyiBence squash yapıp commit geçmişini birleştirmek daha iyi olurdu
GitHub'a koyarken neden squash yapılmadığını pek anlamıyorum
NVIDIA Jetson kullanmayı öğrendiğim zamanı hatırlattı
Tek bir komut çalıştırınca her şeyin hızlandığını öğrenmiştim (ilgili bağlantı)
Yazıya göre iki mod var: 5W ve 10W; 10W varsayılan olduğundan, aslında yalnızca varsayılandan 5W'a geçince “daha hızlı” ifadesi anlamlı olur gibi geldi, ben mi yanlış anladım diye soruyorum
Yüksek seviyeli dillerle (C++ vb.) aşırı derecede ayarlanmış kod yazıp aynı zamanda GPU assembly düzeyinde çok belirli sonuçlar beklediğinizde, derleyici bazen istediğinizi üretmez
Derleyici ekibine sorarsanız çeşitli çözümler önerebilirler ama açık kaynak kod söz konusuysa bunların çoğunu uygulamak zordur (örneğin özel
#pragma, intrinsic'ler vb.)Yüksek performanslı kütüphane geliştiren biri için, performans çıkmazsa ürünü sevk etmek bile mümkün olmaz
Böyle durumlarda fonksiyon adı gibi şeylerle belirli kod dönüşümlerini tetikleyen hileler kullanmak zorunda kalabilirsiniz
Bu tür optimizasyonlar gerçek dünyada yaygındır ve benchmark'ı kandırmak için görüntü kalitesini düşürmekle aynı seviyede görülmemelidir
Bu PR ilk açıldığında zaten tartışılmıştı
Yeni bir şey yokmuş gibi geliyor
Önceki tartışma
Kod paylaşımının kolay olduğu bir ekonomik yapı olmasını isterdim
Binary blob sürücüler, baseband'ler ve benzeri karmaşık yapılar yerine herkesin bilgiye kolayca erişebildiği, boşa harcanan zaman ve emeğin azaldığı bir dünya daha iyi olurdu
Sayısız yetenekli mühendis ve araştırmacı, birilerinin zaten elinde bulunan belgeleri, şemaları ve binary kodu reverse engineer edip çözmek için aylarını, yıllarını harcıyor
CUDA ve NVIDIA gibi şirketler bu açıdan gerçekten sinir bozucu
Masaüstü uygulamalar açısından bakıldığında kullanıcı başına ek maliyet neredeyse sıfıra iner
Bu yüzden yazılımın sürdürülebilir bir düzenli gelir modeline ihtiyacı vardır ama gelir kullanıcı sayısıyla orantılı biçimde sonsuza kadar artmamalıdır
Yeni kod geliştirmeye yatırım yapanların, ürün popüler olduğunda yatırımlarını geri alabilmesi gerekir ama mevcut crowdfunding modelleri bunu sağlayamaz
Kullanıcı sayısı arttıkça kişi başına katkı miktarı dramatik biçimde düşer; herkes %100, %10 hatta %1 katkı yapsa bile toplam yatırım astronomik olabilir
Sonuçta açık artırma benzeri bir pledge yapısı gerektiğini düşünüyorum
Bunun da sorunları var; özellikle tekelci ve tekelci olmayan modlar arasında geçiş çok sıkıntılı
Birkaç büyük şirket tüm geliştirme maliyetini üstlenip sonra kodu açık kaynak yaparsa, geri kalan bütün bireyler ve şirketler fiilen bedavacı olur