所要時間: 約40分 | 難易度: ★★★☆☆
この記事で作るもの
- ブラウザ上でLlama 3などのLLMを爆速で動かすチャットアプリ
- Python不要、ライブラリのインストールも最小限で済むJavaScript実装
- 前提知識:JavaScriptの基本的な文法がわかること
- 必要なもの:モダンブラウザ(Chrome/Edge)、インターネット環境
📦 この記事に関連する商品(楽天メインで価格確認)
RTX 4060 Ti 16GBVRAM 16GBでLlama 3などの量子化モデルを余裕を持ってブラウザ実行できる
※アフィリエイトリンクを含みます
先に確認するスペック・料金
ブラウザでAIを動かす「WebGPU」をフル活用するため、ハードウェアの制限がいくつかあります。
まず、GPUは必須です。NVIDIAのRTX 30シリーズ以降、またはApple Silicon(M1/M2/M3/M4)を搭載したMacを推奨します。VRAM(ビデオメモリ)は、Llama 3の軽量モデル(4bit量子化版)を動かすなら最低でも6GB、快適に動かすなら8GB以上が理想です。
もしVRAMが4GB以下の古いノートPCを使っている場合、推論中にブラウザがクラッシュしたり、極端にレスポンスが低下したりする可能性があります。その場合は、モデルのサイズをさらに落とす(Gemma 2 2Bなど)という選択肢を検討してください。
ブラウザはChromeの最新版(113以降)を使ってください。SafariやFirefoxはWebGPUの対応が遅れており、現時点では今回の「爆速」の恩恵をフルに受けることができません。
料金については、完全に無料です。APIを叩くわけではなく、モデルをダウンロードしてあなたのPCのGPUで計算するため、サーバー代は1円もかかりません。
なぜこの方法を選ぶのか
ブラウザでAIを動かす手段は、これまでにも「TensorFlow.js」や「ONNX Runtime Web」がありました。しかし、今回のHugging Faceによる「WebGPUカーネルの最適化」は、それらとは次元が違います。
これまでのWebブラウザでの推論は、GPUの汎用計算機能(WebGL)を無理やり使っている側面があり、ネイティブアプリ(llama.cppなど)に比べて速度が半分以下になることも珍しくありませんでした。
今回公開されたカーネルは、WebGPU専用にスクラッチから最適化されたWGSL(WebGPU Shading Language)で書かれています。私が試したところ、特定の演算において従来の3倍以上のスループットを記録しました。
「Python環境を作るのが面倒」「データを外部に送りたくない」「でも爆速で動かしたい」というニーズに対して、このTransformers.js v3 + WebGPUの組み合わせは現在、唯一無二の最適解です。
Step 1: 環境を整える
まずは、WebGPUが有効な開発環境を作ります。特別なソフトは不要で、標準的なHTMLファイルとローカルサーバーがあれば十分です。
# プロジェクト用のディレクトリを作成
mkdir fast-webgpu-ai
cd fast-webgpu-ai
# VS Codeなどで開き、index.htmlを作成する
touch index.html
次に、ブラウザ側でWebGPUがフルパワーで動くように設定を確認します。
- Chromeを開き、アドレスバーに
chrome://flags/#enable-unsafe-webgpuと入力します。 - 「Unsafe WebGPU Support」を「Enabled」にします。
- ブラウザを再起動します。
⚠️ 落とし穴: 「Unsafe」という名前に不安を感じるかもしれませんが、これは開発者向けに最新機能をフル開放するための設定です。これを有効にしないと、GPUの特定の最適化機能が制限され、本来の速度が出ないことがあります。
Step 2: 基本の設定
Hugging Faceが提供する「Transformers.js v3」を読み込みます。これは、PythonのTransformersライブラリとほぼ同じ感覚でLLMを扱えるJSライブラリです。
<!-- index.html -->
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>WebGPU Fast Inference</title>
</head>
<body>
<h1>WebGPU Local LLM</h1>
<div id="status">準備中...</div>
<div id="output" style="white-space: pre-wrap; border: 1px solid #ccc; padding: 10px; margin-top: 10px;"></div>
<script type="module">
// CDNからTransformers.js v3をインポート
import { pipeline } from 'https://cdn.jsdelivr.net/npm/@xenova/transformers@3.0.0-alpha.0';
// 後ほどここにコードを書きます
</script>
</body>
</html>
なぜCDN(jsdelivr)を使うのかというと、このライブラリ自体が頻繁に更新されており、常に最新の最適化カーネルを利用するためです。
⚠️ 落とし穴: バージョン番号に注意してください。WebGPUの最適化カーネルは v3.0.0-alpha 以降に搭載されています。古いv2系を使うと、WebGPUではなくCPUで動いてしまい、非常に低速になります。
Step 3: 動かしてみる
最小限のコードで、テキスト生成を試してみます。
const status = document.getElementById('status');
const output = document.getElementById('output');
async function runAI() {
try {
status.innerText = 'モデルをロード中(数GBのダウンロードが発生します)...';
// テキスト生成パイプラインの構築
// device: 'webgpu' を指定するのが最大のポイント
const generator = await pipeline('text-generation', 'Xenova/Llama-3-8B-Instruct-q4f16', {
device: 'webgpu',
});
status.innerText = '推論中...';
const prompt = 'WebGPUのメリットを3つ教えてください。';
const result = await generator(prompt, {
max_new_tokens: 128,
temperature: 0.7,
});
output.innerText = result[0].generated_text;
status.innerText = '完了';
} catch (err) {
status.innerText = 'エラー発生: ' + err.message;
console.error(err);
}
}
runAI();
期待される出力
WebGPUのメリットを3つ教えてください。
1. 低遅延なGPUアクセス: 従来のWebGLよりも直接的にGPUリソースを制御でき、高速な計算が可能です。
2. サーバーレスなプライバシー保護: データがデバイス外に出ないため、高いセキュリティを実現します。
3. クロスプラットフォーム: ブラウザさえあれば、Windows、Mac、Androidなど様々な環境で動作します。
(※モデルの応答内容は生成のたびに変わります)
モデル名に q4f16 と付いているのは、4bit量子化されたモデルであることを意味します。これにより、メモリ消費量を劇的に抑えつつ、WebGPUの高速演算を活用できます。
Step 4: 実用レベルにする
今のコードだと、生成が終わるまで画面が止まってしまいます。実用的なアプリにするには、1トークンずつ文字が表示される「ストリーミング」の実装が不可欠です。また、進捗状況(ダウンロード率)を表示するように拡張します。
import { pipeline, TextStreamer } from 'https://cdn.jsdelivr.net/npm/@xenova/transformers@3.0.0-alpha.0';
async function runAIAdvanced() {
const status = document.getElementById('status');
const output = document.getElementById('output');
// 1. パイプラインの初期化(進捗コールバック付き)
const generator = await pipeline('text-generation', 'Xenova/Llama-3-8B-Instruct-q4f16', {
device: 'webgpu',
progress_callback: (data) => {
if (data.status === 'progress') {
status.innerText = `ダウンロード中: ${data.progress.toFixed(1)}%`;
}
}
});
// 2. ストリーマーの設定
// 生成されたトークンを随時、画面に書き出す
const streamer = new TextStreamer(generator.tokenizer, {
on_token: (token) => {
output.innerText += token;
},
});
status.innerText = '入力待ち';
// 3. 生成実行
const prompt = 'AIの将来について短くまとめてください。';
output.innerText = prompt + '\n\n';
await generator(prompt, {
max_new_tokens: 512,
streamer: streamer,
});
status.innerText = '生成完了';
}
runAIAdvanced();
なぜ TextStreamer を使うのか。それは、LLMの推論には時間がかかるため、ユーザーに「動いていること」を即座に伝える必要があるからです。
さらに実務で使うなら、エラーハンドリングに navigator.gpu のチェックを入れるべきです。WebGPUが使えない環境(古いスマホなど)では、自動的にWASM(CPU推論)に切り替えるようなロジックを組むのがプロの仕事です。
よくあるトラブルと解決法
| エラー内容 | 原因 | 解決策 |
|---|---|---|
WebGPU not supported | ブラウザの設定不足か非対応GPU | chrome://flags の確認、またはChrome最新版への更新。 |
Out of memory | VRAM不足 | ブラウザのタブを閉じる。またはより小さいモデル(Gemma-2B等)に変更。 |
| ダウンロードが止まる | ネットワーク断線またはキャッシュ破損 | ブラウザのキャッシュをクリアしてリロード。 |
| 動作が異常に重い | CPUで動いている | device: 'webgpu' が正しく渡されているか確認。 |
次のステップ
ブラウザでこれほどの速度が出るようになった今、次に挑戦すべきは「ブラウザ完結型RAG(検索拡張生成)」です。
transformers.js はテキスト生成だけでなく、文章をベクトル化する「Embedding」もWebGPUで高速に行えます。IndexedDBなどのブラウザ内データベースと組み合わせれば、数千件のドキュメントから必要な情報を探し出し、それをもとに回答するAIアプリが、サーバーなしで作れます。
また、Hugging Faceの Xenova プロフィール ページを覗いてみてください。今回使用したLlama 3以外にも、Phi-3、Whisper(音声認識)、Stable Diffusion(画像生成)など、WebGPU向けに最適化されたモデルが続々とアップロードされています。これらを組み合わせるだけで、マルチモーダルなローカルAIアプリが完成します。
よくある質問
Q1: スマホのブラウザでも動きますか?
Androidの最新のChromeであれば、一部の機種でWebGPUが動作します。ただし、VRAM制限が厳しいため、Llama 3 8Bクラスを動かすのは厳しいです。1B〜2Bクラスのモデル(Qwen2-1.5Bなど)であれば、驚くほどスムーズに動きます。
Q2: 最初に数GBダウンロードされるのが気になります。
はい、初回のモデルダウンロードは避けられません。ただし、一度ダウンロードすればブラウザのキャッシュ(Origin Private File System)に保存されるため、2回目以降は瞬時に起動します。配布する場合は「初回のみデータ通信量に注意」と注釈を入れるのが親切です。
Q3: セキュリティ面で注意点はありますか?
むしろ、WebGPUによるローカル推論はセキュリティ的に最強です。ユーザーの入力データは一切サーバーに送られず、すべてユーザーのPC内で完結します。機密情報を扱う社内ツールなどを構築する場合、これほど適したアーキテクチャはありません。





