Daha hızlı Web AI için WebAssembly ve WebGPU geliştirmeleri, 1. bölüm

WebAssembly ve WebGPU geliştirmelerinin web'de makine öğrenimi performansını nasıl iyileştirdiğini öğrenin.

Austin Eng
Austin Eng
Deepti Gandluri
Deepti Gandluri
François Beaufort
François Beaufort

Web'de AI çıkarımı

Yapay zekanın dünyamızı değiştirdiğini hepimiz duymuşuzdur. İnternet de bu konuda istisna değil.

Bu yıl Chrome'a özel tema oluşturma veya ilk metin taslağını yazmanıza yardımcı olma gibi üretken yapay zeka özellikleri eklendi. Ancak yapay zeka bundan çok daha fazlasını sunuyor. Yapay zeka, web uygulamalarını kendilerini zenginleştirebilir.

Web sayfaları; görme, ses sınıflandırma veya dil algılama gibi görme işlevleri için yüzleri veya hareketleri tanıma gibi akıllı bileşenler yerleştirebilir. Geçtiğimiz yıl, web'deki büyük dil modellerinin gerçekten etkileyici bazı demolarının da aralarında bulunduğu üretken yapay zekanın yükselişe geçtiğini gördük. Web geliştiricileri için cihaz üzerinde pratik AI başlıklı makaleye göz atmayı unutmayın.

Web'deki yapay zeka çıkarımı şu anda cihazların büyük bir bölümünde kullanılabilmektedir. Yapay zeka işlemesi de web sayfasının kendisinde gerçekleşerek kullanıcının cihazındaki donanımdan yararlanılabilir.

Bu, birkaç nedenden dolayı güçlüdür:

  • Daha düşük maliyetler: Tarayıcı istemcisinde çıkarım çalıştırmak, sunucu maliyetlerini önemli ölçüde azaltır ve bu, özellikle normal sorgulara göre çok daha pahalı olabilen GenAI sorguları için yararlı olabilir.
  • Gecikme: Ses veya video uygulamaları gibi gecikmeye özellikle duyarlı olan uygulamalarda tüm işlemlerin cihazda olması gecikmenin azalmasını sağlar.
  • Gizlilik: İstemci tarafında çalışmak, verilerin sunucuya gönderilemeyeceği daha fazla gizlilik gerektiren yeni bir uygulama sınıfının kilidini açma potansiyeline de sahiptir.

AI iş yüklerinin bugün web'de çalışma şekli

Günümüzde uygulama geliştiricileri ve araştırmacılar, çerçeveler kullanarak modeller oluşturmakta, modeller Tensorflow.js veya ONNX Runtime Web gibi bir çalışma zamanını kullanarak tarayıcıda yürütülmekte ve çalışma zamanları yürütme için Web API'lerinden yararlanmaktadır.

Tüm bu çalışma zamanları sonunda JavaScript veya WebAssembly aracılığıyla CPU'da ya da WebGL veya WebGPU aracılığıyla GPU'da çalışmaya başlar.

AI iş yüklerinin günümüzde web'de nasıl çalıştığını gösteren şema

Makine öğrenimi iş yükleri

Makine öğrenimi (ML) iş yükleri, işlem düğümleri grafiği üzerinden tensör iter. Tensörler, veriler üzerinde büyük miktarda hesaplama yapan bu düğümlerin giriş ve çıkışlarıdır.

Bu önemlidir, çünkü:

  • Tensörler, milyarlarca ağırlığa sahip olabilen modeller üzerinde hesaplama yapan çok büyük veri yapılarıdır
  • Ölçeklendirme ve çıkarım, veri paralelliğine yol açabilir. Bu, tensörlerdeki tüm öğelerde aynı işlemlerin gerçekleştirildiği anlamına gelir.
  • Makine öğrenimi hassasiyet gerektirmez. Ay'a iniş yapmak için 64 bitlik bir kayan nokta sayısına ihtiyacınız olabilir, ancak yüz tanıma için yalnızca 8 bit veya daha küçük bir sayıya ihtiyacınız olabilir.

