[C++] Tensor RT 사용해보기 – 1

Tensor RT

TensorRT

 

NVIDIA® TensorRT™ is an SDK that facilitates high-performance machine learning inference. It is designed to work in a complementary fashion with training frameworks such as TensorFlow, PyTorch, and MXNet.

Tensor RT(이하 TRT)여러 프레임워크[1]로부터 생성된 모델을 최적화하여 추론 속도를 높이는 라이브러리이다. 현재 MFC의 CImage를 이용하여 이미지를 다루고 있으며 pyTorch로 학습된 파일을 MFC에 사용하려고 연구중이다.

환경

개발 환경을 잘 맞추는게 반 이상인 것 같다. CUDA / cuDNN 등 여러 버전이 설치되어 있다면 환경변수를 설정하여 알맞게 사용해야 한다. 개발환경이 맞지 않으면 되는것도 아니고 안되는것도 아닌 이도저도 아닌 상황이 온다.

  • Windows 10 pro
    • Visual studio 2015(vs140)
  • nVIDIA RTX 3070 (Arch ampere compute_86,sm_86)
    • CUDA 11.3
    • cuDNN 8.4.1
    • TensorRT 8.4.1.5

 

사용법

빌드 시 관련 라이브러리[2] 모두 링커 및 사용자 빌드 환경 구성으로 CUDA 11.3 선택 후 진행

빌드 후 bin 폴더에 있는 필요한 모든 .dll 파일을 실행 파일 경로에 추가

 

C++ API 프로세스

TRT 8.0 기준이며 prefix로 ‘I’를 사용

  1. build
    1. TRT 전용 로그(ILogger) 생성
    2. builder 생성 – nvinfer1::createInferBuilder(TRT Logger)
    3. network optimizing 및 생성 – builder->createNetworkV2(kEXPLICIT_BATCH) onnx 모델일 때
    4. parser 생성 – nvonnxparser::createParser(network, logger) 모델에 따라 parser가 다름
    5. config 생성 – builder->createBuilderConfig();
    6. destory
  2. deserializing a plan
    1. runtime 생성
    2. runtime으로 engin 생성
    3. engin context 생성
  3. Set buffer
    1. engin 바인딩 개수(input/output)만큼 차원 및 데이터 타입 세팅
      1. void *buffer[input/output 수];
      2. cudaMalloc() 을 이용하여 device buffer 생성
      3. malloc()를 이용하여 host buffer 생성
      4. cudaMemCpy()를 이용하여 input/output 전달 및 가져오기
      5. output 결과 중 가장 큰 값

 

현재까지 진행된 상황

 

현재 문제는 CImage에 적재된 이미지를 어떻게 전달할 것인가이다. *.onnx 파일로 변환 시 batch size, channel, height, width 를 입력하여 input size를 결정한다.

CImage 는 unsigned char* 또는 BYTE 데이터형을 사용하여 1byte씩 다루며, engine에 들어갈 input data는 float16 즉 4byte 이다. 각 픽셀에서 RGB 값을 따로 구해서 해보았지만 예상된 결과가 나오지 않아 계속 연구중이다.


  1. TensorFlow, Keras, pyTorch, sonnet, mxnet 등이 있다. ↩︎
  2. CUDA / cuDNN / TensorRT를 설치하면 bin, include, lib 디렉토리가 있는것을 확인할 수 있는데 빌드 시 링크해야 할 파일은 lib 하위 파일, 빌드 후 런타임 시 필요한 파일은 bin파일에 있다. ↩︎

게시됨

카테고리

작성자

%d 블로거가 이것을 좋아합니다: