Onnxruntime c++ gpu 속도느림이슈 문의드려요

안녕하새요!
파이토치로 모델을 훈련시키고 onnxruntime 으로 mfc 에 배포해서 서용하려고합니다.
Cpu 로 실행은 잘 되는데요 gpu로 하는경우 cpu 보다 느리네요!

환경은 다음과 같아요
CUDA 11.4
CUDNN 8.2.2
ONNXRUNTIME 1.12.1(NUGET PACKAGE설치)

아래는 gpu로 바꾼다고 추가한 소스입니다

// create session
Ort::SessionOptions session_options ;

OrtCUDAProviderOptions options;
options.device_id = 0;
options.arena_extend_strategy = 0;
options.gpu_mem_limit = 2 * 1024 * 1024 * 1024;
options.cudnn_conv_algo_search = OrtCudnnConvAlgoSearch::OrtCudnnConvAlgoSearchExhaustive;
options.do_copy_in_default_stream = 1;
session_options.AppendExecutionProvider_CUDA(options);

session_options.SetGraphOptimizationLevel(GraphOptimizationLevel::ORT_ENABLE_EXTENDED);

session = Ort::Session(env, modelPath, session_options);

혹시 gpu를 사용하는 방법이나 다른 방법을 아시는분은 감사합니다.

  • 아래 답변은 OpenAI의 GPT-3.5(ChatGPT) 모델로 자동 생성한 것으로, 정확하지 않을 수 있습니다.
  • 잘못된 답변을 보셨다면 댓글로 첨삭 지도 부탁드립니다. :sweat_smile:

안녕하세요! onnxruntime을 사용하여 GPU로 모델을 실행하는 경우 CPU보다 느린 문제가 발생하고 있다고 하셨군요. 이 문제를 해결하기 위해서는 다음과 같은 몇 가지 방법을 시도해 볼 수 있습니다.

  1. CUDA 및 cuDNN 버전 확인
    onnxruntime에서 GPU를 사용하여 모델을 실행할 때, CUDA 및 cuDNN 버전이 호환되어야 합니다. 따라서 CUDA 및 cuDNN 버전이 올바르게 설치되어 있는지 확인해 보시기 바랍니다. 이를 확인하는 방법은 다음과 같습니다.

    import torch
    print(torch.version.cuda)  # 현재 설치된 CUDA 버전 확인
    print(torch.backends.cudnn.version())  # 현재 설치된 cuDNN 버전 확인
    

    위 코드를 실행하여 현재 설치된 CUDA 및 cuDNN 버전을 확인한 후, onnxruntime에서 사용하는 CUDA 및 cuDNN 버전과 호환되는지 확인해 보시기 바랍니다.

  2. GPU 메모리 할당량 확인
    GPU 메모리 할당량이 충분하지 않으면 모델 실행 속도가 느려질 수 있습니다. 따라서 GPU 메모리 할당량이 충분한지 확인해 보시기 바랍니다. 이를 확인하는 방법은 다음과 같습니다.

    import torch
    print(torch.cuda.get_device_properties(0).total_memory)  # GPU 0의 총 메모리 확인
    

    위 코드를 실행하여 GPU의 총 메모리를 확인한 후, onnxruntime에서 사용하는 GPU 메모리 할당량과 비교해 보시기 바랍니다.

  3. onnxruntime 세션 옵션 변경
    onnxruntime 세션 옵션을 변경하여 GPU로 모델을 실행할 때 더 빠르게 실행할 수 있습니다. 예를 들어, 다음과 같은 옵션을 추가해 보시기 바랍니다.

    OrtCUDAProviderOptions options;
    options.device_id = 0;
    options.arena_extend_strategy = 0;
    options.gpu_mem_limit = 2 * 1024 * 1024 * 1024;
    options.cudnn_conv_algo_search = OrtCudnnConvAlgoSearch::OrtCudnnConvAlgoSearchExhaustive;
    options.do_copy_in_default_stream = 1;
    session_options.AppendExecutionProvider_CUDA(options);
    

    위 코드에서 gpu_mem_limit는 GPU에 할당할 메모리의 양을 지정하는 옵션입니다. 이 값을 적절히 조정하여 GPU 메모리 할당량을 조절할 수 있습니다. 또한, cudnn_conv_algo_search는 cuDNN 컨볼루션 알고리즘을 검색하는 방법을 지정하는 옵션입니다. 이 값을 OrtCudnnConvAlgoSearchExhaustive로 설정하면 모든 가능한 알고리즘을 검색하여 가장 빠른 알고리즘을 선택할 수 있습니다.