Neyse ki yonga tasarımcıları, modellerin daha hızlı ve daha iyi çalışmasını, hatta onları bütünüyle çalıştırmasını sağlayan özellikler eklemiştir.

Bu arada WebAssembly ve WebGPU ekiplerinde, bu yeni özellikleri web geliştiricilerine sunmak için çalışıyoruz. Bir web uygulaması geliştiricisiyseniz, bu alt düzey temel öğeleri sık sık kullanmanız pek olası değildir. Kullandığınız araç zincirlerinin veya çerçevelerin yeni özellikleri ve uzantıları desteklemesini bekliyoruz. Bu nedenle, altyapınızda minimum düzeyde değişiklik yaparak bunlardan yararlanabilirsiniz. Ancak uygulamalarınızı performans için manuel olarak ayarlamak istiyorsanız bu özellikler işinizle alakalıdır.

WebAssembly

WebAssembly (Wasm), çalışma zamanlarının anlayıp yürütebileceği kompakt ve verimli bir bayt kodu biçimidir. Temel donanım özelliklerinden yararlanacak şekilde tasarlandığından neredeyse yerel hızlarda yürütülebilir. Kod doğrulanır ve bellek açısından güvenli, korumalı alana alınmış bir ortamda yürütülür.

Wasm modülü bilgileri, yoğun bir ikili kodlamayla gösterilir. Metin tabanlı bir biçime kıyasla bu, daha hızlı kod çözme, daha hızlı yükleme ve daha az bellek kullanımı anlamına gelir. Modern mimarilerde zaten yaygın olmayan temel mimari hakkında varsayımlarda bulunmadığı için taşınabilirdir.

WebAssembly spesifikasyonu yinelemelidir ve açık bir W3C topluluk grubunda üzerinde çalışılır.

İkili biçim, ana makine ortamı hakkında herhangi bir varsayımda bulunmaz; bu nedenle, web dışı gömmelerde de iyi çalışacak şekilde tasarlanmıştır.

Uygulamanız bir kez derlenebilir ve her yerde (masaüstü, dizüstü bilgisayar, telefon veya tarayıcısı olan başka bir cihaz) çalışabilir. Bu konuyla ilgili daha fazla bilgi edinmek için Bir kez yaz, Sonunda WebAssembly ile her yerde çalıştırıl bölümüne göz atın.

Dizüstü bilgisayar, tablet ve telefon resmi

Web'de AI çıkarımı çalıştıran çoğu üretim uygulaması, hem CPU işlemleri hem de özel amaçlı işlemler ile arayüz işlemleri için WebAssembly'den yararlanır. Yerel uygulamalarda, cihaz özelliklerine erişebildiğinden hem genel amaçlı hem de özel amaçlı bilişime erişebilirsiniz.

Web'de, taşınabilirlik ve güvenlik amacıyla, hangi temel öğelerin açığa çıkarıldığını dikkatle değerlendiririz. Böylece, web'in erişilebilirliği ile donanımın sağladığı maksimum performans dengelenir.

WebAssembly, CPU'ların taşınabilir bir soyutlanmasıdır. Bu nedenle, tüm Wasm çıkarımı CPU'da çalıştırılır. En etkili seçenek bu olmasa da CPU'lar yaygın olarak kullanılabilir ve çoğu cihazda, çoğu iş yükünde çalışır.

Metin veya ses iş yükleri gibi daha küçük iş yükleri için GPU pahalı olur. Yakın zamanda Wasm'ın doğru seçim olduğu birkaç örnek verilmiştir:

Açık kaynaklı demolarda çok daha fazlasını keşfedebilirsiniz. Örneğin: whisper-tiny, llama.cpp ve tarayıcıda çalışan Gemma2B.

Uygulamalarınızda bütüncül bir yaklaşım benimseyin

Temel öğeleri; ilgili makine öğrenimi modeline, uygulama altyapısına ve kullanıcılar için amaçlanan genel uygulama deneyimine göre seçmelisiniz.

