AI PC'lerde yapay zeka performansı yetersiz: CPU, NPU'yu geride bırakıyor
(github.com/usefulsensors)- Microsoft Surface Pro 11th Edition'ın Qualcomm Arm tabanlı SoC'sinde yapılan NPU benchmark testinde, Windows AI PC'lerin öne çıkardığı hızlandırma performansından çok daha düşük bir işlem hacmi ölçüldü
- Test, Onnx Runtime ve Qualcomm QNN execution provider kullanılarak transformer ailesi modellerde maliyeti yüksek katmanlara benzer büyük MatMul işlemlerini çalıştıracak şekilde kurgulandı
- Örnek sonuçlarda CPU 821 Gigaops/s, NPU ise float giriş/çıkış kuantizasyon yapılandırmasında 225 Gigaops/s, 8-bit giriş/çıkışın da uygulandığı yapılandırmada 573 Gigaops/s değerine ulaştı
- NPU'nun 573 Gigaops/s sonucu, Microsoft Surface Pro 11th Edition pazarlama materyallerinde yer alan 45 Teraops/s değerinin %1,3'ü seviyesinde; aynı model Nvidia Geforce RTX 4080 Laptop GPU üzerinde çalıştırıldığında 3.2ms ve 2,160 Gigaops/s elde ediliyor
- Mevcut sonuçlar 2 Ekim 2024 itibarıyla geçerli; yazılım, framework ve sürücü düzeyindeki iyileştirmelerle gecikmenin düşmesi beklenebilir, ancak mevcut benchmark'ta CPU, NPU'dan daha hızlı
Surface'in Qualcomm NPU benchmark'ının amacı
- Microsoft, Qualcomm Arm tabanlı SoC içeren Surface tabletleri Windows AI PC olarak satıyor ve makine öğrenimi modellerini daha hızlı ve verimli çalıştırabildiğini öne sürüyor
- Useful Sensors, Qualcomm donanımı ve NPU'ya olumlu bakıyor ve kendi üçüncü taraf uygulamasını bu platforma taşımak için zaman ve kaynak ayırdı
- Harici geliştiricilerin hızlı sonuç almasına yardımcı olacak çok sayıda kod örneği veya benchmark bulunmadığından, fiilen gözlemlenen performans küçük ve bağımsız bir proje olarak paylaşıldı
- Ölçülen performans beklentinin belirgin biçimde altında kaldı; Android gibi başka platformlarda aynı donanımın etkili çalıştığı deneyimlendiği için, ileride uygulama, framework ve sürücü değişiklikleriyle iyileşme olasılığı açık bırakılıyor
Çalışma ortamı ve kurulum kısıtları
- Testlerde Windows üzerinde Python betikleri kullanıldı
- 2 Ekim 2024 itibarıyla Microsoft Store'daki Python, Arm mimarisini desteklemediğinden Qualcomm NPU erişimi için gerekli paketleri çalıştırmaya uygun değil
- Sonuçlarda Python 3.11.9 Arm64 kurulum dosyası kullanıldı
- Windows on Arm için önceden derlenmiş Onnx paketleri henüz bulunmadığından CMake ve Visual Studio derleyicisi gerekiyor
- CMake,
winget install cmakeile kuruluyor - Visual Studio olarak Visual Studio Community Edition kullanılıyor ve kurulum sırasında
Desktop C++ Developmentworkload'u seçiliyor
- CMake,
- Python paketleri depo klasöründe
py -m pip install -r requirements.txtkomutuyla kuruluyor- Onnx branch'i, resmi
pylauncher derleme düzeltmesinin Onnx 1.16'ya backport edildiği sürüm - Qualcomm Onnx Runtime, daha yeni Onnx sürümlerinde
Unsupported model IR versionhatası verdiği için bu kombinasyon kullanılıyor - Qualcomm Onnx Runtime paketi olarak nightly build kullanıldı
- Onnx branch'i, resmi
Benchmark'ı çalıştırma ve çıktıyı yorumlama
- Benchmark,
py benchmark_matmul.pyile çalıştırılıyor - Onnx Runtime ilk çalıştırma sırasında çok sayıda log üretiyor
- Örnek olarak,
Snapdragon(R) X 12-core X1E80100 @ 3.40 GHzçip modelinin tanınmadığını belirtencpuinfomesajı görülebiliyor - Grafiği sonlandırma ve tamamlanma aşamalarına ait log'lar da yazdırılıyor
- Örnek olarak,
- Gerçek benchmark sonuçları en sonda gösteriliyor
NPU quantized compute, float I/O accuracy difference is 0.0100NPU quantized compute and I/O accuracy difference is 0.0060CPU took 8.42ms, 821,141,860,688 ops per secondNPU (quantized compute, float I/O) took 30.63ms, 225,667,671,183 ops per secondNPU (quantized compute and I/O) took 12.05ms, 573,475,650,364 ops per second
- İlk iki satır, CPU ve NPU'nun sayısal sonuçlarının birbiriyle ne kadar uyumlu olduğunu gösteren doğruluk farkını ifade ediyor
- Son üç satır ise modelin baştan sona çalıştırılması için geçen gerçek süreyi ve bu gecikmeden hesaplanan saniye başına işlem miktarını gösteriyor
Ölçülen model ve kuantizasyon yöntemi
- Benchmark, OpenAI Whisper gibi transformer modellerde zaman alan katmanlara benzer 6 büyük matris çarpımını yeniden üretecek şekilde tasarlandı
- Giriş şekli
(6, 1500, 256) X (6, 256, 1500) - Sonuç şekli
(6, 1500, 1500) - Model, 2 giriş ve 1 çıkışa sahip tek bir
MatMuldüğümünden oluşuyor
- Giriş şekli
- Model, Onnx model framework'ü ile anlık olarak oluşturulup ardından Onnx Runtime'a veriliyor
- Referans model saf float sürümü ve yalnızca CPU'da çalışıyor
- NPU'nun verimli çalışabilmesi için ağırlıklı olarak kuantize model gerekiyor; float16 desteği sınırlı
- NPU için ilk yaklaşım, resmi ORT
quantize_static()metodunu kullanıyor- Kolaylık için giriş ve çıkış tensörleri 32-bit float olarak bırakılıyor
- Çalışma zamanı dönüşümleri grafiğin başında ve sonunda yapılıyor, geri kalan hesaplamalar 8-bit olarak yürütülüyor
- Bu yapılandırmada NPU'nun dönüşüm işlemleri çok yavaş kaldı ve
npu_quant_profile.csviçinde dönüşümlerin toplam sürenin %75'inden fazlasını aldığı görüldü - İkinci yaklaşım, 8-bit giriş ve çıkışa sahip eşdeğer model grafiğini programatik olarak oluşturuyor
- Bu
quantized compute and I/Oyöntemi, float I/O sürümünden genellikle yaklaşık 3 kat daha hızlı - Profillemede zamanın çoğu beklendiği gibi matris çarpımına harcanıyor
- Bu
Performans ölçümünde dikkate alınan değişkenler
- Compute bound olup olmadığını görmek için matris şekilleri daha kareye yakın seçildi
- Modern transformer modeller, eski convolution modellerinden farklı olarak büyük matris çarpımlarına dayanıyor
- Katmanlar matris-vektör çarpımına yaklaştıkça ağırlıkların yeniden kullanımı azalıyor ve DRAM'den veri çekmek darboğaz haline gelebiliyor
- tiny Whisper'ın orijinal matrislerinde
kboyutu 64'tü, ancak bu benchmark'ta SIMD optimizasyonu için daha fazla alan bırakmak adına 256'ya çıkarıldı
- Güç ayarları performansı artıracak şekilde yapılandırıldı
- Windows enerji ayarlarının tamamı
Best Performanceolarak tutulmaya çalışıldı - Benchmark, tablet prize bağlıyken çalıştırıldı
- Qualcomm Onnx Runtime'ın
htp_performance_modeoturum seçeneği, denemelerde toplam gecikmeyi en aza indirensustained_high_performanceolarak ayarlandı
- Windows enerji ayarlarının tamamı
- Model yapısı, yorumlamayı kolaylaştırmak için tek matris çarpımıyla sınırlandırıldı
- Birden fazla katman, convolution ve statik ağırlık da kullanılabilirdi; ancak LLM'lerde ve modern modellerde yaygın transformer yapısını yansıtmak için dinamik girişli tek
MatMulseçildi
- Birden fazla katman, convolution ve statik ağırlık da kullanılabilirdi; ancak LLM'lerde ve modern modellerde yaygın transformer yapısını yansıtmak için dinamik girişli tek
- Yapılandırma hatası olasılığı da tamamen dışlanmıyor
- unsigned 8-bit kuantizasyon ve grafik içi
qdqöğeleri kullanıldı - Belgelerdeki en iyi uygulamalar izlenmeye çalışıldı, ancak sürücü veya hızlandırıcı implementasyonunun hızlı yolunun dışına çıkılmış olabilir
- unsigned 8-bit kuantizasyon ve grafik içi
- Windows'ta AI hızlandırmaya erişim için API seçenekleri de değerlendirildi
- DirectML yalnızca GPU erişimini destekliyor gibi görünüyor
- OpenVino ilgili Arm donanımında çalışmıyor gibi görünüyor
- Qualcomm QNN SDK doğrudan kullanıldığında da benzer performans sonuçları görüldü
- TensorFlow Lite, Windows for Arm'ı desteklemiyor
- Bu inceleme ve deneylerde, hem Microsoft hem de Qualcomm tarafından desteklendiği için Onnx, NPU hızlandırma performansı elde etmek açısından en uygun framework gibi görünüyor
Sonuçların yorumu
- Sonuçlar 2 Ekim 2024 itibarıyla geçerli ve Microsoft Surface Pro 11th Edition üzerinde ölçüldü
- SoC,
Snapdragon(R) X 12-core X1E80100 @ 3.40 GHz
- SoC,
- Float dönüşümleri hariç tutulsa bile NPU sonucu CPU'dan daha yavaş
- Bu, hızlandırıcı perspektifinden ideal bir sonuç değil
- Ancak enerji verimliliği veya sürdürülebilir performans açısından avantaj olasılığı tamamen dışlanmıyor
- Ölçülen en yüksek NPU performansı olan 573 billion ops/s, Microsoft Surface Pro 11th Edition pazarlama materyalindeki 45 trillion ops/s değerinin %1,3'üne karşılık geliyor
- Aynı model Nvidia Geforce RTX 4080 Laptop GPU üzerinde çalıştırıldığında 3.2ms sürüyor
- Bu da 2,160 billion ops/s anlamına geliyor
- Surface'in ölçülen NPU değerinden neredeyse 4 kat daha yüksek işlem hacmi sunuyor
2 yorum
Ryzen NPU'nun CPU'dan biraz daha hızlı olduğunu sanıyordum ama Snapdragon hevesim bir anda söndü
Hacker News yorumları
Sonuçlara bakınca genel olarak hesaplama kaynaklarının kullanımı pek iyi değil gibi görünüyor. CPU 8,4 ms, GPU 3,2 ms ise fark çok küçük; burada 10-20 kat fark beklenmiş olabilir.
Bunun nedeni onnxruntime olabilir. Bazı donanım üreticileri yalnızca hesaplama birimlerini sunup düzgün desteği henüz eklemiyor gibi görünüyor; bunun ne kadar hızlı değişeceğini görmek gerekecek.
Ayrıca NPU’nun amacı çoğu zaman “hız” sanılıyor ama asıl mesele düşük güç tüketimi. Hız hedefleniyorsa bellek darboğazını ortadan kaldırmak gerekir; bu da sonunda kendi belleğine sahip bir ASIC tasarlamaya götürür. Çoğu cihazdaki NPU, CPU çevresindeki SoC’ye bağlı olup yapay zeka hesaplamalarını offload etmek için kullanılır.
Bu benchmark’ı CPU/NPU/GPU olmak üzere üç cihazda sonsuz döngüde çalıştırıp güç tüketimini ölçmek ilginç olurdu. NPU’nun en düşük güç tüketimine ve watt başına en iyi hesaplama performansına sahip olmasını beklerim.
Örneğin yapay zeka fotoğraf filtresinde GPU önizlemeyi render ederken, CPU’nun arayüz ve kullanıcı girdisini işlemekle meşgul olma ihtimali yüksektir.
Apple Accelerate, M4 öncesi CPU matris birimlerine ve NPU’ya erişmenin fiilen tek yoluydu. Bunun dışında bir şey kullanmak istiyorsanız, seçtiğiniz makine öğrenimi framework’üne patch göndermeye ya da eğitim ve çıkarım kodunu doğrudan yazmaya hazır olmanız gerekir.
Sonuçta Python da C çağırıyor, ama ne kadar performansın kaybolduğu epey ilginç.
GPU kullanılıyorsa zamanlamaya asenkron işlerin dahil olup olmadığını hesaba katmak gerekir.
time.time()safça kullanılırsa CPU yalnızca zamanı kaydeder;model(input.cuda()).cuda()ise veriyi GPU belleğine gönderip hesaplamayı başlatır, fakat işlem asenkron olduğu için sonuç gerçekten hazır olsun olmasın bitiş zamanı kaydedilebilir.Sistemi ve donanımı bilmiyorsanız beklemesi zor bir davranış. Yalnızca Python değil, çoğu dil yazdığınız koddan daha optimize bir biçime derlenecek şekilde tasarlanmıştır; kilit olmadığı için CPU işini engellemez.
GPU işini gerçekten ölçmek için CUDA event timer’larına bakmak gerekir. PyTorch’ta bunun yolu
torch.cuda.Event(enable_timing=True)kullanmaktır.Ek olarak bellek boyutu ve düzeni de karmaşıktır. Bu benchmark, NPU için dezavantajlı bir düzen kullanıyor. NPU ve GPU genelde channels last ister; bu yüzden
[1,6,1500,1500]yerine[1,1500,1500,6]daha doğrudur.1500 ve 6 da tuhaf sayılar olduğu için NPU açısından iyi değildir; bu tür cihazların hâlâ yeni olduğu düşünülürse performans kaybı epey büyük olabilir.
Daha ayrıntılı olarak şurada yazdım: https://news.ycombinator.com/item?id=41864828
Bu NPU’lar kayda değer miktarda silikon alanı kaplıyor; sonunda pek kullanılmazlarsa gerçekten yazık olur. Snapdragon X’te yalnızca NPU’yu ayıran bir die analizi bulamadım, ama benzer şekilde yaklaşık 50 TOPS hedefleyen AMD tarafı burada görülebiliyor ve yaklaşık 3 yüksek performanslı CPU çekirdeği kadar alan kaplıyor.
https://www.techpowerup.com/325035/amd-strix-point-silicon-p...
Daha da kötüsü, çoğu insan için de gerekli görünmüyor; yakın tarihli anketlerde yapay zekanın her yere sızmasına karşı tepkinin baskın çıktığı da görüldü. Böyle şeyler için ek ücret ödememeliyiz; isteğe bağlı olmalı.
Böyle olursa “yapay zeka” primi ödemek isteyenlerin ne kadar az olduğu satışlardan ortaya çıkar ve bunun ne kadar abartılı ve gereksiz olduğu netleşir.
Bu yüzden bu parçaların amacı kullanılmak, ama fazla kullanılmamaktır.
NPU yerine o transistörler ve die alanı çeşitli amaçlarla kullanılabilirdi, ama muhtemelen daha fazla yüksek performanslı CPU çekirdeği konmazdı. O zaman güç yoğunluğu çok artar ve kalıcı throttling olmadan çözülmesi zor ısıl sorunlar oluşurdu.
[1] https://en.wikipedia.org/wiki/Dark_silicon
Model çalıştırmayacak kişiler için israf gibi duruyor; başka hangi amaçlarla kullanılabileceğini merak ediyorum.
Tüketici yazılımları o seviyeye kadar ölçeklenmiyor; transistörleri CPU’ya daha fazla ayırarak ne yapılabilir ki diye düşünüyorum.
Bu, Apple’ın SoC’lerine çok sayıda video motoru koymasının nedenine de benziyor. Karşılanabilir transistör bütçesiyle kullanacak pek fazla başka yer yok. Tek iş parçacıklı performans iyileştirmesi artık yalnızca transistör sayısıyla sınırlı değil ve yazılımlar çok iş parçacığını iyi kullanamıyor.
Bu tür cihazların amacının hızlı olmak değil, küçük modelleri çok düşük güçle çalıştırmak olduğunu düşünmüştüm. NPU’lu yeni bir AMD dizüstü kullanıyorum; NPU’da çalıştığı söylenen video efektini açsam da güç tüketimi değişmiyor, ama Nvidia Studio Effects kullanınca güç tüketimi artıyor.
NPU, göz teması, arka plan bulanıklaştırma, otomatik düzeltme modelleri, transkripsiyon, OCR gibi küçük işler yapan, çok optimize edilmiş modellere yönelik görünüyor. Özellikle Windows’ta rewind özelliği için tam ekran OCR ve arama amaçlı embedding çalıştırdığını sanmıştım.
AMD son zamanlarda çok iyi işler yapıyor, ama bunu pek yüksek sesle duyurmuyor gibi. Şu özellikle ilginç: https://lore.kernel.org/lkml/DM6PR12MB3993D5ECA50B27682AEBE1...
Düzenleme: FPGA değilmiş. Bugün öğrendim.
macOS’ta CoreML modellerini değerlendirince bunu görebiliyorsunuz. ANE, GPU’nun yaklaşık yarısı kadar zaman alıyor; GPU da CPU’nun yaklaşık yarısı kadar zaman alıyor. Gerçek çarpan modele göre değişiyor.
Nvidia’yı tehdit edecek çip, akıllı telefon gibi kişisel cihazlarda yeterince iyi modeller çalıştırabilecek kadar ucuz bir çip ve bellek olacaktır.
Genel kitle LLM’lerin faydasını kabul eder ve cihaz fiyatına küçük bir prim ödemeye istekli olursa, bu teknolojinin geleceğinin özünde mahremiyet sağlayan kişisel modeller olduğunu düşünüyorum.
İnsanların ChatGPT gibi yerlere döktüğü kişisel bilgi miktarı şaşırtıcı. Reddit’e bakınca, yapay zeka sanal kız arkadaş uygulamalarına bağımlı kişilerin en karanlık zevklerini, savunmasız itiraflarını, hatta suç sayılabilecek konuşmalarını bile isimsiz uygulama şirketlerine teslim ettiği sıkça görülüyor.
Google da Gemini geçmişi açıksa konuşma içeriklerini inceleyebileceğini açıkça belirtiyor.
Daha büyük modeller gerektiren karmaşık token tahminleri için bulut LLM’lere sorulabilir, ama tüketici için mahremiyetin mutlaka garanti edilmesi gerekir.
Günlük kişisel asistan, sohbet ve bilgi arama için en ileri düzey akıl yürütmeye ya da gösteri amaçlı LLM’lere ihtiyaç olduğunu düşünmüyorum.
Yine de yazının somut sonuçlarından biraz şüpheliyim. Qualcomm’un ONNX’i ve eski olabilir. Android tarafında Qualcomm yazılım mühendisliğine çok sövülürdü.
Yine de yön doğru. Tüketici donanımındaki yapay zeka hızlandırma iddialarının çoğu neredeyse evrensel olarak abartıya yakın; istisnalar ise A) 1P yazılım kullanmanız ya da B) 1P içinde birinin gerçekten o özelliği kullanmanızı istemesi.
TensorRT gibi şeyler kullansanız bile en baştan elle yazmak kadar hızlı olmayacaktır; Nvidia’nın buna çok sayıda insan ayırmasının da bir nedeni var. Yine de oldukça yaklaşır ve yazma süresini çok azaltır.
Bu cihazlar genelde yinelenen benzer işlere optimize edilmiştir. Bu yüzden burada toplanan bilgilerin bir kısmının hatalı olabileceğini düşünüyorum.
Bu NPU çiplerini bizzat kullanmadım, ama zamanlamaya güvenmek zor. Sondaki CUDA zamanlaması kodda düzgün ölçülmemiş olma ihtimali yüksek. Zaman ölçmek sanıldığından daha zor.
Reklamı yapılan işlem sayıları yalnızca NPU üzerinde doğrudan yapılan işlemleri sayarken, asıl yazı NPU ve GPU ölçümlerine CPU işlerini de dahil etmiş olabilir. Belgelerde bir benchmark aracı var; muhtemelen benzer bir yöntem kullanmıştır. Isınmadan sonra varyansın nasıl olduğunu da merak ediyorum.
Veri biçimi de yanlış gibi. Burada
channels lastgerekiyor. Belgeler de bunu doğruluyor.1500 sayısı da tuhaf; bu yüzden ek hatalar ortaya çıkabilir. 1536, 2048, 256 ya da daha küçük değerlerde sonuçlar değişebilir. Gerçek modeller tam çözünürlüklü görüntüleri işlemez; mimariyi modele göre optimize ediyorsanız şekil bilgisi önem kazanır. Makine öğreniminde şekil optimizasyonu oldukça önemlidir.
Belgelere hızlıca bakınca ayarlar da uygunsuz görünüyor. “Model Workflow” veriyi 8 bit veya 16 bit kayan nokta olarak istediğini söylüyor, ama kayan noktanın da farklı türleri var. PyTorch’taki bfloat,
torch.halfveyatorch.float16ile aynı şey değil.Karma hassasiyet hâlâ kafa karıştırıcı bir konu; böyle bir sorun varsa düzgünce incelemeye değer. Yalnızca standart kuantizasyon prosedürünü çalıştırıp bırakmayı önermem. Başlangıç noktası olarak iyidir, ama “yeterince iyi” değilse orada durmamak gerekir.
Yine de bu sonuçların işe yaramaz olduğunu düşünmüyorum. Sadece iyileştirilmesi gerekiyor. Bu tür işler sanılandan karmaşık ve bunun önemli bir kısmı teknolojinin yeni, ayrıntıların da hâlâ oturmakta olmasından kaynaklanıyor.
CPU veya GPU, özellikle de CUDA ile karşılaştırırken, bunlara yüz binlerce insan-saat harcandığını; Python gibi yüksek seviyeli kütüphanelere bile en az on binlerce insan-saat girdiğini unutmamak gerekir. Bu cihazlar ortalama kullanıcının tercih ettiği dil soyutlama seviyesinde doğrudan kullanılmaya henüz pek hazır değil, ama donanıma yakın çalışmaya istekliyseniz oldukça faydalılar.
PyTorch’ta GPU’nun asenkron işlerini ölçmek için CPU zamanlayıcısıyla model çıktısını sarmak yerine CUDA event’leri ve
torch.cuda.synchronize()kullanmak gerekir.[1] https://www.thonking.ai/p/what-shapes-do-matrix-multiplicati...
NPU’ya model dağıtmak için ciddi ölçüde profil tabanlı optimizasyon gerekir. CPU’da iyi çalışan bir modeli NPU için optimize etmeden taşırsanız genelde hayal kırıklığı yaratan sonuçlar çıkar
GitHub deposundaki açıklama blogdan çok daha bilgilendirici
onnx ile int8 matris çarpımı çalıştırıldığında performans yaklaşık 0.6TF
https://github.com/usefulsensors/qc_npu_benchmark
Girdi matrislerini döşemeye ve yeniden kullanıma imkân verecek şekilde kareye daha yakın hâle getirdiklerini söylüyorlar ama olası optimizasyonların önemli bir kısmının Onnx’e girmemiş olmasına şaşırmam
Qualcomm, NPU’ya doğrudan erişim sağlamıyor; kullanıcıların modeli bir framework ile dönüştürüp vermesini bekliyor gibi görünüyor. Benim deneyimime göre dönüştürme araçları genelde pek iyi değil ve birçok optimizasyonu kaçırıyor
Dolayısıyla sorun “NPU kötü” olmaktan çok “dönüştürme aracı kötü” olabilir. Doğrudan erişim mümkün olana kadar bekleyeceğim ve dönüştürme araçlarına güvenmiyorum
NPU’ların çok küçük makine öğrenimi modelleri ve çok hızlı fonksiyon yaklaşımı için iyi olduğunu düşünüyorum. Benim amaçladığım kullanım da bu. LLM’ler bugünlerde gözde olsa da, küçük modellerin gerçekten yararlı olduğu muazzam sayıda uzmanlaşmış iş var
Böyle bir şey yok demek istemiyorum ama açıkçası ne olduğunu pek bilmiyorum, öğrenmek isterim
Umarım Elite X’in NPU’suna Copilot+ nedeniyle erişmek daha kolay hâle gelmiştir; ama asıl nokta şu: “Genel amaçlı bir modeli çalıştırınca sihirli biçimde NPU’ya ışınlanır herhâlde” diyecek kadar kolay olması mümkün değil
RTX 4080’in yaklaşık 40 TFLOPS yapabilmesi gerekirken burada yalnızca saniyede 216 milyar işlem raporlanmış. Bu durumda benchmark’ın yeniden incelenmesi gerekmez mi diye düşünüyorum
FLOPS ölçümünde ciddi bir hata yapılmış olma ihtimali yüksek. CPU’nun NPU’yu yenmesi mümkün, ama düzgün bir karşılaştırma için uygulama senkronizasyonu olmadan birden çok matris çarpımı benchmark edilmeliydi
Benchmark
(6, 1500, 256) X (6, 256, 1500)biçiminde bir matris çarpımı; yapay zeka dünyasında bu çok büyük bir boyut değil. Çok daha büyük matrislerde fark daha da açılırÖrneğin küçük modellerden biri olan Llama 3.1 8B bile
(batch, 14336, 4096) x (batch, 4096, 14336)gibi matris çarpımlarına sahipBu benchmark’ın yeterince gerçekçi olmadığını düşünüyorum
Bu benchmark üzerinde Qualcomm NPU profilleyicisi qprof’u çalıştırdım. Profil sonucuna göre iş, NPU işlem gücünün büyük kısmını sağlayan tensor core’lara değil, vector core’lara dağıtılmış
Kabaca hesaplayınca HMX’in HVX’ten 30 kat güçlü olduğu görülüyor
İş yükü nispeten küçük olduğu için giriş/çıkış kuantizasyonu/dekuantizasyonu ve NCHW-NHCW eşlemesinin ek yükü nedeniyle donanım kapasitesi yeterince kullanılamıyor. Ağırlıkları ve girdileri 64’ün katlarına padding yapmak da performansa yardımcı olur
Profil grafiği: https://imgur.com/a/2OKR93e
Tahmini HVX işlem performansı int8’de
4 * 2 * 1.43 * 1024 / 8 = 1.46TOPS. Burada 4 vector core sayısı, 2 çevrim başına işlem sayısı, 1.43GHz HVX frekansı, 1024bit vektör register genişliği, 8bit ise hassasiyet4 * 2 * 1.43 * 1024 / 8olmalıAsıl yazı başlığı “Benchmarking Qualcomm's NPU on the Microsoft Surface Tablet” olmalıydı
Bu NPU’lar genelinde bir yazı değil; belirli bir NPU’ya, belirli bir benchmark ve belirli bir kütüphane/framework kombinasyonuyla bakıyor. Bu yüzden pratikte hiçbir şeyi kanıtlamıyor