一、背景說明

近期因專案接觸到 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 ,相同問題隨即複現直到移除後方恢復,以上就是本篇紀實內容。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