Knowhow/ONNX, TensorRT

[TensorRT 튜토리얼] 1. Installing TensorRT

침닦는수건 2024. 1. 17. 10:50
반응형

끄적끄적

딥러닝 모델을 써보거나 개발하는 일은 주로 하다보니 자연스레 실제 사용할 수 있는 형태로 가공하는 것까지 이야기가 나왔고, 결국 경량화하는 영역에 닿게 됐다. 경량화라는 이름 범주 안에 knowledge distillation부터 pruning, quantization, architecture search 등 많은 이론적 내용들이 있는데 그것들을 커버하는 것과 별개로, 어떻게 갖고 있는 하드웨어에서 빠르게 동작하도록 만들 것인지도 고려해야 했다. 그래서 가장 유명하고 document가 잘되어 있는 TensorRT를 A to Z 따라가면서 감을 한 번 잡아보고자 한다.

 

나는 컴퓨터 공학과 출신도 아니고 이런 low level(?) 내용을 다루어본 적이 없어서 사실 자신 없는데 구르면서 한 번 배워보려고 한다.

 

https://docs.nvidia.com/deeplearning/tensorrt/quick-start-guide/index.html#install

 

Quick Start Guide :: NVIDIA Deep Learning TensorRT Documentation

This section contains instructions for installing TensorRT from the Python Package Index. When installing TensorRT from the Python Package Index, you’re not required to install TensorRT from a .tar, .deb, or .rpm package. All required libraries are inclu

docs.nvidia.com

 

이 글을 따라가면서 볼 것이고, 직접 따라해보면서 나같은 입문자가 처음부터 보기에 과한 내용들은 넘기고 정리할 것이다. 


TensorRT란?

NVIDIA에서 제공하는 딥러닝 모델 최적화 SDK다. 모델의 구조나 원리와 무관하게 기술적으로 더 빠르게 inference할 수 있도록 최적화하고 변환해주는 도구다. 그냥 경량화 도구라고 보면 되고 throughput을 높이고 latency를 낮추는게 주 목적이다.


Installation 

우선 TensorRT는 다양한 방식으로 설치 가능하다. ubuntu만 예로 들면 Debian, python wheel, tar 총 3가지 형태로 설치 가능하다. 

 

각각의 장단점을 말하자면 1) debian 기반 설치는 각종 dependecy들을 알아서 설치해주는 간편함이 있지만, sudo 권한이 사용 가능해야 되고 설치 위치가 고정된다. 2) python wheel 기반 설치는 설치 자체가 명령어 한 번으로 끝나는 간편함이 있지만, python API만 사용 가능한 최소 설치다.  마지막으로 3) tar 기반 설치는 설치 위치나 버전 맞추는 것을 직접 해야하기 때문에 자유도가 높은데 그만큼 직접 설정해야 하는 요소들이 많다. LD_LIBRARY_PATH 관리도 직접해야 한다.

 

결론적으론 1) debian 파일을 이용한 설치를 추천한다. 이유는 그나마 가장 간편하고 이슈가 적기 때문이다. 설치 위치를 다양하게 두어야 할만큼 복잡한 환경을 쓸 일도 사실 없고 (웬만하면 도커쓰니까) 설정 변경할 것도 크게 없다. 

 

추가적으로, document에 기재된 바에 의하면 TensorRT를 .deb 파일로 설치하려면 CUDA toolkit, cuDNN 역시 .deb 파일로 설치되어 있어야 한다. CUDA, cuDNN 설치할 때 웬만하면 .deb 파일로 설치하게 되는데 불필요한 이슈를 없애기 위해서 TensorRT도 .deb 파일로 설치하는게 맞아보인다. 

 

1)로 설치해도 python API 쓰려면 2)를 보게 되어있으니 사실 1)과 2)는 같이 하게 된다. 1)->2)순으로 설치하게 된다.

 

0. prerequisite

CUDA, cuDNN은 설치되어 있다는 것이 전제 조건인데 아래 글로 따로 정리했다. 

 

Document에서 일부 기능에만 쓰이므로 cuDNN은 선택적으로 설치하면 된다고 하는데 무조건 설치하는게 낫다. 

 

깔아보니 cuDNN 없으면 불필요하게 찝찝한 오류가 나기도 한다. 깔끔하게 다 깔고 시작하는게 맞다.

 

[Development/TensorRT] - [TensorRT 튜토리얼] 1-1. CUDA installation

[Development/TensorRT] - [TensorRT 튜토리얼] 1-2. cuDNN installation

 

