NVIDIA GPU 에서 학습된 모델을 추론에 맞게 최적화해 주는 SDK 다. 학습용 프레임워크로 만든 모델을 받아, 대상 GPU 에 맞춰 컴파일한 실행 엔진을 만들어 낸다.

학습과 추론은 요구가 다르다. 학습은 역전파를 위해 중간값을 남겨야 하고 유연한 그래프가 필요하지만, 추론은 그래프가 고정돼 있고 순전파만 하면 된다. TensorRT 는 이 차이를 이용해 학습 프레임워크가 못 하는 변형을 가한다.

무엇을 최적화하나

layer fusion — 연속된 연산을 하나의 CUDA 커널로 합친다. convolution → bias → ReLU 를 따로 실행하면 중간 결과를 매번 GPU 메모리에 쓰고 다시 읽어야 하는데, 합치면 그 왕복이 사라진다. GPU 는 연산보다 메모리 대역폭에서 먼저 막히는 경우가 많아 이 효과가 크다. Kernel Fusion 을 손으로 CUDA C++ 로 짜는 대신 자동으로 얻는 셈이다.

정밀도 낮추기 — FP32 대신 FP16 이나 INT8 로 계산한다. INT8 은 값의 범위를 정수 눈금에 맞춰야 해서, 대표 데이터를 넣어 각 층의 값 분포를 재는 보정 과정이 필요하다.

커널 자동 선택 — 같은 연산이라도 입력 크기와 GPU 아키텍처에 따라 빠른 구현이 다르다. 빌드 시점에 후보들을 실제로 재보고 가장 빠른 것을 고른다.

메모리 재사용 — 그래프가 고정돼 있으므로 어떤 텐서가 언제까지 살아 있어야 하는지 미리 알 수 있다. 수명이 겹치지 않는 텐서끼리 같은 메모리를 나눠 쓴다.

대가

빌드 결과인 엔진은 GPU 아키텍처와 TensorRT 버전에 묶인다. A100 에서 만든 엔진을 T4 에서 그대로 쓸 수 없어, 배포 대상마다 따로 빌드해야 한다.

입력 크기도 빌드 시점에 정해진다. 가변 길이를 다루려면 허용할 범위를 미리 지정해야 하고, 그 범위를 벗어나는 입력은 처리되지 않는다.

서빙과의 연결

Triton 은 TensorRT 엔진을 그대로 로드할 수 있는 백엔드를 갖고 있다. 모델 설정 파일에 입력·출력 이름과 텐서 모양·자료형을 적어 두면 되고, TensorRT 엔진은 이 정보가 빌드 시점에 확정돼 있어서 설정이 단순하다.