コンテンツにスキップ

パフォーマンス診断

ONNX Runtime Webは高速で効率的になるように設計されていますが、アプリケーションのパフォーマンスに影響を与える多くの要因があります。このドキュメントでは、ONNX Runtime Webでのパフォーマンス問題を診断する方法についてのガイダンスを提供します。

開始する前に、ONNX Runtime Webがモデルを正常に読み込んで実行することを確認してください。問題が発生した場合は、まずトラブルシューティングガイドを参照してください。

  • TOC

一般的なパフォーマンスのヒント

Section titled “一般的なパフォーマンスのヒント”

アプリケーションのパフォーマンスを向上させるための一般的なヒントをいくつか紹介します:

Webシナリオに適したモデルを選択してください。大きすぎるまたは複雑すぎるモデルは、性能の低いハードウェアでは効率的に実行されない可能性があります。通常、モデルの「tiny」または「small」バージョンがWebアプリケーションでより一般的に使用されます。これは大きなモデルを使用できないという意味ではありませんが、読み込み時間の長期化と推論の遅延によるユーザーエクスペリエンスへの潜在的な影響を認識しておく必要があります。

適切な実行プロバイダーを使用する

Section titled “適切な実行プロバイダーを使用する”

シナリオに適した実行プロバイダーを選択してください。

  • WebAssembly (wasm): これはONNX Runtime WebのデフォルトCPU実行プロバイダーです。非常に小さなモデルまたはGPUが利用できない環境で使用してください。

  • WebGPU (webgpu): これはデフォルトのGPU実行プロバイダーです。デバイスがWebGPUをサポートする適切なGPUを持っている場合に使用してください。

  • WebNN (webnn): これはWeb上でネイティブに近いパフォーマンスを提供する可能性があるオプションです。現在、ブラウザではデフォルトでサポートされていませんが、ブラウザの設定でWebNN機能を手動で有効にできます。

  • WebGL (webgl): この実行プロバイダーは、WebGPUをサポートしない古いデバイスでGPUを使用してモデルを実行するように設計されています。

診断機能を使用して、モデルの実行に関する詳細情報を取得してください。これは、モデルのパフォーマンス特性を理解し、潜在的な問題やボトルネックを特定するのに役立ちます。

WebAssembly(wasm)実行プロバイダーを使用している場合、以下のヒントを使用してアプリケーションのパフォーマンスを向上させることができます:

マルチスレッディングを有効にする

Section titled “マルチスレッディングを有効にする”

環境がサポートしている場合は、常にマルチスレッディングを有効にしてください。マルチスレッディングは、複数のCPUコアを活用することで、アプリケーションのパフォーマンスを大幅に向上させることができます。

この機能はONNX Runtime Webでデフォルトで有効になっていますが、crossOriginIsolatedモードが有効な場合にのみ動作します。詳細についてはhttps://web.dev/cross-origin-isolation-guide/を参照してください。

ort.env.wasm.numThreadsフラグを使用して、使用するスレッド数を設定することもできます。

// スレッド数を4に設定
ort.env.wasm.numThreads = 4;
// マルチスレッディングを無効にする
ort.env.wasm.numThreads = 1;
// ONNX Runtime Webに使用するスレッド数を決定させる
ort.env.wasm.numThreads = 0;

詳細についてはAPI reference: env.wasm.numThreadsを参照してください。

量子化モデルを使用している場合は、uint8量子化モデルを優先してください。float16はCPUでネイティブにサポートされておらず、遅くなるため、可能であればfloat16モデルは避けてください。

プロキシワーカーを有効にする

Section titled “プロキシワーカーを有効にする”

プロキシワーカーは、ONNX Runtime Webが重い計算を別のWeb Workerにオフロードできる機能です。プロキシワーカーを使用してもモデルのパフォーマンスは向上しませんが、UIの応答性を向上させてユーザーエクスペリエンスを改善できます。

ONNX Runtime WebをWeb Workerにインポートしておらず、モデルの推論に時間がかかる場合は、プロキシワーカーを有効にすることをお勧めします。

