效能診斷

ONNX Runtime Web 旨在快速高效,但有許多因素會影響應用程式的效能。本文件提供了一些關於如何診斷 ONNX Runtime Web 中效能問題的指導。

在開始之前,請確保 ONNX Runtime Web 成功載入並執行您的模型。如果遇到任何問題,請先參閱故障排除指南尋求幫助。

目錄

通用效能提示

以下是一些提高應用程式效能的通用提示

使用正確的模型

選擇適合 Web 場景的模型。過大或過於複雜的模型可能無法在效能較低的硬體上高效執行。通常,“tiny”或“small”版本的模型在 Web 應用程式中更常用。這並不意味著您不能使用更大的模型,但您應該意識到由於更長的載入時間和更慢的推理可能對使用者體驗造成的影響。

使用正確的執行提供者

為您的場景選擇正確的執行提供者。

  • WebAssembly (wasm):這是 ONNX Runtime Web 的預設 CPU 執行提供者。適用於非常小的模型或沒有 GPU 的環境。

  • WebGPU (webgpu):這是預設的 GPU 執行提供者。當裝置具有支援 WebGPU 的良好 GPU 時使用。

  • WebNN (webnn):此選項可以在 Web 上提供接近原生效能的潛力。目前瀏覽器預設不支援,但您可以在瀏覽器設定中手動啟用 WebNN 功能。

  • WebGL (webgl):此執行提供者設計用於在不支援 WebGPU 的舊裝置上使用 GPU 執行模型。

使用診斷功能

使用診斷功能獲取模型執行的詳細資訊。這有助於理解模型的效能特徵並識別潛在問題或瓶頸。

CPU 提示

如果您正在使用 WebAssembly (wasm) 執行提供者,您可以使用以下提示來提高應用程式的效能

啟用多執行緒

如果環境支援,請始終啟用多執行緒。多執行緒可以透過利用多個 CPU 核心顯著提高應用程式的效能。

此功能在 ONNX Runtime Web 中預設啟用,但僅當啟用 crossOriginIsolated 模式時才有效。有關更多資訊,請參閱 https://web.dev/cross-origin-isolation-guide/

您還可以使用標誌 ort.env.wasm.numThreads 來設定要使用的執行緒數。

// Set the number of threads to 4
ort.env.wasm.numThreads = 4;

// Disable multi-threading
ort.env.wasm.numThreads = 1;

// Let ONNX Runtime Web decide the number of threads to use
ort.env.wasm.numThreads = 0;

有關更多詳細資訊,請參閱 API 參考: env.wasm.numThreads

優先使用 uint8 量化模型

如果您正在使用量化模型,請優先使用 uint8 量化模型。如果可能,請避免使用 float16 模型,因為 float16 不受 CPU 原生支援,並且會很慢。

啟用代理工作執行緒

代理工作執行緒是一項功能,允許 ONNX Runtime Web 將繁重計算解除安裝到單獨的 Web Worker。使用代理工作執行緒不能提高模型的效能,但可以提高 UI 的響應能力以改善使用者體驗。

如果您沒有在 Web Worker 中匯入 ONNX Runtime Web,並且模型推理需要一段時間,建議啟用代理工作執行緒。

// Enable proxy worker
ort.env.wasm.proxy = true;

有關更多詳細資訊,請參閱 API 參考: env.wasm.proxy

WebGPU 提示

如果您正在使用 WebGPU 執行提供者,您可以使用以下提示來提高應用程式的效能

嘗試使用圖捕獲

有關功能介紹,請參閱 圖捕獲

如果您的模型具有靜態形狀,並且其所有計算核心都在 WebGPU EP 上執行,您可以嘗試啟用圖捕獲功能,除非您需要輸入動態形狀的資料(例如基於 transformer 的解碼器模型)。即使是靜態形狀輸入,此功能也並非總是適用於所有模型。您可以嘗試一下,看看它是否適用於您的模型。如果它不起作用,模型初始化將失敗,您可以為此模型停用此功能。

嘗試使用自由維度覆蓋

有關功能介紹,請參閱 自由維度覆蓋

使用自由維度覆蓋不一定能提高效能。這很大程度上取決於模型。您可以嘗試一下,看看它是否適用於您的模型。如果您看到效能下降或記憶體使用量增加,可以停用此功能。

嘗試將張量資料保留在 GPU 上

有關功能介紹,請參閱 將張量資料保留在 GPU 上 (I/O 繫結)

將張量資料保留在 GPU 上可以避免 CPU 和 GPU 之間不必要的資料傳輸,從而提高效能。嘗試找出最適合您模型使用此功能的方法。

使用此功能時,請注意GPU 張量生命週期管理

診斷功能

效能分析

您可以啟用效能分析以獲取有關模型執行的詳細資訊。這有助於理解模型的效能特徵並識別潛在瓶頸。

CPU 效能分析

要啟用 CPU 效能分析

  • 步驟1: 在會話選項中指定 enableProfiling 選項
    const mySessionOptions = {
      ...,
      enableProfiling: true
    };
    

    透過指定此選項,ONNX Runtime Web 將為每次執行收集 CPU 效能分析資料。

  • 步驟2: 推理後獲取效能分析資料
    mySession.endProfiling();
    

    呼叫 endProfiling() 後,效能分析資料將輸出到控制檯。

    有關如何使用效能分析資料,請參閱 程式碼內效能分析

WebGPU 效能分析

要啟用 WebGPU 效能分析

  • 設定 ort.env.webgpu.profiling = { mode: 'default' } 以啟用 WebGPU 效能分析。GPU 效能分析資料將以字首 [profiling] 輸出到控制檯。
  • 或者,您可以將 ort.env.webgpu.profiling 設定為一個函式來處理效能分析資料
     ort.env.webgpu.profiling = {
         mode: 'default',
         ondata: (data) => {
             // handle the profiling data
         }
     };
    

    有關更多詳細資訊,請參閱 API 參考: env.webgpu.profiling

追蹤

您可以透過指定以下標誌來啟用追蹤

ort.env.trace = true;

此功能使用 console.timeStamp 記錄追蹤資料。您可以使用瀏覽器的效能工具來分析追蹤資料。

有關更多詳細資訊,請參閱 API 參考: env.trace

日誌級別“verbose”

您可以將日誌級別設定為“verbose”以獲取更詳細的日誌

ort.env.logLevel = 'verbose';

有關更多詳細資訊,請參閱 API 參考: env.logLevel

啟用除錯模式

您可以透過指定以下標誌來啟用除錯模式

ort.env.debug = true;

在除錯模式下,ONNX Runtime Web 將記錄有關模型執行的詳細資訊,並應用一些額外的檢查。通常您需要使用 verbose 日誌級別才能看到除錯日誌。

有關更多詳細資訊,請參閱 API 參考: env.debug

分析效能分析資料

此部分正在建設中。