WebGPU が実用段階に入った — ブラウザ内で GPU をフル活用する

Chrome 113・Safari 18 で本番対応済みの WebGPU。WebGL との根本的な違いはコンピュートシェーダー。ML 推論・大量データ可視化・動画エフェクトへの実用的な活用法を解説する。

「ブラウザで GPU が使える」という話が出てきてから、ずいぶん経つ。

ただずっと「実験的な機能」「Flag を立てないと動かない」「Firefox では無理」という状態が続いていて、本番に持ち込める雰囲気じゃなかった。そのまま「面白そうだけど時期尚早」として棚に上げていた人も多いはずだ。

それが変わった。Chrome 113 と Safari 18 で WebGPU が本番対応になった。棚から下ろすタイミングが来た。

WebGL と何が違うのか

WebGL は 2011 年に生まれた「GPU をブラウザから使う API」。15 年間、3D グラフィックスとゲームを支えてきた。

でも WebGL には大きな制約があった。描画専用なのだ。GPU の能力を「ピクセルを塗る」ことにしか使えない。

WebGPU はその制約を取り払った。Vulkan・Metal・Direct3D 12 という現代の GPU API を統一インターフェースで包んでいて、描画だけじゃなく汎用の並列計算もできる。

WebGL  = 「描画する」だけ
WebGPU = 「描画する」 + 「大量計算する」

この「大量計算」の部分が、話を面白くしている。

GPU が「数で押す」とはどういうことか

CPU と GPU の違いを一言で言うと、少数精鋭か、数で押すか

CPU は少数の超高性能なコアを持つ。複雑な処理や分岐を素早くこなす。GPU は数千〜数万の小さなコアを持つ。同じ処理を大量に並列で走らせる。

1920×1080 の画像をグレースケールに変換するとしよう。CPU でやるとピクセルを 1 個ずつ順番に処理する——207 万回のループだ。GPU なら 207 万ピクセルを同時に処理できる。

WebGPU のコンピュートシェーダーは、この並列処理能力を「描画以外のことに使う」ための仕組み。これが WebGL に無くて WebGPU にあるもの、本質的な違いはここだけといっていい。

/* WGSL(WebGPU Shading Language) でグレースケール変換 */
@compute @workgroup_size(8, 8)
fn main(@builtin(global_invocation_id) id: vec3u) {
  let pixel = textureLoad(inputTex, id.xy, 0);
  let gray = dot(pixel.rgb, vec3f(0.299, 0.587, 0.114));
  textureStore(outputTex, id.xy, vec4f(gray, gray, gray, pixel.a));
}

@workgroup_size(8, 8) は「8×8 = 64 スレッドを同時実行する」という宣言。これで 1920×1080 の変換が 1ms 以下で終わる。CPU でやるより桁違いに速い。

実際に使われているのはこの 3 用途

ブラウザ内 ML 推論

TensorFlow.js は WebGPU バックエンドを正式サポートしている。1 行で切り替わる。

import * as tf from '@tensorflow/tfjs';
await tf.setBackend('webgpu');

モデルによっては WebGL バックエンドの 3〜5 倍速くなる。顔認識・姿勢推定・画像分類がサーバーなしでブラウザ完結する。インフラコストがゼロ。プライバシーの観点でも、データがサーバーに送られないのは強い。

大量データのリアルタイム可視化

地図・金融チャート・ネットワークグラフなど、100 万点を超えるデータをリアルタイムで動かす用途。CPU では秒単位かかる処理が GPU なら 60fps で回る。データ系ダッシュボードで WebGPU に切り替えて劇的に速くなったという報告が増えている。

動画へのリアルタイムエフェクト

WebCodecs でフレームをデコード → WebGPU でシェーダー処理 → Canvas で描画。この組み合わせで、動画へのリアルタイム加工がブラウザ内で完結する。

video.requestVideoFrameCallback(() => {
  const texture = device.importExternalTexture({ source: video });
  applyComputeShader(texture);
});

配信ツールやビデオ会議の背景処理など、「高速な映像処理をブラウザに持ち込む」需要は多い。

WGSL を書かなくても使える

主要ライブラリが WebGPU を裏で使ってくれる。

ライブラリ用途
Three.js (WebGPU Renderer)3D グラフィックス・ビジュアルエフェクト
Babylon.jsゲーム・インタラクティブ 3D
TensorFlow.jsML 推論

ただし Firefox の Stable はまだ未対応。全ユーザーに届ける用途には慎重になった方がいい。navigator.gpu の存在確認と WebGL へのフォールバックは必ず入れる。

if (!navigator.gpu) {
  fallbackToWebGL();
  return;
}
const adapter = await navigator.gpu.requestAdapter({ powerPreference: 'high-performance' });
const device = await adapter.requestDevice();

社内ツール・プレミアム機能・B2B サービスのように「Chrome / Safari で動けばいい」用途なら、今すぐ本番に入れられる。

WebGL の実装限界にぶつかっているなら、これが乗り換える理由になる。ブラウザ内で ML 推論をやりたいなら、選択肢は WebGPU 一択になりつつある。「そのうち」と思っていたなら、そのうちはもう来ている。

元ネタ: https://developer.chrome.com/docs/web-platform/webgpu