// プロキシワーカーを有効にする
ort.env.wasm.proxy = true;

詳細についてはAPI reference: env.wasm.proxyを参照してください。

WebGPU実行プロバイダーを使用している場合、以下のヒントを使用してアプリケーションのパフォーマンスを向上させることができます:

グラフキャプチャの使用を試す

Section titled “グラフキャプチャの使用を試す”

機能の紹介についてはGraph captureを参照してください。

モデルが静的形状を持ち、すべての計算カーネルがWebGPU EPで実行されている場合、動的形状で入力データを供給する必要がない限り(例:トランスフォーマーベースのデコーダーモデル)、グラフキャプチャ機能を有効にすることを試すことができます。静的形状入力でも、この機能はすべてのモデルで常に動作するわけではありません。試してみて、モデルで動作するかどうかを確認できます。動作しない場合、モデルの初期化が失敗し、このモデルに対してこの機能を無効にできます。

自由次元オーバーライドの使用を試す

Section titled “自由次元オーバーライドの使用を試す”

機能の紹介についてはFree dimension overrideを参照してください。

自由次元オーバーライドの使用は必ずしもパフォーマンスを向上させるわけではありません。これはモデルによって異なります。試してみて、モデルで動作するかどうかを確認できます。パフォーマンスの低下やメモリ使用量の増加が見られる場合は、この機能を無効にすることができます。

GPU上でテンソルデータを保持することを試す

Section titled “GPU上でテンソルデータを保持することを試す”

機能の紹介についてはKeep tensor data on GPU (IO binding)を参照してください。

GPU上でテンソルデータを保持することで、CPUとGPU間の不要なデータ転送を回避でき、パフォーマンスを向上させることができます。モデルに対してこの機能を使用する最適な方法を見つけてください。

この機能を使用する際は、GPU tensor life cycle managementに注意してください。

プロファイリングを有効にして、モデルの実行に関する詳細情報を取得できます。これは、モデルのパフォーマンス特性を理解し、潜在的なボトルネックを特定するのに役立ちます。

CPUプロファイリングを有効にするには:

  • ステップ1: セッションオプションでenableProfilingオプションを指定:

    const mySessionOptions = {
    ...,
    enableProfiling: true
    };

    このオプションを指定することで、ONNX Runtime Webは各実行のCPUプロファイリングデータを収集します。

  • ステップ2: 推論後にプロファイリングデータを取得:

    mySession.endProfiling();

    endProfiling()を呼び出した後、プロファイリングデータがコンソールに出力されます。

    プロファイリングデータの使用方法についてはIn Code Performance Profilingを参照してください。

WebGPUプロファイリングを有効にするには:

  • ort.env.webgpu.profiling = { mode: 'default' }を設定してWebGPUプロファイリングを有効にします。GPUプロファイリングデータは[profiling]プレフィックス付きでコンソールに出力されます。

  • または、プロファイリングデータを処理する関数でort.env.webgpu.profilingを設定できます:

    ort.env.webgpu.profiling = {
    mode: 'default',
    ondata: (data) => {
    // プロファイリングデータを処理
    }
    };

    詳細についてはAPI reference: env.webgpu.profilingを参照してください。

以下のフラグを指定してトレースを有効にできます:

ort.env.trace = true;

この機能はconsole.timeStampを使用してトレースデータをログに記録します。ブラウザのパフォーマンスツールを使用してトレースデータを分析できます。

詳細についてはAPI reference: env.traceを参照してください。

ログレベルを’verbose’に設定して、より詳細なログを取得できます:

ort.env.logLevel = 'verbose';

詳細についてはAPI reference: env.logLevelを参照してください。

以下のフラグを指定してデバッグモードを有効にできます:

ort.env.debug = true;

デバッグモードでは、ONNX Runtime Webはモデルの実行に関する詳細情報をログに記録し、追加のチェックも適用します。通常、デバッグログを表示するにはverboseログレベルを使用する必要があります。

詳細についてはAPI reference: env.debugを参照してください。

プロファイリングデータの分析

Section titled “プロファイリングデータの分析”

この部分は作成中です。