C++

C++ | Window C++ OnnxRuntime 설치, 윈도우 cpp onnx runtime install

토오오끼 2025. 10. 20. 23:01
728x90
반응형

 

https://github.com/microsoft/onnxruntime/releases

 

Releases · microsoft/onnxruntime

ONNX Runtime: cross-platform, high performance ML inferencing and training accelerator - microsoft/onnxruntime

github.com

→ 위 페이지에서 onnxruntime-win-x64-gpu-1.22.1.zip 해당 파일을 다운 받은 후 압축을 해제 해 준다.

  • window 환경이면서 gpu를 사용하기 위해 onnxruntime-win-x64-gpu로 다운
  • c++ 컴파일러 버전이 19.44.35216이고 cuda가 12.1라서 1.22.1 다운

→ 압축 해제 한 경로를 빌드 시 설정 해 줘야 한다.

 

생성한 프로젝트 폴더 내 CMakeLists.txt 파일에 아래와 같이 추가 해 주면 된다.

# ORT path
set(ONNXRUNTIME_ROOT "C:/hjyoo/practice/cpp_projects/onnxruntime-win-x64-gpu-1.22.1")
set(ONNXRUNTIME_INCLUDE "${ONNXRUNTIME_ROOT}/include")
set(ONNXRUNTIME_LIBDIR  "${ONNXRUNTIME_ROOT}/lib")

target_include_directories(onnx_test PRIVATE "${ONNXRUNTIME_INCLUDE}")

# onnxruntime.dll
add_library(onnxruntime SHARED IMPORTED)
set_target_properties(onnxruntime PROPERTIES
  IMPORTED_IMPLIB "${ONNXRUNTIME_LIBDIR}/onnxruntime.lib"
  IMPORTED_LOCATION "${ONNXRUNTIME_LIBDIR}/onnxruntime.dll")
target_link_libraries(onnx_test PRIVATE onnxruntime)

# DLL copy
add_custom_command(TARGET onnx_test POST_BUILD
  COMMAND ${CMAKE_COMMAND} -E copy_if_different
    "${ONNXRUNTIME_LIBDIR}/onnxruntime.dll"
    "${ONNXRUNTIME_LIBDIR}/onnxruntime_providers_shared.dll"
    "${ONNXRUNTIME_LIBDIR}/onnxruntime_providers_cuda.dll"
    "$<TARGET_FILE_DIR:onnx_test>/")

→ ORT 경로는 실제로 onnxruntime을 압축 해제 한 경로를 넣어주면 된다.

 

전체 CMakeLists.txt

project(onnx_test)
add_executable(onnx_test onnx_test.cpp)

# ORT path
set(ONNXRUNTIME_ROOT "C:/hjyoo/practice/cpp_projects/onnxruntime-win-x64-gpu-1.22.1")
set(ONNXRUNTIME_INCLUDE "${ONNXRUNTIME_ROOT}/include")
set(ONNXRUNTIME_LIBDIR  "${ONNXRUNTIME_ROOT}/lib")

target_include_directories(onnx_test PRIVATE "${ONNXRUNTIME_INCLUDE}")

# onnxruntime.dll
add_library(onnxruntime SHARED IMPORTED)
set_target_properties(onnxruntime PROPERTIES
  IMPORTED_IMPLIB "${ONNXRUNTIME_LIBDIR}/onnxruntime.lib"
  IMPORTED_LOCATION "${ONNXRUNTIME_LIBDIR}/onnxruntime.dll")
target_link_libraries(onnx_test PRIVATE onnxruntime)

# DLL copy
add_custom_command(TARGET onnx_test POST_BUILD
  COMMAND ${CMAKE_COMMAND} -E copy_if_different
    "${ONNXRUNTIME_LIBDIR}/onnxruntime.dll"
    "${ONNXRUNTIME_LIBDIR}/onnxruntime_providers_shared.dll"
    "${ONNXRUNTIME_LIBDIR}/onnxruntime_providers_cuda.dll"
    "$<TARGET_FILE_DIR:onnx_test>/")

 

onnx_test.cpp

#include <onnxruntime_cxx_api.h>
#include <iostream>

