WebGPU: トラブルシューティングのヒントと修正

François Beaufort
François Beaufort

このドキュメントでは、Chrome ブラウザで WebGPU が動作しない、または想定どおりに動作しない理由について、可能な部分で解決するための明確な手順とともに説明します。

次の例は、navigatorgpu を使用できない場合に発生する JavaScript エラーを示しています。

const adapter = await navigator.gpu.requestAdapter();
cancel Uncaught TypeError: Cannot read properties of undefined (reading 'requestAdapter')

これには、次のいずれかの理由が考えられます。順番に確認してみましょう。

  1. WebGPU を使用するには、ChromeOS、macOS、Windows で Chrome 113 以降、Android で Chrome 121 以降が必要です。chrome://version でバージョンを確認し、必要に応じてアップデートしてください。

  2. 現時点では、Service Worker または共有ワーカーから WebGPU にアクセスできません。Service Worker や共有ワーカーを使用している場合は、WebGPU のコードを専用のワーカーまたはグローバル ウィンドウ コンテキストに移動します。

  3. WebGPU は、セキュアなコンテキストでのみアクセスできます。安全でないプロトコル(http:file: など)でコードを提供する場合は、安全な https: プロトコルを使用するか、ウェブアプリの開発時に次のいずれかの方法でこれに対処します。

    • npx http-server または python3 -m http.server コマンドのいずれかを使用して、ローカルで http://localhost または http://127.0.0.1 でコードを提供します。

    • chrome://flags/#unsafely-treat-insecure-origin-as-secure の「保護されていない発行元を安全なものとして扱う」リストにオリジンを追加し、Chrome を再起動します。

    • Node.js をインストールし、npx servez --ssl を実行して、疑似証明書を使用して HTTPS でフォルダを提供します。Chrome では警告が表示されますが、[詳細設定]、[続行] の順にクリックすると回避できます。

    • ngrok を使用してローカル ウェブサーバーをインターネットに公開します。

GPU アダプタが null です

requestAdapter() を呼び出して取得したアダプタが null の場合に発生する JavaScript エラーの例を次に示します。

const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();
cancel Uncaught TypeError: Cannot read properties of undefined (reading requestDevice)

この原因としては、次のいずれかが考えられます。順番に確認してみましょう。

  1. ユーザーが chrome://settings/system で [グラフィック アクセラレーションが使用可能な場合は使用する] をオフにした場合、WebGPU は無効になります。この設定がオフになっているかどうかを確認し、オンに戻してください

  2. WebGPU はこのプラットフォームではまだサポートされていません。chrome://flags/#enable-unsafe-webgpu フラグを有効にして、Chrome を再起動できます。Linux の試験運用版をサポートするには、chrome://flags/#enable-vulkan フラグも有効にする必要があります。詳しくは、ヘッドレス Chrome での WebGPU のサポートをご覧ください。

  3. GPU ハードウェアはブロックリストに登録されています。chrome://gpu で「WebGPU がブロックリストまたはコマンドラインで無効になっています」と表示される場合は、chrome://flags/#enable-unsafe-webgpu フラグを有効にして Chrome を再起動することで、WebGPU アダプタのブロックリストを無効にできます。

  4. requestAdapter() で渡されたオプションに一致する GPU アダプターがありません。別の方法で requestAdapter() を呼び出してみてください

  5. WebGPU には、ハードウェアまたはソフトウェアでエミュレートされた GPU が必要です。Chrome が GPU を検出したかどうかは、chrome://gpu で確認できます。

WebGPU は WebGL よりも遅い

  1. chrome://gpu を開き、「WebGPU: Hardware accelerated」と表示されていることを確認します。「WebGPU: Software only, Hardware acceleration unavailable」と表示される場合は、GPU ドライバの更新が必要な可能性があります。

  2. WebGL のコンセプトを WebGPU に直接変換する場合、WebGPU 独自の最適化を十分に活用できない場合があります。その違いについては、WebGL から WebGPU へをご覧ください。

Windows 固有の制限事項

Windows デバイスで WebGPU を使用する場合は、次の制限事項に注意してください。

  • Chrome では、複数の GPU アダプターの同時使用はサポートされていません。問題 chromium:329211593 をご覧ください。

  • Chrome では、他の Chrome ワークロードに割り当てられたものと同じ GPU アダプターが常に使用されます。ノートパソコンの場合は、電力消費(省電力)の観点から、通常は統合グラフィック カードが使用されます。これは、requestAdapter() を呼び出すときに powerPreference オプションが影響しないことを意味します。