日常 Python 紀實: CUDAExecutionProvider Not Available(ONNXRUNTIME)
摘要 本文记录了在使用YOLOv11模型导出ONNX格式时遇到的GPU初始化失败问题。通过交叉测试发现,问题源于onnxruntime与onnxruntime-gpu的版本冲突(1.23.1 vs 1.23.0),后者已包含前者模块导致系统优先调用CPU版本。解决方案为卸载onnxruntime仅保留onnxruntime-gpu,经复现验证后问题解决。环境涉及Python 3.11.9、CUDA
·
一、背景說明
近期因專案接觸到 YOLOv11,身為純純的文科生只覺得既深奧又有趣,於是決定把所見所聞整理成筆記。為提升效能與跨平台相容性,筆者嘗試把訓練模型匯出為 ONNX。起初一切順利,但某個階段開始模型無法初始化,該異常僅在啟用GPU時必出現,經交叉排查並蒐集、驗證網路資訊後,問題總結為:套件(庫)版本衝突。
二、配置規格
01.硬件(體)規格:
處理器:AMD R9-7940HX x1
顯 卡:ASUS RTX-4070(8G)x1
內 存:Kingston DDR5 5600MHz(32GB)x2
存 儲:WD SSD(1TB)x1
系 統:Windows 10 Pro(x64)
02.軟件(體)規格:
語 言:Python 3.11.9、C#
平 台:IDLE、Jupyter、Visual Studio
套 件:onnxruntime(安裝 1.23.1)
onnxruntime-gpu(安裝 1.23.0)
CUDA:12.7(安裝 12.6)
三、交叉排錯
本專案採跨語言互操作架構(C# → Python.NET → Python),因此執行期間的例外/錯誤具有多源性,可能起因於 .NET 環境、Python 依賴與執行時,或互操作(Interop)邊界。因此在問題發生當下進行了以下幾點測試:
[1] 在 Python 傳入模型(.onnx)初始化:FAIL
[2] 在 C# 以 Python.NET 為媒介,傳入模型(.pt)初始化:PASS
[3] 在 C# 透過 Microsoft.ML.OnnxRuntime.DirectML傳入模型(.onnx)初始化 :PASS
根據上述結果得出結論:
[1] ONNX 文件無損毀可運行
[2] Python 代碼(YOLO)正常可運行
四、測試代碼
01.onnxruntime
import onnxruntime as ort
def test_onnx(onnx_path):
print(f"ORT:{ort.__version__}\n")
print(f"Available EPs:{ort.get_available_providers()}\n")
session = ort.InferenceSession(onnx_path,providers=["CUDAExecutionProvider","CPUExecutionProvider"])
print(f"Session EPs:{session .get_providers()}\n")
if __name__ == "__main__":
onnx_path:str = r"路徑"
test_onnx(onnx_path)
02.YOLO
from ultralytics import YOLO
def init_yolo(model_path,task:str="detect"):
return YOLO(model_path,task=task)
def run_yolo(model,source,batch_value=16,device_value=0,imgsz_value=640,conf_value=0.5,iou_val=0.5ue):
return model.predict(source,
batch=batch_value,
device=device_value,
imgsz=imgsz_value,
conf=conf_value,
iou=iou_value)
def main(model_path):
try:
plt = init_yolo(model_path)
result = run_yolo(plt)
except Exception as error:
print(f"Error issue: {error}")
if __name__ == "__main__":
onnx_path:str = r"路徑"
pt_path:str = r"路徑"
main(onnx_path)
main(pt_path)
五、實驗網路資訊
以下是筆者依序嘗試過的方法,雖然無效但每個人的狀況不盡相同,或許適合你也說不定!
01.降級 onnxruntime 至1.20.X:ONNX RUNTIME 官網(匹配 GPU 支持的 CUDA)
02.升級 onnxruntime 至最新版本
03.檢查、加入 NVIDIA GPU Computing Toolkit 路徑到系統環境中
04.檢查 Python 套件有無衝突:onnxruntime、onnxruntime-gpu
後來才知道原來 onnxruntime-gpu 已經包含了 onnxruntime 模塊,如果同時安裝系統會優先使用 onnxruntime 因而導致程式無法找到 CUDAExecutionProvider ,不曉得有沒有辦法可以調整調用順序,反正筆者決定將其移除:pip uninstall onnxruntime -y
六、驗證結果
待移除套件後,果然 Python 正常,C# 正常。為了驗證其必然與相關性,筆者決定裝回 onnxruntime ,相同問題隨即複現直到移除後方恢復,以上就是本篇紀實內容。
更多推荐
所有评论(0)