위 방법들을 시도해 보시고 여전히 문제가 발생한다면, onnxruntime 버전을 업그레이드하거나 다른 라이브러리를 사용해 보시기 바랍니다. 또한, 모델의 구조나 데이터 전처리 방법 등도 모델 실행 속도에 영향을 미칠 수 있으므로, 이 부분도 확인해 보시기 바랍니다.


  • 답변이 어떠셨나요? 괜찮았다고 생각하신다면 아래 :heart:를 한 번 눌러주시길 부탁드려요!
  • 아래 답변은 OpenAI의 GPT-4 모델로 자동 생성한 것으로, 정확하지 않을 수 있습니다.
  • 잘못된 답변을 보셨다면 댓글로 첨삭 지도 부탁드립니다. :sweat_smile:

안녕하세요!

먼저, ONNX Runtime GPU 속도가 느린 문제를 해결하기 위해 몇 가지 확인해야 할 사항이 있습니다.

  1. ONNX 모델 최적화: ONNX 모델을 변환할 때 최적화를 수행했는지 확인하십시오. 이를 통해 모델의 크기를 줄이고 실행 속도를 높일 수 있습니다. 최적화 방법은 다음과 같습니다.
import onnx
from onnx import optimizer

# Load the ONNX model
model = onnx.load("your_model.onnx")

# Optimize the model
optimized_model = optimizer.optimize(model)

# Save the optimized model
onnx.save(optimized_model, "optimized_model.onnx")
  1. ONNX Runtime에서 세션 옵션 설정: GraphOptimizationLevel을 ORT_ENABLE_ALL로 설정하여 ONNX Runtime에서 모든 최적화를 활성화합니다.
session_options.SetGraphOptimizationLevel(GraphOptimizationLevel::ORT_ENABLE_ALL);
  1. GPU 메모리 제한 및 cuDNN 알고리즘 검색 옵션 조정: GPU 메모리 제한을 늘리거나 줄이고, cuDNN 알고리즘 검색 옵션을 변경하여 성능에 어떤 영향을 미치는지 확인해 보십시오.

  2. ONNX Runtime 버전 확인: 최신 버전의 ONNX Runtime을 사용하고 있는지 확인하십시오. 최신 버전은 성능 향상 및 버그 수정이 포함되어 있습니다.

  3. 모델 병렬 처리: 배치 크기를 늘려서 GPU를 최대한 활용할 수 있는지 확인하십시오. 이렇게 하면 GPU가 더 많은 작업을 동시에 처리할 수 있습니다.

만약 위의 방법들로도 속도가 개선되지 않는다면, ONNX Runtime이 아닌 다른 프레임워크를 사용하여 배포를 고려해 볼 수 있습니다. 예를 들어, NVIDIA TensorRT는 GPU 가속을 위해 최적화된 딥 러닝 추론 라이브러리입니다. PyTorch 모델을 TensorRT로 변환하려면 torch2trt를 사용할 수 있습니다.

이러한 방법 중 하나를 시도하여 문제가 해결되기를 바랍니다. 추가 질문이나 도움이 필요하시면 알려주세요!


  • 답변이 어떠셨나요? 괜찮았다고 생각하신다면 아래 :heart:를 한 번 눌러주시길 부탁드려요!
1개의 좋아요

와 챗지피티가 무플 방지까지 해주네요
4.0 감사합니다 한번 해볼께요

저 혹시... 이거 여쭤봐도 되는지 ㅠㅠ

sessionOptions.AppendExecutionProvider_CUDA(cudaOption);
에서 아예 프로그램 꺼져버리는데 어찌해결해야하는지요 ㅠㅠ

로그도 아무것도 안나와서 하... 힘드네요

안녕하세여
저도 저 문법은 안되서 구 문법으로 해결했습니다.

아래링크에서

이부분 한줄만 추가해도 잘되더라고요
#ifdef USE_CUDA
Ort::ThrowOnError(OrtSessionOptionsAppendExecutionProvider_CUDA(session_options, 0));
#endif

1개의 좋아요

라이브러리 dll파일을 실행파일이랑 같이 안 가져다놔서 그랬습니다. 그래도 답변달아주셔서 감사합니다!!

1개의 좋아요