1. python package index installation

먼저 순서를 바꿔 python wheel을 이용해 가장 간단하게 설치하는 방법을 정리한다.

 

deb, tar 파일로 까는게 아니니까 관련 작업들 없이 간편한게 장점이긴 한데 TensorRT c++ API나 c++로 구현된 플러그인들을 사용하거나, 포함해서 같이 compile 할 때 필요한 기능들이 제외되어 있다.

 

TensorRT를 쓰려고 보는 이유 자체가 좀 더 빠르게 쓰기 위함인데 웬만하면 C++로 가게 되어있으니 .deb로 까는게 맞다.

 

확인 사항

  • c++ tensorRT 설치한 이후에 추가 설치하는 경우, 해당 c++ tensorRT에 자동으로 맞춰져서 깔림. 
  • python 3.6~3.11만 지원함. 
  • linux x86_64만 가능.
  • ubuntu 18.04 이상만 추천.
  • CUDA 12.x 이상만 가능.
python3 -m pip install --upgrade tensorrt

pip install pycuda # 나중에 필요함

설치는 prerequisite만 만족되었다면 위와 같은 한 줄로 설치가 끝난다. 시간도 얼마 걸리지 않는다. 

 

pycuda의 경우, tensorrt engine을 runtime 사용할 때 쓰이므로 지금 설치해두는게 좋다. 

 

import tensorrt as trt
print(trt.__version__)

확인도 간단하다. 위와 같이 import를 해보았을 때 되는지 제대로 설치한대로 버전이 출력되는지 보면 된다.

 

이러한 방식은 특히나 가상환경 안에서 간단히 쓸거면 좋을 것 같다. 

 

가상 환경 안에서 간단히 쓸거면 이렇게 깔면 될 듯.

 

이슈

 

이거 .deb 파일로도 깔고 python wheel도 깔고 여러 방식을 반복하다 보면 꼬였는지 다음 오류가 뜬 적이 있다. 

Building wheels for collected packages: tensorrt
Building wheel for tensorrt (setup.py) ... error
   ERROR: Command errored out with exit status 1:
   command: /usr/bin/python3 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-gm4v5da8/tensorrt/setup.py'"'"'; __file__='"'"'/tmp/pip-install-gm4v5da8/tensorrt/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' bdist_wheel -d /tmp/pip-wheel-b_jm_vub
       cwd: /tmp/pip-install-gm4v5da8/tensorrt/

 

내가 겪어본 바로는 .deb 파일로 깔았던 것 전부 지우고, 처음부터 새로 까는 것이 빠르다. 

 

2. debian file installation

https://developer.nvidia.com/tensorrt

 

NVIDIA TensorRT

An SDK with an optimizer for high-performance deep learning inference.

developer.nvidia.com

 

위 링크를 타고 들어가서 NVIDIA developer membership에 가입해야만 (복잡하지 않음) .deb 파일을 다운 받을 수 있다.

 

다시 한 번 말하지만, 이 방식대로 설치하려면 CUDA도 debian으로 설치했어야 된다. (CUDA를 runfile로 깔고 진행해보았을 때 뭔가 되는 것 같았는데 document에 적혀있는대로 따르는게 좋을 것 같다.)

 

 

위 NVIDIA 공식 사이트에 ubuntu 버전과 CUDA 버전에 꼭 맞게 deb 파일을 다운받으면 된다.

 

CUDA 12.x를 지원하는 GPU를 사용하고 있을 경우, 불필요한 오류 방지를 위해 CUDA 12.x 설치하는 것을 권장한다. 

 

위에 python wheel로 설치하는 경우 CUDA 12만 지원한다는 말이 있는데, 어차피 .deb 파일로 설치해도 python API 쓰려면 같이 설치하게 되므로 미리 CUDA 12.x 버전으로 설치해서 조심하는게 좋다.

 

