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

WebAssembly ve WebGPU geliştirmelerinin web'deki 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ı

Hikayeyi hepimiz duymuşuzdur: Yapay zeka dünyamızı dönüştürüyor. Web de bu sürecin dışında değil.

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

Web sayfaları görme için, yüz seçme veya hareketleri tanıma, ses sınıflandırma veya dil algılama gibi akıllı bileşenler yerleştirebilir. Geçen yıl, web'deki büyük dil modellerinin gerçekten etkileyici bazı demoları dahil olmak üzere üretken yapay zekanın yükselişe geçtiğini gördük. Web geliştiricileri için cihaz üzerinde pratik yapay zeka başlıklı makaleye göz atmayı unutmayın.

Günümüzde web'deki yapay zeka çıkarımı, cihazların büyük bir bölümünde kullanılabilmektedir. Ayrıca, yapay zeka işleme, kullanıcının cihazındaki donanımdan yararlanarak web sayfasının kendisinde gerçekleşebilir.

Bu, birkaç nedenden dolayı etkilidir:

  • Daha düşük maliyet: Tarayıcı istemcisinde çıkarım çalıştırmak sunucu maliyetlerini önemli ölçüde azaltır. Bu özellik, özellikle normal sorgulardan çok daha pahalı olabilen üretken yapay zeka sorguları için yararlı olabilir.
  • Gecikme: Ses veya video uygulamaları gibi gecikmeye karşı özellikle hassas olan uygulamalar için tüm işleme işlemlerinin cihazda gerçekleştirilmesi gecikmenin azalmasını sağlar.
  • Gizlilik: İstemci tarafında çalıştırıldığında, daha fazla gizlilik gerektiren ve verilerin sunucuya gönderilemediği yeni bir uygulama sınıfının kilidini açma potansiyeli de vardır.

AI iş yüklerinin günümüzde web'de çalışma şekli

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

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, tensörleri hesaplama düğümleri grafiğine aktarır. Tensörler, veriler üzerinde büyük miktarda hesaplama yapan bu düğümlerin girişleri ve çıkışlarıdır.

Bu önemlidir, çünkü:

  • Tensörler, milyarlarca ağırlığa sahip olabilen modeller üzerinde hesaplamalar 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 yürütüleceği anlamına gelir.
  • Makine öğreniminde hassasiyet gerekmez. Aya iniş için 64 bitlik bir kayan nokta numarasına ihtiyacınız olabilir ancak yüz tanıma için yalnızca 8 bit veya daha az sayıdan oluşan bir sayıya ihtiyacınız olabilir.

Neyse ki yonga tasarımcıları modellerin daha hızlı ve soğuk çalışmasını, hatta çalıştırılmasını sağlayan özellikler eklemiştir.

Bu arada WebAssembly ve WebGPU ekiplerinde, bu yeni yetenekleri web geliştiricilerine sunmak için çalışıyoruz. Bir web uygulaması geliştiricisiyseniz, bu alt düzey temel öğelerini sık kullanmanız olası değildir. Kullandığınız araç zincirlerinin veya çerçevelerin yeni özellikleri ve uzantıları desteklemesini, böylece altyapınızda çok az değişiklikle avantaj sağlamanızı bekliyoruz. 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ütebildiği kompakt ve verimli bir bayt kodu biçimidir. Temel donanım özelliklerinden yararlanacak şekilde tasarlanmıştır. Böylece neredeyse yerel hızlarda çalışabilir. Kod doğrulanır ve bellek açısından güvenli, korumalı bir ortamda yürütülür.

Wasm modülü bilgileri yoğun ikili kodlama ile gösterilir. Metin tabanlı bir biçimle karşılaştırıldığında bu, daha hızlı kod çözme, daha hızlı yükleme, daha az bellek kullanımı anlamına gelir. Modern mimarilerde yaygın olmayan temel mimari hakkında varsayımlarda bulunmaması açısından taşınabilir.

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

İkili program biçimi, ana makine ortamı hakkında herhangi bir varsayımda bulunmaz, bu nedenle web dışındaki yerleştirmelerde de iyi çalışacak şekilde tasarlanmıştır.

Uygulamanız bir kez derlenebilir ve her yerde çalışabilir: masaüstü, dizüstü bilgisayar, telefon veya tarayıcısı olan herhangi bir cihaz. Bu konu hakkında daha fazla bilgi edinmek için Bir kez yazma, her yerde son olarak WebAssembly ile yararlanma başlıklı makaleye göz atın.

Dizüstü bilgisayar, tablet ve telefon görseli

Web'de yapay zeka çıkarımı çalıştıran çoğu üretim uygulaması, hem CPU bilgisi hem de özel amaçlı bilgi işlem için arayüz oluşturmak amacıyla WebAssembly'yi kullanır. Uygulama cihaz özelliklerine erişebildiğinden yerel uygulamalarda hem genel amaçlı hem de özel amaçlı bilgi işlem özelliğine erişebilirsiniz.

Web'de, taşınabilirlik ve güvenlik için hangi temel öğelerin açığa çıkarıldığını dikkatle değerlendiririz. Bu, web'e erişilebilirliği donanımın sağladığı maksimum performansla dengeler.

WebAssembly, CPU'ların taşınabilir bir soyut yapısı olduğundan tüm Wasm çıkarımları CPU'da çalıştırılır. En iyi performans gösteren seçenek bu olmasa da CPU'lar geniş çapta kullanılabilir ve çoğu iş yükünde ve cihazda çalışır.

Metin veya ses iş yükleri gibi daha küçük iş yükleri için GPU'nun fiyatı pahalıdır. Yakın zamanda Wasm'in doğru tercih olduğu birkaç örnek var:

