spinny:~/writing $ less webgpu-on-device-ai-browser.md
12Jarenlang was de browser het mooie gezicht van de applicatie en de cloud de plek waar de harde dingen gebeurden. De gebruiker schrijft, klikt, uploadt een bestand; de frontend stuurt alles naar de server; de server roept een model aan; het antwoord komt terug.34Dit schema blijft erg handig, maar het is niet gratis. Elk gesprek brengt latentie, kosten, netwerkafhankelijkheid en privacyvragen met zich mee. Als de gebruiker een zin schrijft en een suggestie wil, weegt een halve seconde. Als je duizenden kleine inputs classificeert, worden centen echt geld. Als de tekst gevoelig is, is het verzenden ervan vanaf het apparaat geen neutrale keuze.56Dat is de reden waarom WebGPU en AI op het apparaat in een hype zijn. Niet omdat we morgen elk model in de browser zullen draaien. Omdat sommige intelligente functies dichter bij de gebruiker kunnen komen.78## Niet alles hoeft lokaal te worden910De kinderachtige versie van het argument is: ‘cloud versus device’. De nuttige versie is hybride.1112Sommige taken zien er geweldig uit op het apparaat: korte samenvattingen, taaldetectie, lichte herschrijvingen, eenvoudige classificaties, beeldfilters, kleine visiemodellen, creatieve ervaringen met onmiddellijke feedback.1314Andere taken blijven beter in de cloud: complex redeneren, grensmodellen, server-side data, gecentraliseerde audit, uniforme kwaliteit, workflow waarbij je elke stap zorgvuldig moet controleren.1516De gezonde architectuur beslist tijdens runtime:1718```mermaid19flowchart TD20 User[Gebruiker] --> Browser[Browsers]21 Browser --> Detect[Functiedetectie]22 Detect -->|Ondersteund| Local[Lokale gevolgtrekking]23 Detect -->|Niet ondersteund| Cloud[Terugval in de cloud]24 Local --> UX[Snelle reactie]25 Cloud --> UX26 UX --> Metrics[Statistieken en kwaliteit]27```2829De browser hoeft niet te winnen van de cloud. Het moet de cloud behoeden voor werk dat daar niet gedaan hoeft te worden.3031## Waarom WebGPU belangrijk is3233WebGPU is een moderne API voor het gebruik van de GPU vanuit de browser. Het is niet alleen voor mooiere 3D-graphics. Het is ook belangrijk omdat het primitieven blootlegt die geschikt zijn voor computergebruik: parallelle werklasten, shaders, pijplijnen die dichter bij datgene liggen waar GPU's goed in zijn.3435Voor AI, wetenschappelijke visualisatie, 3D-editors, videofilters en creatieve tools is dit verschil voelbaar. WebGL heeft veel voor het web gedaan, maar WebGPU werd geboren met een model dat beter geschikt was voor het heden.3637Het eerste dat u moet schrijven, is echter geen shader. Het is een nuchtere functiedetectie:3839```typescript40export async function requestWebGpuDevice() {41 if (!('gpu' in navigator)) {42 return null;43 }4445 const adapter = await navigator.gpu.requestAdapter({46 powerPreference: 'high-performance',47 });4849 if (!adapter) {50 return null;51 }5253 return adapter.requestDevice();54}55```5657Deze functie zegt één belangrijk ding: WebGPU is niet een recht dat op elk apparaat wordt verleend. Het is een vermogen om te verifiëren. Sommige browsers ondersteunen het niet volledig, sommige GPU's hebben beperkingen, sommige bedrijfsomgevingen schakelen functies uit, sommige gebruikers gebruiken bescheiden hardware.5859## Ingebouwde AI: wanneer de browser het model brengt6061Chrome pusht ingebouwde API's voor taken zoals lokale aanwijzingen, samenvattingen, schrijven, herschrijven, vertalen, taaldetectie en proeflezen. Het idee is erg interessant: de browser beheert het model, de beschikbaarheid en updates; de app gebruikt een API dichter bij het platform.6263Als het goed werkt, verandert er veel:6465- minder serveroproepen voor eenvoudige taken;66- gegevens die mogelijk op het apparaat achterblijven;67- lagere latentie;68- offline of semi-offline ervaringen;69- Meer natuurlijke UX voor schrijven en vertalen.7071Maar het moet worden beschouwd als een progressieve verbetering. Sommige API's zijn stabiel, andere zijn in de oorspronkelijke proefversie of preview, andere zijn nog steeds afhankelijk van versie, taal en apparaat.7273```typescript74type LocalCapability = 'available' | 'downloadable' | 'unsupported';7576export async function getLocalSummarizerCapability(): Promise<LocalCapability> {77 const SummarizerApi = (globalThis as any).Summarizer;7879 if (!SummarizerApi?.availability) {80 return 'unsupported';81 }8283 const availability = await SummarizerApi.availability();8485 if (availability === 'available') return 'available';86 if (availability === 'downloadable') return 'downloadable';8788 return 'unsupported';89}90```9192De specifieke code verandert, maar het patroon blijft: je checkt de beschikbaarheid, legt eventuele downloads uit, biedt fallbacks aan en meet de kwaliteit.9394## Terugval is geen triest plan B9596Terugval in de cloud is geen nederlaag. Het maakt deel uit van het product.9798```typescript99interface AiRequest {100 task: 'summarize' | 'rewrite' | 'classify';101 input: string;102}103104interface AiResult {105 output: string;106 runtime: 'local' | 'cloud';107}108109export async function runAiTask(request: AiRequest): Promise<AiResult> {110 const local = await tryLocalAi(request);111112 if (local) {113 return { output: local, runtime: 'local' };114 }115116 const cloud = await fetch('/api/ai', {117 method: 'POST',118 headers: { 'Content-Type': 'application/json' },119 body: JSON.stringify(request),120 }).then((res) => res.json());121122 return { output: cloud.output, runtime: 'cloud' };123}124```125126Met deze architectuur kunt u geleidelijk verbeteren. Degenen met lokale ondersteuning krijgen betere latentie en privacy. Degenen die het niet hebben, gebruiken de functie nog steeds. U kunt het percentage lokale verzoeken, tijden, fouten, geheugen, waargenomen kwaliteit en kosten meten.127128Zonder statistieken wordt AI op het apparaat een esthetische keuze. Met statistieken wordt het een producthefboom.129130## De UX van het model is belangrijk131132Als de browser een model moet downloaden, neemt de gebruiker dit waar. Verberg het niet achter een vage spinner. Voor alle duidelijkheid: "We bereiden het model voor om deze functie sneller en zelfs offline te gebruiken."133134Een goede ervaring:135136- toont de bereidingsstatus;137- blokkeert niet de hele pagina;138- stelt u in staat door te gaan met cloud-fallback;139- vermijd batterij- en geheugenverrassingen;140- onthoud het model waar mogelijk;141- leg het voordeel in één concrete zin uit.142143Het ergste is een "slimme" functie die kapot lijkt te zijn omdat er iets stil wordt gedownload.144145## Privacy: beter, niet automatisch veilig146147Het verwerken van gegevens op het apparaat kan een groot voordeel zijn. Een concept-e-mail, intern document of persoonlijke notitie hoeft uw browser niet te verlaten om een suggestie te ontvangen.148149Lokaal betekent echter niet automatisch veilig. U moet echter nadenken over:150151- XSS;152- onbedoelde logboeken;153- gegevens opgeslagen in opslag;154- snelle injectie van niet-vertrouwde inhoud;155- machtigingen verleend aan het model;156- uitgangen die worden gebruikt in automatische acties.157158Als een lokaal model een webpagina kan lezen en vervolgens een formulier kan invullen, kan die pagina proberen deze te manipuleren. Als het gereedschap kan oproepen, is bevestiging nodig. Als het gestructureerde output oplevert, moet het gevalideerd worden. Het feit dat het op het apparaat draait, vermindert enkele privacyrisico's, maar elimineert het beveiligingsmodel niet.159160## Waar het echt interessant wordt161162De tekst is nog maar het begin. WebGPU maakt webervaringen geloofwaardig die tot voor kort een native app leken:163164- complexe 3D-editors;165- Gaussiaanse splatting in de browser;166- real-time videofilters;167- Lichtgewicht CAD;168- wetenschappelijke visualisaties;169- creatieve tools met direct voorbeeld;170- visie-inferentie nabij de gebruikersinterface;171- ambitieuzere browsergames.172173Hier beginnen frontend, graphics en machine learning zich te vermengen. Het is een wat lastig gebied, maar ook een vruchtbaar gebied: de browser wordt weer een serieus applicatieplatform, niet alleen de plek waar we formulieren en dashboards plaatsen.174175## Controlelijst vóór productie176177Voordat ik een functie op het apparaat aan gebruikers beschikbaar stel, zou ik het volgende controleren:1781791. Doelbrowsers en apparaten.1802. Terugval in de cloud of elegante degradatie.1813. Download tijd- en modelcache.1824. Geheugen en batterij op gemiddelde hardware.1835. Kwaliteit vergeleken met de cloudversie.1846. Privacybeleid en gebruikersberichten.1857. Testen met vijandige input.1868. Afzonderlijke statistieken voor lokale runtime en cloudruntime.1879. Plan om de sjabloon bij te werken of uit te schakelen.188189Het is een concrete lijst omdat het probleem concreet is. Een trage, kwetsbare of ondoorzichtige AI-functie wordt niet beter alleen omdat deze in de browser draait.190191## Het juiste compromis192193Ik geloof niet dat de toekomst “alles op het apparaat” is. En ik denk ook niet dat de cloud de enige redelijke plaats voor gevolgtrekkingen zal blijven. De meest waarschijnlijke toekomst is een mix: lokaal als het de latentie, privacy of kosten verbetert; cloud wanneer kwaliteit, bijgewerkte gegevens en gecentraliseerde controle nodig zijn.194195WebGPU, WebNN en ingebouwde AI API’s maken de browser niet almachtig. Ze maken hem volwassener. En voor degenen die webproducten bouwen is dit groot nieuws.196197## Nuttige bronnen198199- [WebGPU-API - MDN](https://developer.mozilla.org/en-US/docs/Web/API/WebGPU_API)200- [WebGPU-specificatie - W3C](https://www.w3.org/TR/webgpu/)201- [Ingebouwde AI - Chrome voor ontwikkelaars](https://developer.chrome.com/docs/ai/built-in)202- [Ingebouwde AI API's - Chrome voor ontwikkelaars](https://developer.chrome.com/docs/ai/built-in-apis)203- [WebNN-API](https://webnn.io/)204
:WebGPU en AI op het apparaat: de browser wordt een serieuze runtimelines 1-204 (END) — press q to close