# os="ubuntuxx04"
# tag="8.x.x-cuda-x.x"
sudo dpkg -i nv-tensorrt-local-repo-${os}-${tag}_1.0-1_amd64.deb
sudo cp /var/nv-tensorrt-local-repo-${os}-${tag}/*-keyring.gpg /usr/share/keyrings/
sudo apt-get update

 

다운받고 나면 위와 같이 명령어를 쳐서 설치하면 되는데 각자 ubuntu, CUDA 버전이 다를 것이기 때문에 저 os와 tag 위치의 내용만 바꿔지면 된다. (그냥 .deb 파일 경로 가서 tab으로 자동 완성하면 되니 굳이 타이핑할 필요없다.)

 

sudo apt-get install tensorrt

 

설치 명령어는 간단하다. 

 

 

이슈 1

위와 같이 libninfer8, libnvonnxparser8과 같은 TensorRT의 핵심 요소들이 ",but it is not going to be installed"라는 오류와 함께 dependency 문제 때문에 설치되지 않는 경우가 있다.

 

경험 상 여러 요인이 있지만 체크리스트는 다음과 같다.

1) CUDA 설치도 .deb 파일로 했는가

2) TensorRT 버전, CUDA 버전이 현 PC 스펙에서 지원하는 버전이 맞는가

 

해결 방식은 역시나 처음부터 다시 까는 방식이다. 

 

그래도! 안될 때가 있었다.  

 

https://forums.developer.nvidia.com/t/tensorrt-8-0-installation/180498/6

 

Tensorrt 8.0 installation

Hi @fjoseph , I hit the same problem with ubuntu16.04 and cuda10.2. I found a possible solution that we can install tensorrt and its dependencies one by one manually. The following commands work well on my machine and hope they are helpful to you. dpkg -i

forums.developer.nvidia.com

 

위 글의 해결책을 보면 TensorRT dpkg 이후 해당 폴더로 들어가서 하위에 들어있는 libnvinfer, linnvonnxparaser 같은 하위 .deb 파일들을 직접 dpkg 해주는 방식이다. (안전한건지 모르겠음)

dpkg -i nv-tensorrt-local-repo-ubuntu2004-8.6.1-cuda12.0_1.0-1_amd64.deb
cd /var/nv-tensorrt-local-repo-ubuntu2004-8.6.1-cuda12.0
dpkg -i *.deb

 

예를 들면 위와 같이 하면 된다.

 

이슈 2

 

이슈1 해결 방식을 따라 하면 실제로 설치가 되긴 하지만 삐그덕대면서 설치됐었다.

 

뭔가 대부분 설치 됐는데 linbcudnn8 관련 dependency 문제가 남아있어서 libcudnn을 직접 깔아주어야만 했다. 

sudo apt --fix-broken install

 

더불어서 --fix-broken 태그를 단 추가 install을 해주어야 됐는데 여전히 찝찝하다.  (그래서 cuDNN까지 애초에 설치하고 TensorRT 설치를 시작하라고 한 것.

 

이 경우에는 또 처음으로 돌아가서 cuDNN부터 다시 버전 맞춰서 설치하는 것부터 시작하는 것을 권장한다.

안해도 어쨌든 되긴 한다. 추후에 어떤 이슈가 있을진 모르지만.. 그러니 처음부터 다 설치하는게 좋다. 


Uninstallation

sudo apt-get purge "libnvinfer*"
sudo apt-get purge "nv-tensorrt-local-repo*"
sudo apt-get purge graphsurgeon-tf onnx-graphsurgeon
sudo apt-get autoremove

sudo python3 -m pip uninstall tensorrt
sudo python3 -m pip uninstall uff
sudo python3 -m pip uninstall graphsurgeon
sudo python3 -m pip uninstall onnx-graphsurgeon

 

 

 

삭제는 정말 쉽다. 그냥 여태까지 마주쳤던 키워드로 시작하는 파일을 전부다 지워버리고 autoremove를 호출하면 된다. 

 

"sudo python3 -m pip uninstall"로 시작하는 커맨드들은 쳐보면 아래 그림과 같이 이미 없어서 skip됐다고 뜬다.

 

위에 purge로 지워내면 그냥 알아서 지워지나. 어쨌든 없다는 것이니까 uninstall은 상관없다.

 

추가적으로 keyring도 지워주어야 한다. (keyring이 뭔진 모르지만...)

/usr/share/keyrings/

 

이전 dpkg 커맨드 입력하고 나서 *-keyring.gpg 파일들을 위 경로로 copy해두는 커맨드를 자주 입력했었다. 

 

실제로 저 경로에 가보면 nv-tenssorrt keyring, cuda keyring 등 온갖 keyring 파일들이 존재하는데 정리해주는 것이 좋다. 

 

혹시라도 여러 버전은 CUDA, TensorRT 설치를 시도해보고 있는 경우 굉장히 많은 keyring들이 존재할텐데 이 때 버전이 꼬일 수 있는 것 같다. (실제로 12.1 설치하는데 12.0 깔린 적이 있음)

 

따라서 nv-tensorrt로 시작하는 keyring을 지워주면 좋다! (혹시 모르니 안쓰는 cuda keyring도!)

반응형