Açık kaynak demolarda daha fazlasını keşfedebilirsiniz: whisper-tiny, llama.cpp ve tarayıcıda çalışan Gemma2B.

Uygulamalarınız için bütünsel bir yaklaşım benimseyin

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

Örneğin, MediaPipe'in yüz belirginliğini algılama özelliğinde CPU çıkarımı ve GPU çıkarımı birbirine benzerdir (Apple M1 cihazda çalışır), ancak varyansın önemli ölçüde daha yüksek olabileceği modeller de vardır.

Makine öğrenimi 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 uygulama görünümünü değerlendiririz. Bu dönüşümler genel olarak üç 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ğlayın

Daha hızlı bilgi işlem

WebAssembly spesifikasyonu, yalnızca web'de gösterebileceğimiz belirli bir talimat grubunu içerir. Ancak donanım, yerel ve WebAssembly performansı arasındaki boşluğu artıran daha yeni talimatlar eklemeye devam ediyor.

Makine öğrenimi modellerinin her zaman yüksek hassasiyet gerektirmediğini unutmayın. Esnek SIMD, bazı katı, determinizstik olmayan gereksinimleri azaltarak performansın önemli noktaları olan bazı vektör işlemleri için daha hızlı kod oluşturmayı 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ı da sunuyor. Ürün, Chrome 114 sürümünde gönderildi.

Yarı hassasiyetli kayan nokta biçimi, tek hassasiyet değerleri için kullanılan 32 bit yerine IEEE FP16 için 16 bit kullanır. Tek hassasiyet değerleriyle karşılaştırıldığında, yarı hassasiyetli değerlerin ve daha düşük bellek gereksinimlerinin kullanılması, daha büyük nöral ağların eğitilmesini ve dağıtılmasını sağlayan, bellek bant genişliğini azaltan çeşitli avantajlara sahiptir. Daha düşük hassasiyet, veri aktarımını ve matematik işlemlerini hızlandırır.

Daha büyük modeller

Wasm doğrusal belleğe giden işaretçiler 32 bit tamsayılarla gösterilir. Bunun iki sonucu vardır: Yığın boyutları 4 GB ile sınırlıdır (bilgisayarların fiziksel RAM'i 4 GB olduğunda) ve Wasm'i hedefleyen uygulama kodunun 32 bit işaretçi boyutuyla uyumlu olması gerekir (yani).

Özellikle bugün sahip olduğumuz büyük modellerde, bu modellerin WebAssembly'ye yüklenmesi kısıtlayıcı olabilir. Memory64 teklifi, 4 GB'tan büyük olması ve yerel platformların adres alanıyla eşleşmesi için doğrusal bellekle ilgili bu kısıtlamaları kaldırır.

Chrome'da eksiksiz çalışan bir uygulamamız var ve bu yılın ilerleyen dönemlerinde kullanıma sunmayı planlıyoruz. Şimdilik chrome://flags/#enable-experimental-webassembly-features bayrağıyla denemeler yapıp bize geri bildirim gönderebilirsiniz.

Daha iyi web birlikte çalışabilirliği

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

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

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

JavaScript taahhüt entegrasyonu (JSPI)

Tipik C ve C++ (ve diğer birçok dil) uygulamaları genellikle eşzamanlı bir API'ye karşı yazılır. Bu durumda, uygulama işlem tamamlanana kadar yürütülmeyi durdurur. Bu tür engelleme uygulamalarının yazılması, genellikle eşzamansız kullanıma duyarlı uygulamalara göre daha sezgiseldir.

Pahalı işlemler ana iş parçacığını engellediğinde G/Ç'yi engelleyebilir ve olumsuzluk kullanıcılar tarafından görülebilir. Yerel uygulamaların eşzamanlı programlama modeli ile web'in eşzamansız modeli arasında uyuşmazlık vardır. Bu, özellikle taşınması pahalı olan eski uygulamalar için sorunludur. Emscripten, Asyncify ile bunu yapmanın bir yolunu sunar. Ancak bu, her zaman en iyi seçenek değildir: Daha büyük kod boyutu ve o kadar verimli değildir.

Aşağıdaki örnek, toplama için JavaScript vaatlerini kullanarak fibonacci'yi hesaplama örneğidir.

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, taahhüdün sonucuna erişmek için JSPI'yı kullanabilmemiz için gerekli tüm birleştirici kodu oluşturur.
  • Özel komut satırı seçeneği olan -s ASYNCIFY=2. Bu komut, vaat döndüren JavaScript içe aktarma işlemleriyle arayüz oluşturmak için JSPI kullanan kod oluşturma seçeneğini çağırır.

JSPI, nasıl kullanılacağı ve avantajları hakkında daha fazla bilgi için Intro the WebAssembly JavaScript Promise Integration API on v8.dev (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. Bu kullanım gerçekten de artabilir. Örneğin, bir grafik uygulamasının her kare için kopyalama ve kopyalama yapması 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şamadadır. Standardın gelişimini desteklemek için Chrome'un JavaScript motoru olan V8'de bunun prototipini oluşturuyoruz.

Sizin için hangi arka ucun uygun olduğuna karar verin

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

Seçtiğiniz arka uç; uygulamaya, çerçeveye veya araç zincirine ve performansı etkileyen diğer faktörlere bağlıdır. Bununla birlikte, temel Wasm'ın web platformunun geri kalanıyla ve özellikle WebGPU ile iyi çalışmasını sağlayan tekliflere yatırım yapmaya devam ediyoruz.

2. bölümü okumaya devam edin