效能問題故障排除

目錄

以下是評估效能問題時要檢查的事項列表

  • 您是否啟用了所有 圖最佳化?官方釋出的包預設啟用所有最佳化,但如果從原始碼構建,請檢查您的構建中是否啟用了這些最佳化。
  • 您是否搜尋了先前提交的 GitHub 問題,以檢視您的問題是否已被討論過?請在提交新問題之前執行此操作。
  • 如果使用 CUDA 或 TensorRT,您是否安裝了正確版本的依賴庫?CUDA EP / TensorRT EP

為什麼即使將 graph_optimization_level 設定為 ORT_ENABLE_ALL,模型圖也未被最佳化?

來自 IR_VERSION 4 的 ONNX 模型只將出現在圖輸入中的初始化器視為非常量。這可能會阻止一些圖最佳化,如常量摺疊、運算子融合等。如果沒有必要覆蓋初始化器,請透過使用最新的匯出器/轉換器重新生成模型,或使用工具 remove_initializer_from_input.py 將初始化器移出圖輸入。

為什麼我的模型在 GPU 上執行比在 CPU 上執行慢?

根據您使用的執行提供者,它可能無法完全支援模型中的所有運算子。回退到 CPU 操作可能會導致效能速度下降。此外,即使某個操作由 CUDA 執行提供者實現,出於效能原因,它也可能不會將該操作分配/放置到 CUDA EP。要檢視 ORT 決定的放置情況,請開啟詳細日誌並檢視控制檯輸出。

我轉換的 TensorFlow 模型很慢——為什麼?

NCHW 和 NHWC 是 4 維張量的兩種不同記憶體佈局。

CNN 使用的大多數 TensorFlow 操作都支援 NHWC 和 NCHW 資料格式。TensorFlow 團隊建議在 GPU 上 NCHW 更快,但在 CPU 上 NHWC 有時在 TensorFlow 中更快。然而,ONNX 只支援 NCHW。因此,如果原始模型是 NHWC 格式,在模型轉換時可能會新增額外的轉置。 tensorflow-onnx 轉換器確實去除了其中許多轉置,但如果這不足以提供幫助,請考慮以 NCHW 格式重新訓練模型。

我看到高延遲變化。

在某些平臺上,onnxruntime 在推理過程中可能會表現出高延遲變化。這是由 onnxruntime 用於線上程池中並行化任務的常數成本模型引起的。對於每個任務,常數成本模型會計算一個線上程之間並行化的粒度,該粒度在任務執行結束時保持不變。這種方法有時會導致負載不平衡,從而導致高延遲變化。為了緩解這個問題,onnxruntime 提供了一個動態成本模型,可以作為會話選項啟用。

sess_options.add_session_config_entry('session.dynamic_block_base', '4')

只要設定為正值,onnxruntime 執行緒池將以遞減的粒度並行化內部任務。具體來說,假設有一個函式期望由執行緒池執行 N 次,啟用動態成本模型後,池中的每個執行緒都將在

residual_of_N / (dynamic_block_base * num_of_threads)

準備執行時索取任務。因此,在一段時間內,池中的執行緒更可能實現更好的負載平衡,從而降低延遲變化。

出於同樣的原因,動態成本模型也可能線上程更容易被搶佔的情況下改善效能。根據我們的測試,目前為止 dynamic_block_base 的最佳配置是 4,它在保持良好效能的同時降低了方差。

我看到 Windows 上的 CPU 使用率很高

據觀察,對於擁有超過 64 個邏輯核心的機器,透過讓執行緒池使用無鎖任務佇列,可以顯著降低 CPU 使用率,該佇列利用自旋鎖而非互斥鎖進行同步。無鎖任務佇列可以透過從原始碼構建 onnxruntime 並使用以下標誌來啟用:

--use_lock_free_queue