전공관련/Deep Learning

[Onnx] Onnxruntime - GPU를 사용하자

매직블럭 2020. 3. 9. 16:08

지난번 작성한 글에서 class를 생성하여 사용하는 부분까지는 구현을 했다.( https://jangjy.tistory.com/356 )

 

[Onnx] onnx 모듈을 사용하기 위한 class를 만들어보자

onnxruntime 예제코드에는 struct를 생성하여 사용하는 방법이 나와있다. 코드 중 주요 부분만 떼서 보면 아래와 같다. struct ETRI_FV { ETRI_FV() { auto memory_info = Ort::MemoryInfo::CreateCpu(OrtDeviceAl..

jangjy.tistory.com

 

그런데 학습 했던 모델을 이용하여 추론을 돌려보니 이상하게 속도가 느리다..

VS Nuget 패키지가 문제인가.. 이것저것 깔았다 지웠다.. 소스로부터 빌드도 시도 해보고..

아무리 봐도 이건 GPU 에서 도는 속도가 아니라 CPU에서 도는 속도였다..

그래서 찾고 방황하다 github 에 문의 한 결과 답변을 얻을 수 있었다.

 


아주 간단한 문제로, GPU를 사용하기 위해서는 session을 생성할 때 옵션을 지정 해 줘야한다.

#include <cuda_provider_factory.h>

Ort::SessionOptions session_options;
// cuda 사용하기 위해 provider 추가
Ort::ThrowOnError(OrtSessionOptionsAppendExecutionProvider_CUDA(session_option, 0));
// 추가 graph 최적화 옵션 
session_options.SetGraphOptimizationLevel(GraphOptimizationLevel::ORT_ENABLE_EXTENDED);

session_ = new Ort::Session(env, wPath, session_options);

 

CUDA 옵션의 두번째 파라미터는 gpu 번호다.

다중 GPU 환경에서 어느 GPU가 연산을 담당할지 지정 가능하다.

 

별거 아닌 문제였는데 이놈 떄문에 일주일을 까먹었네..

 


22.09.02. 댓글 중 mistral 님의 정보도 도움이 될 수 있을것 같아 본문에 추가하였습니다

 

하루종일 헤메다 안되서 도움을 요청했는데, 그 이후 방법을 찾았습니다.
좀 더 다듬어서 재확인해봐야 할 듯 싶지만, 아마 해결된 것 같습니다.
혹 다른 분들 도움되시라고 남깁니다.
============================================================
public void LoadModel()
{
float[] returnData = new float[100];
returnData = ReturnData();

var input1 = GenerateInputValue(returnData);
var container = new List<NamedOnnxValue>() { input1 };

var modelPath = "model.onnx";
var session = new InferenceSession(modelPath);

//Run the inference
using (var results = session.Run(container))
{
// dump the results
foreach (var r in results)
{
string result = string.Format("Output for {0}", r.Name);
string pred = r.AsTensor<float>().GetArrayString();
}
}


}

private NamedOnnxValue GenerateInputValue(float[] inputValue)
{
float[][] inputData = new float[][] { inputValue };
int[] dimensions = new int[] { 1, 100, 1 };
var tensor = new DenseTensor<float>(inputData[0], dimensions);
return NamedOnnxValue.CreateFromTensor("input", tensor);
}