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’를 사용
- build
- TRT 전용 로그(ILogger) 생성
- builder 생성 – nvinfer1::createInferBuilder(TRT Logger)
- network optimizing 및 생성 – builder->createNetworkV2(kEXPLICIT_BATCH) onnx 모델일 때
- parser 생성 – nvonnxparser::createParser(network, logger) 모델에 따라 parser가 다름
- config 생성 – builder->createBuilderConfig();
- destory
- deserializing a plan
- runtime 생성
- runtime으로 engin 생성
- engin context 생성
- Set buffer
- engin 바인딩 개수(input/output)만큼 차원 및 데이터 타입 세팅
- void *buffer[input/output 수];
- cudaMalloc() 을 이용하여 device buffer 생성
- malloc()를 이용하여 host buffer 생성
- cudaMemCpy()를 이용하여 input/output 전달 및 가져오기
- output 결과 중 가장 큰 값
- engin 바인딩 개수(input/output)만큼 차원 및 데이터 타입 세팅
현재까지 진행된 상황
현재 문제는 CImage에 적재된 이미지를 어떻게 전달할 것인가이다. *.onnx 파일로 변환 시 batch size, channel, height, width 를 입력하여 input size를 결정한다.
CImage 는 unsigned char* 또는 BYTE 데이터형을 사용하여 1byte씩 다루며, engine에 들어갈 input data는 float16 즉 4byte 이다. 각 픽셀에서 RGB 값을 따로 구해서 해보았지만 예상된 결과가 나오지 않아 계속 연구중이다.