Örneğin, MediaPipe'in yüz belirgin noktası algılamasında CPU çıkarımı ve GPU çıkarımı karşılaştırılabilirdir (Apple M1 cihazda çalışan), ancak varyansın önemli ölçüde daha yüksek olabileceği modeller vardır.

ML iş yükleri söz konusu olduğunda, en çok talep edilen geliştirmeleri geliştirip göndermek için çerçeve yazarlarını ve uygulama iş ortaklarını dinlerken bütünsel bir uygulama görünümünü değerlendiririz. Bunlar geniş bir şekilde üç kategoriye ayrılır:

  • Performans açısından kritik olan CPU uzantılarını kullanıma sunun
  • Daha büyük modelleri çalıştırmayı etkinleştir
  • Diğer Web API'leriyle sorunsuz birlikte çalışabilirlik sağlama

Daha hızlı bilgi işlem

Şu anki haliyle WebAssembly spesifikasyonu, yalnızca web'de sunduğumuz belirli bir talimat grubunu içerir. Ancak donanım, yerel ve WebAssembly performansı arasındaki boşluğu artıran yeni talimatlar eklemeye devam ediyor.

Makine öğrenimi modellerinin her zaman yüksek kesinlik düzeyleri gerektirmediğini unutmayın. Gevşetilmiş SIMD, katı ve belirleyici olmayan gereksinimlerin bir kısmını azaltarak performansın önemli olduğu bazı vektör işlemleri için daha hızlı kod üretilmesini sağlayan bir tekliftir. Ayrıca, Rahat SIMD, mevcut iş yüklerini 1,5 ila 3 kat hızlandıran yeni nokta ürünü ve FMA talimatlarını kullanıma sunuyor. Bu ürün Chrome 114 sürümünde gönderilmiştir.

Yarım duyarlıklı kayan nokta biçimi, IEEE FP16 için tek hassasiyet değerleri için kullanılan 32 bit yerine 16 bit kullanır. Tek hassasiyetli değerlere kıyasla yarı kesinlikli değerler kullanmanın, daha düşük bellek gereksinimlerinin, daha büyük nöral ağların eğitilmesini ve dağıtılmasını sağlayan ve daha düşük bellek bant genişliğinin birçok avantajı vardır. Azaltılmış hassasiyet, veri aktarımını ve matematik işlemlerini hızlandırır.

Daha büyük modeller

Wasm doğrusal belleğine işaretçiler, 32 bit tamsayılarla temsil edilir. Bunun iki sonucu vardır: Yığın boyutları 4 GB ile sınırlıdır (bilgisayarların fiziksel RAM'i çok daha fazla olduğunda) ve Wasm'ı hedefleyen uygulama kodunun 32 bit işaretçi boyutuyla uyumlu olması gerekir (bunun için).

Özellikle bugünkü gibi büyük modellerde, bu modellerin WebAssembly'ye yüklenmesi kısıtlayıcı olabilir. Memory64 teklifi, 4 GB'tan büyük olan ve yerel platformların adres alanıyla eşleşen doğrusal belleğe göre bu kısıtlamaları kaldırır.

Chrome'da tam olarak çalışan bir uygulamamız mevcuttur. Bu yılın ilerleyen günlerinde kullanıma sunmayı planlıyoruz. Şimdilik chrome://flags/#enable-experimental-webassembly-features işaretiyle denemeler yapabilir ve bize geri bildirim gönderebilirsiniz.

Daha iyi web birlikte çalışabilirliği

WebAssembly, web'de özel amaçlı işlem için giriş noktası olabilir.

WebAssembly, GPU uygulamalarını web'e taşımak için kullanılabilir. Yani cihaz üzerinde çalıştırılabilen C++ uygulaması küçük değişikliklerle web'de de çalışabilir.

Wasm derleyici araç zinciri olan Emscripten'in WebGPU için zaten bağlamaları vardır. Web'de yapay zeka çıkarımının giriş noktasıdır. Bu nedenle Wasm'ın web platformunun geri kalanıyla sorunsuz bir şekilde birlikte çalışabilmesi çok önemlidir. Bu alanda birkaç farklı teklif üzerinde çalışıyoruz.

JavaScript vaat entegrasyonu (JSPI)

Tipik C ve C++ (ve diğer birçok dilde) uygulamaları, genellikle eşzamanlı bir API'ye göre yazılır. Bu, uygulamanın işlem tamamlanana kadar yürütülmeyi durduracağı anlamına gelir. Bu tür engelleme uygulamalarını yazmak, eşzamansız uyumlu olan uygulamalara göre genellikle daha sezgiseldir.

Pahalı işlemler ana iş parçacığını engellediğinde, G/Ç'yi engelleyebilir ve jank'ı kullanıcılar görebilir. Yerel uygulamaların eşzamanlı programlama modeli ile web'in eşzamansız programlama modeli arasında uyuşmazlık vardır. Bu durum özellikle eski uygulamalar için soruna neden olur ve bu da taşıma işlemi pahalıya mal olur. Emscripten, Asyncify ile bunu yapmanın bir yolunu sunar. Ancak bu her zaman en iyi seçenek değildir; kod boyutu daha büyüktür ve o kadar verimli değildir.

Aşağıdaki örnek, JavaScript'in ekleme vaadini kullanan fibonacci'nin hesaplanmasıdır.

long promiseFib(long x) {
 if (x == 0)
   return 0;
 if (x == 1)
   return 1;
 return promiseAdd(promiseFib(x - 1), promiseFib(x - 2));
}
// promise an addition
EM_ASYNC_JS(long, promiseAdd, (long x, long y), {
  return Promise.resolve(x+y);
});
emcc -O3 fib.c -o b.html -s ASYNCIFY=2

Bu örnekte aşağıdakilere dikkat edin:

  • EM_ASYNC_JS makrosu, normal bir işlevde olduğu gibi, vaatin sonucuna erişmek üzere JSPI'yı kullanabilmemiz için gerekli tüm yapıştırıcı kodunu oluşturur.
  • Özel komut satırı seçeneği, -s ASYNCIFY=2. Bu komut, vaatler döndüren JavaScript içe aktarma işlemleriyle arayüz oluşturmak için JSPI'yı kullanan kod oluşturma seçeneğini çağırır.

JSPI, kullanımı ve avantajları hakkında daha fazla bilgi için v8.dev'de WebAssembly JavaScript Promise Integration API'ye giriş başlıklı makaleyi okuyun. Mevcut kaynak denemesi hakkında bilgi edinin.

Bellek kontrolü

Geliştiricilerin Wasm belleği üzerinde çok az kontrolü vardır. Modülün kendi belleği vardır. Bu belleğe erişmesi gereken API'lerin kopyalanması veya kopyalanması gerekir ve bu kullanım miktarı gerçekten artar. Örneğin, bir grafik uygulamasının her bir kare için içeriği kopyalaması ve kopyalaması gerekebilir.

Bellek kontrolü teklifi, Wasm doğrusal belleği üzerinde daha ayrıntılı kontrol sağlamayı ve uygulama ardışık düzenindeki kopya sayısını azaltmayı amaçlar. Bu teklif 1. Aşama aşamasındadır. Standardın gelişimini bildirmek için Chrome'un JavaScript motoru olan V8'de bunun prototipini oluşturuyoruz.

Hangi arka ucun sizin için doğru olduğuna karar verin

CPU her yerde kullanılsa da her zaman en iyi seçenek değildir. GPU veya hızlandırıcılarda özel amaçlı işleme, özellikle büyük modeller ve ileri teknoloji cihazlarda çok daha yüksek performans sunabilir. Bu, hem yerel uygulamalar hem de web uygulamaları için geçerlidir.

Hangi arka ucu seçtiğiniz uygulama, çerçeve veya araç zincirinin yanı sıra performansı etkileyen diğer faktörlere bağlıdır. Bununla birlikte, temel Wasm'ın web platformunun geri kalanıyla, özellikle de WebGPU ile iyi çalışmasını sağlayacak tekliflere yatırım yapmaya devam ediyoruz.

2. bölümü okumaya devam edin