int main() {
    try {
        Ort::Env env(ORT_LOGGING_LEVEL_WARNING, "demo");
        Ort::SessionOptions so;

        // CUDA 먼저 시도 (device 0), 실패하면 CPU로 자동 내려가게 해봄
        try {
            OrtSessionOptionsAppendExecutionProvider_CUDA(so, /*device_id=*/0);
            std::cout << "[INFO] CUDA EP enabled\n";
        } catch (const Ort::Exception& e) {
            std::cout << "[WARN] CUDA EP append failed, using CPU. msg=" << e.what() << "\n";
        }

        const wchar_t* model_path = L"C:/hjyoo/practice/cpp_projects/250827_1-stage_plate_face_S1_Cabin_Youtube_DMS_WIDER_Dataset_250827_v8S-p2_imgsz960_best.onnx";  // 같은 폴더에 간단한 ONNX 모델을 두면 테스트 쉬움
        Ort::Session session(env, model_path, so);

        Ort::AllocatorWithDefaultOptions alloc;
        auto in0  = session.GetInputNameAllocated(0, alloc);
        auto out0 = session.GetOutputNameAllocated(0, alloc);
        std::wcout << L"Input0=" << in0.get() << L", Output0=" << out0.get() << std::endl;

        // 실제 추론은 Ort::Value 텐서를 만들어 session.Run() 호출
        // 여기서는 로딩/EP 동작 확인까지만.
        std::cout << "Session created successfully.\n";
    } catch (const Ort::Exception& e) {
        std::cerr << "[ERR] ORT exception: " << e.what() << "\n";
        return 1;
    }
    return 0;
}

 

빌드

cmake .. -G "Visual Studio 17 2022"

cmake --build ./

 

실행

.\Debug\onnx_text.exe

→ 만약 여기서 cudnn 에러가 발생한다면 환경 변수 설정이 제대로 안 된 것이다. 

2025-09-12 11:13:21.5754536 [E:onnxruntime:demo, provider_bridge_ort.cc:1938 onnxruntime::CudaProviderFactoryCreator::Create] D:\a\_work\1\s\onnxruntime\core\session\provider_bridge_ort.cc:1778 onnxruntime::ProviderLibrary::Get [ONNXRuntimeError] : 1 : FAIL : Error loading "C:\hjyoo\practice\cpp_projects\onnx_cpp\build\Debug\onnxruntime_providers_cuda.dll" which depends on "cudnn64_9.dll" which is missing.

이는 CUDA랑 cudnn이 환경 변수로 설정이 안되어서 생긴 문제이기 대문에 환경 변수 설정에 가서 CUDA랑 cudnn 폴더 추가 해 줘야 한다.

사용자 변수에서 Path를 클릭 후 편집을 눌러 cudnn와 CUDA 경로를 새로 만들기로 추가 해 주면 된다.

이후 파워쉘 터미널에서 아래 명령어들로 제대로 path에 추가 됐는지 확인 가능하다.

where.exe cudnn64_9.dll
where.exe cudart64_12.dll
where.exe cublas64_12.dll
where.exe cublasLt64_12.dll

path에 추가한 경로대로 출력 된다면 제대로 추가 된 것이다.

 

이후 다시 위 cpp 파일을 실행하면 제대로 실행이 될 것이다.

 

 

그럼에도 불구하고 CUDA EP가 로드가 안된다면 터미널 내에서 영구적으로 아래와 같이 PATH에 CUDNN, CUDA 경로를 추가 해 주면 된다.

$cudnn = "C:/Program Files/NVIDIA/CUDNN/v9.11/bin/12.9"
$cuda  = "C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v12.5/bin"

$user = [Environment]::GetEnvironmentVariable('Path','User')
$parts = $user -split ';'
if ($parts -notcontains $cudnn) { $user += ";$cudnn" }
if ($parts -notcontains $cuda)  { $user += ";$cuda" }
[Environment]::SetEnvironmentVariable('Path', $user, 'User')

 

.vscode/launch.json에도 PATH를 추가해 준다.

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Cpp Debugger",
            "type": "cppvsdbg",
            "request": "launch",
            "program": "${command:cmake.launchTargetPath}",   // ← 선택된 CMake 타깃 exe 자동
            "cwd": "${workspaceFolder}",
            "args": [],
            "stopAtEntry": false,
            "environment": [
                {
                    "PATH": "${env:PATH};C:/hjyoo/practice/cpp_projects/sdk/opencv/build/x64/vc16/bin;C:/Program Files/NVIDIA/CUDNN/v9.11/bin/12.9;C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v12.5/bin;"
                  }
            ],
            "console": "integratedTerminal",
            "preLaunchTask": "CMake: build"                   // CMake Tools 기본 빌드 태스크
        }
    ]
}
728x90
반응형