제5부 추론 최적화와 서빙
5.5 TensorRT 정밀도 II — QAT·FP8·정확도 검증
5.5.1 이 장에서 배우는 것 / 선수 지식
5.4에서 PTQ(후처리 양자화) — 재학습 없이 캘리브레이션으로 스케일만 정하는 길 — 를 익혔다. PTQ는 싸지만, 정확도가 임계 밖으로 떨어지면 한계가 있다. 이 장은 그 다음 두 무기를 든다: ① QAT(Quantization-Aware Training, 학습 인지 양자화) — 학습 그래프에 양자화를 삽입해 모델이 양자화에 적응하게 함, ② FP8(Hopper+ 세대, 4.2) — 트랜스포머·LLM에서 INT8보다 자주 유리한 8비트 부동소수 포맷. 그리고 이 모든 정밀도 변환을 체계적으로 검증하는 절차로 정밀도 묶음(5.4~5.5)을 닫는다.
배우는 것:
- QAT의 원리 — 학습에 가짜양자화(fake-quant, Q/DQ) 를 삽입하고, STE(straight-through estimator) 로 그래디언트를 통과시켜 모델을 양자화에 적응시킨다.
- explicit quantization — Q/DQ 노드가 박힌 모델을 TensorRT가 그대로 존중하는 방식, PTQ(implicit calibrator)와의 차이.
- TensorRT 양자화 툴킷(Model Optimizer 계열)으로 양자화 모듈 삽입 → 캘리브레이션 → QAT 미세조정 → ONNX(Q/DQ) → 엔진 빌드 흐름.
- FP8(E4M3/E5M2) — 구조, 왜 트랜스포머에서 INT8보다 유리한가, per-tensor 동적 스케일·트랜스포머 엔진(4.2)과의 연결, FP4(Blackwell, 4.4) 개요.
- 정확도 검증의 체계화 — 기준선·태스크 지표·임계·레이어 민감도·회귀 테스트.
선수 지식: 5.4(PTQ·캘리브레이션·양자화 수학·혼합정밀 — 이 장의 직전제), 1.13~1.14(정밀도 포맷·혼합정밀), 4.2(Hopper 트랜스포머 엔진·FP8 — FP8의 하드웨어 맥락), 4.4(Blackwell FP4), 5.1(정밀도 축·"검증과 함께"). 환경은 5.2.
정직: QAT 툴킷과 FP8 워크플로우의 패키지·API 이름은 빠르게 바뀐다(예: 과거
pytorch-quantization→ 통합 TensorRT Model Optimizer(modelopt) 계열로 이동, 명칭·인터페이스 변동). FP8/FP4는 하드웨어 세대 종속(FP8=Hopper+, FP4=Blackwell, "발표 기준·확인 필요"). 이 장은 개념·흐름을 중심에 두고 코드는 한 방식을 예시 — 정확한 패키지·시그니처·세대 지원은 당신 버전·GPU 문서로 확인. 수치는 환경 의존 개략값, 실측.
5.5.2 QAT — 왜·어떻게
PTQ의 한계: 학습된 가중치는 양자화를 모른 채 최적화됐다. 그래서 양자화 잡음에 민감한 가중치 배치가 굳어 있을 수 있다. QAT는 학습 단계에서 양자화를 흉내 내 모델이 "어차피 INT8/FP8로 반올림될 것"을 알고 그에 강건하게 가중치를 재배치하도록 만든다.
가짜양자화(fake-quant) = Q/DQ. 학습 그래프의 가중치·활성화 경로에 양자화(Quantize)→역양자화(DeQuantize) 한 쌍을 삽입한다:
값은 FP로 흐르지만, x'는 INT8로 표현 가능한 값만 가진다 — '양자화된 것처럼'.
순전파에서 x'는 양자화→역양자화를 거쳐 INT8이 표현할 수 있는 값으로 스냅된다. 모델은 이 잡음을 손실에 반영해 학습 → 양자화에 강건해진다.
문제: round는 미분 불가(거의 모든 곳에서 기울기 0). 어떻게 역전파하나?
STE(Straight-Through Estimator). 역전파에서 round의 기울기를 항등(1)으로 근사해 그래디언트를 그대로 통과시킨다(클리핑 범위 밖은 0):
QAT의 실제 절차:
- 학습된 FP 모델에서 시작(보통 처음부터 QAT보다 PTQ 후 미세조정이 효율적).
- 양자화 대상(주로 conv·linear의 가중치·입력)에 Q/DQ 모듈 삽입.
- 초기 스케일을 캘리브레이션(5.4의 방식으로 한 번)으로 정함.
- 낮은 학습률로 짧게 미세조정(few epochs) — 모델이 양자화에 적응.
- Q/DQ가 박힌 모델을 ONNX로 export → TensorRT가 Q/DQ를 존중해 INT8 엔진 빌드.
5.5.3 explicit vs implicit 양자화
5.4의 PTQ(calibrator)와 이 장의 QAT는 TensorRT가 정밀도를 정하는 두 방식에 대응한다.
| 방식 | 어떻게 | 정밀도 결정 주체 |
|---|---|---|
| implicit(PTQ calibrator) | --int8 + calibrator. TRT가 빌드 시 레이어별 정밀도를 자동 선택(어디를 INT8로?) | TensorRT 빌더 |
| explicit(Q/DQ 노드) | 모델에 Q/DQ 노드가 명시됨(QAT 또는 explicit PTQ). TRT는 그 노드를 그대로 따름 | 모델(사용자) |
핵심: QAT 모델은 explicit 양자화로 들어간다. 학습에서 정한 Q/DQ 위치·스케일을 TRT가 존중하므로, PTQ의 "빌더가 알아서"보다 사용자가 정밀도 지도를 직접 그린 셈이다. 최신 워크플로우는 PTQ도 explicit Q/DQ로 표현하는 쪽으로 수렴 중(버전 의존).
5.5.4 워크스루 (1) — QAT 워크플로우
TensorRT Model Optimizer 계열 툴킷으로 QAT를 한다(패키지·API명은 버전 의존 — 흐름에 집중).
# qat_flow.py — 개념 흐름(패키지·함수명은 당신 버전 modelopt/툴킷 문서로 확인)
import torch
import modelopt.torch.quantization as mtq # TensorRT Model Optimizer (명칭 버전 의존)
model = load_pretrained().cuda().train() # 학습된 FP 모델에서 시작
# 1) 양자화 설정 선택(INT8 또는 FP8 등). 대상 레이어에 Q/DQ 모듈 삽입.
config = mtq.INT8_DEFAULT_CFG # 예: INT8 설정(FP8_DEFAULT_CFG도 있음)
# 2) 캘리브레이션: 대표 데이터로 초기 스케일 추정(5.4와 같은 원리)
def forward_loop(m):
for x, _ in calib_loader: # 대표 입력(라벨 불필요)
m(x.cuda())
model = mtq.quantize(model, config, forward_loop) # Q/DQ 삽입 + 초기 스케일
# 3) QAT 미세조정: '낮은 LR로 짧게'. 모델이 양자화에 적응.
opt = torch.optim.SGD(model.parameters(), lr=1e-4) # 기존 학습보다 훨씬 낮은 LR
for epoch in range(qat_epochs): # 보통 few epochs면 충분(태스크 의존)
for x, y in train_loader:
loss = criterion(model(x.cuda()), y.cuda())
opt.zero_grad(); loss.backward(); opt.step() # STE로 round 통과
# 4) Q/DQ가 박힌 모델을 ONNX로 export → TRT가 explicit 양자화로 빌드
torch.onnx.export(model.eval(), dummy, "model_qat.onnx", opset_version=17,
input_names=["input"], output_names=["logits"],
dynamic_axes={"input": {0: "batch"}, "logits": {0: "batch"}})
# 5) Q/DQ ONNX를 INT8 엔진으로 — calibrator 불필요(스케일이 그래프에 있음)
trtexec --onnx=model_qat.onnx --int8 --fp16 \
--saveEngine=model_qat.plan \
--minShapes=input:1x3x224x224 --optShapes=input:8x3x224x224 \
--maxShapes=input:32x3x224x224
# QAT 모델은 Q/DQ에 스케일이 명시돼 있어 --calib 없이 빌드(explicit). FP16은 비양자 레이어용.
QAT vs PTQ의 실무 관점:
- 노력: QAT는 학습 파이프라인·데이터·시간이 필요(미세조정). PTQ는 캘리브레이션만.
- 정확도: 보통 QAT ≥ PTQ(양자화에 적응했으므로). 특히 PTQ로 −2~3%p 떨어지는 민감 모델에서 QAT가 격차를 메운다.
- 언제: 5.4 사다리 — FP16 → PTQ(+혼합정밀) → 그래도 부족하면 QAT.
5.5.5 FP8 — 트랜스포머를 위한 8비트 부동소수
INT8은 정수(균일 간격)다. FP8은 부동소수(지수+가수)라 동적 범위가 넓고 작은 값의 상대 해상도가 좋다. 트랜스포머의 활성화는 이상치·넓은 범위를 가져 INT8 균일 격자에 잘 안 맞는데, FP8은 이를 더 잘 담는다 — 그래서 LLM·트랜스포머에서 FP8이 INT8보다 자주 유리하다.
FP8 두 변종(1.13):
| 변종 | 구조 | 특성 | 보통 용도 |
|---|---|---|---|
| E4M3 | 지수4·가수3 | 정밀도(가수)↑·범위↓ | 순전파 활성화·가중치 |
| E5M2 | 지수5·가수2 | 범위↑·정밀도↓ | 그래디언트(학습 시) |
INT8 vs FP8:
| 포맷 | 특성 |
|---|---|
| INT8 | 균일 간격(0 근처도 먼 곳도 같은 간격), 캘리브레이션 민감, 정수 MAC |
| FP8 | 지수로 넓은 범위·작은 값 상대해상도↑, 트랜스포머에 적합, FP8 텐서코어(Hopper+) |
하드웨어 맥락(4.2). FP8은 Hopper 세대부터의 텐서코어·트랜스포머 엔진이 가속한다(이전 세대엔 FP8 텐서코어 없음 — 세대 종속, 확인 필요). 트랜스포머 엔진은 레이어별로 FP8 스케일을 동적으로 관리(amax 히스토리·delayed scaling)해 GEMM은 FP8로, 민감 연산은 고정밀로 자동 혼합한다. TensorRT/TRT-LLM은 이를 라이브러리로 누린다 — 사용자는 FP8 양자화를 켜고 검증한다.
FP8 양자화 흐름은 INT8과 닮았다 — PTQ(캘리브레이션) 또는 QAT로 스케일을 정하고 Q/DQ(FP8)로 표현:
config = mtq.FP8_DEFAULT_CFG # INT8 대신 FP8 설정(패키지·명칭 버전 의존)
model = mtq.quantize(model, config, forward_loop) # FP8 Q/DQ 삽입 + 캘리브레이션
# 이후 export·빌드는 5.5.4와 동일. FP8 지원 GPU(Hopper+)에서 빌드·실행.
FP8 vs INT8 — 어느 것?
| 기준 | INT8 유리 | FP8 유리 |
|---|---|---|
| 모델 유형 | CNN·견고한 비전 | 트랜스포머·LLM(넓은 범위·이상치) |
| 하드웨어 | 폭넓은 세대 지원 | Hopper+ 필요 |
| 캘리브레이션 민감도 | 높음(범위를 잘 설정해야) | 상대적으로 덜 민감(동적 범위) |
| 성숙도·도구 | 오래됨·풍부 | 신규·빠르게 발전(확인 필요) |
견해: 트랜스포머·LLM이고 Hopper+ 라면 FP8을 먼저 검토하라 — 정확도·속도 균형이 INT8보다 좋은 경우가 많고 캘리브레이션도 덜 까다롭다. CNN·구세대 GPU·폭넓은 호환이 필요하면 INT8. 둘 다 태스크 지표로 실측 비교해 정한다.
FP4(Blackwell, 4.4) 개요. Blackwell 세대는 FP4 + 마이크로스케일링(per-block 스케일) 으로 정밀도를 더 낮춘다(발표 기준, 변동 가능). 블록 단위로 스케일을 둬 4비트의 좁은 범위를 보완하는 방식. 가용성·정확도는 세대·소프트웨어 성숙도에 강하게 의존 — 나오는 대로 실측이 원칙. (깊은 내용은 4.4.)
5.5.6 워크스루 (2) — 정확도 검증의 체계화
정밀도 변환(PTQ·QAT·FP8 어느 것이든)은 검증 없이는 미완이다(5.1·5.4 반복). 이를 절차로 확정한다.
# 동일 평가셋·동일 전처리로 정밀도별 태스크 지표를 한 표로
for plan in fp16 int8 fp8 qat; do
python eval_accuracy.py --engine model_$plan.plan --metric top1 --split val
done
# 예시 출력(개략): fp16=76.1 int8_ptq=74.8(-1.3) int8_qat=75.9(-0.2) fp8=75.8(-0.3)
# → PTQ는 임계(-0.5%p) 초과 탈락, QAT·FP8은 통과 → 속도·하드웨어로 최종 선택
정직: 위 숫자는 구조 예시다. 실제 격차는 모델·데이터·하드웨어마다 다르다. 핵심은 "기준선 → 동일 평가셋 → 사전 임계 → 좁히기 → 회귀 고정"의 절차이지 특정 수치가 아니다.
5.5.7 중간 점검 (체크포인트)
- [ ] QAT가 가짜양자화(Q/DQ) + STE로 모델을 양자화에 적응시키는 원리를, PTQ와 대비해 설명한다.
- [ ] explicit(Q/DQ) vs implicit(calibrator) 양자화의 차이와, QAT가 explicit으로 들어가는 이유를 안다.
- [ ] QAT 워크플로우(삽입→캘리브레이션→낮은 LR 미세조정→Q/DQ ONNX→빌드)를 따라간다.
- [ ] FP8(E4M3/E5M2) 의 구조와, 왜 트랜스포머에서 INT8보다 유리한지(동적 범위), 그리고 Hopper+ 세대 종속을 설명한다.
- [ ] FP8 vs INT8 선택 기준(모델 유형·하드웨어·민감도)을 제시한다.
- [ ] 정확도 검증을 기준선·태스크 지표·임계·민감도·회귀의 절차로 수행한다.
증상→의심: QAT인데 정확도가 PTQ와 비슷하거나 나쁨 → LR 과대(원래 가중치 파괴)·미세조정 부족·Q/DQ 잘못 배치 → LR↓·에폭 조정·툴킷 기본 배치 사용. FP8 빌드 실패/미가속 → GPU 세대 미지원(Hopper 이전) → INT8로 전환 또는 지원 GPU. explicit 모델인데 INT8로 안 돎 → Q/DQ 노드 누락/오배치 → 툴킷으로 재삽입. 검증 통과인데 운영서 품질 저하 → 평가셋이 운영 분포와 다름 → 대표성 점검·회귀셋 갱신.
5.5.8 트레이드오프·대안
정밀도 전략 결정. 5.4의 사다리를 완성한다.
| 전략 | 누구에게 | 비용 | 정확도 |
|---|---|---|---|
| FP16/BF16 | 기본·민감 모델 | 없음(노력 최소) | 거의 무손실 |
| INT8 PTQ | 견고한 CNN·빠른 적용 | 캘리브레이션만 | 보통 양호(검증 필수) |
| INT8 QAT | PTQ 부족·정확도 중요 | 재학습(데이터·시간) | 최선(INT8) |
| FP8 PTQ/QAT | 트랜스포머·LLM·Hopper+ | 캘리브레이션(±미세조정) | 트랜스포머에서 우수 |
| 혼합정밀 | 일부 레이어만 민감 | 민감도 분석 | 속도·정확도 균형 |
| FP4(Blackwell) | 최신 세대·극한 효율 | 세대·툴 성숙 의존 | 발표 기준, 실측 |
견해: 노력 사다리를 한 칸씩. FP16(안전)에서 시작해, 처리량/비용이 아프면 (트랜스포머·Hopper+이면 FP8, CNN·범용이면 INT8 PTQ) → 부족분은 혼합정밀 → 그래도 안 되면 QAT. QAT는 효과적이지만 재학습 비용이 있으니 PTQ·혼합정밀로 먼저 최대한 확보한 뒤 마지막 카드로. 모든 단계는 태스크 지표 실측으로 통과 판정.
비엔비디아 정직: QAT·FP8·Q/DQ는 표준 개념이라 다른 프레임워크·런타임에도 존재한다(ONNX Q/DQ는 표준). TRT의 강점은 FP8 텐서코어·트랜스포머 엔진·Model Optimizer 툴킷·explicit 양자화의 통합과 최신 세대(FP4) 흡수 속도다. 다만 FP8/FP4는 하드웨어 세대 종속이고 도구가 빠르게 변하니 — 슬라이드가 아니라 당신 GPU·모델·평가셋으로 실측.
5.5.9 흔한 함정
- QAT를 높은 LR로. 원래 학습률로 QAT하면 잘 학습된 가중치를 파괴한다. 기존보다 훨씬 낮은 LR로 짧게 미세조정.
- QAT를 처음부터(from scratch). 보통 비효율. 학습된 모델 + 캘리브레이션 + 짧은 미세조정이 정석.
- Q/DQ 오배치·이중 양자화. Q/DQ를 잘못 넣으면(예: 같은 텐서 이중 양자화, residual 경로 누락) 정확도·속도 모두 손해. 툴킷의 기본 배치를 신뢰하고 커스텀은 신중히.
- FP8을 미지원 하드웨어에서 기대. FP8 텐서코어는 Hopper+ (FP4=Blackwell). 구세대에서 FP8 플래그는 가속이 안 되거나 폴백. 세대 확인.
- FP8/INT8을 모델 유형 무시하고 선택. 트랜스포머에 INT8을 강행하면 이상치·범위 때문에 정확도가 더 떨어질 수 있다 — 트랜스포머는 FP8 우선 검토.
- 검증을 캘리브레이션/학습 데이터로. 낙관 편향. 분리된 평가셋·운영 대표 분포로.
- 임계를 사후에 정함. "이 정도면 되겠지"식 사후 합리화. 사전에 태스크 임계(예: −0.5%p)를 합의하고 그에 따라 판정.
- 정밀도 구성을 회귀 테스트 없이 방치. 모델·데이터·TRT 버전이 바뀌면 정확도가 달라질 수 있다 — CI 회귀로 자동 재검증.
- 툴킷 API를 버전 불문 그대로 복붙.
pytorch-quantization/modelopt등은 명칭·인터페이스가 변한다 — 그 버전 문서로 확인.
5.5.10 연습문제
연습 1 (STE). QAT에서 round가 미분 불가인데 어떻게 학습이 되나? STE의 동작과, 클리핑 범위 밖(|x|>t)에서 기울기를 어떻게 다루는지, 그리고 이것이 왜 합리적인 근사인지 설명하라.
정답
round의 기울기는 거의 모든 곳에서 0이라 그대로면 학습이 멈춘다. STE는 역전파에서 round를 항등 함수로 근사해 기울기를 그대로 통과시킨다(∂L/∂x ≈ ∂L/∂x'). 클리핑 범위 밖(|x|>t)은 값이 포화되어 출력에 영향을 못 주므로 기울기 0(그쪽으로 더 키워도 의미 없음). 합리적인 이유: 순전파는 양자화 잡음을 손실에 정확히 반영하되(모델이 잡음을 '느낌'), 역전파는 그 잡음의 미분 불가성을 우회해 연속 근사로 학습 신호를 유지한다. 결과적으로 모델은 "반올림될 것"을 알고 강건하게 적응한다.
연습 2 (explicit vs implicit). PTQ calibrator(implicit)와 QAT 모델(explicit Q/DQ)이 TensorRT에서 정밀도를 정하는 방식의 차이를 설명하고, explicit이 정확도·재현성에서 유리한 이유를 제시라.
정답
implicit(PTQ): --int8+calibrator를 주면 TRT 빌더가 레이어별로 INT8/FP16을 자동 선택하고 캘리브레이션으로 활성화 스케일을 추정. 정밀도 배치 결정권이 빌더에 있음. explicit(QAT): 모델 그래프에 Q/DQ 노드와 스케일이 명시돼 있어 TRT는 그 위치를 그대로 존중("Q/DQ 사이는 INT8"). 유리한 이유: ① QAT로 학습 중 적응된 스케일·배치가 그대로 반영 → 정확도↑, ② 정밀도 지도가 그래프에 고정되어 재현 가능(빌더 휴리스틱·버전에 덜 흔들림), ③ 사용자가 어느 레이어를 양자화할지 정밀 제어. 단 Q/DQ를 올바로 배치해야 함(툴킷이 도움).
연습 3 (FP8 vs INT8). 다음에 FP8과 INT8 중 무엇을 먼저 시도할지와 이유: (a) Hopper GPU에서 LLM 추론, (b) Jetson급 구세대 GPU에서 CNN 검출, (c) Hopper에서 비전 트랜스포머(ViT) 분류.
정답
(a) FP8 — 트랜스포머/LLM은 활성화 범위가 넓고 이상치가 있어 FP8의 동적 범위가 INT8 균일 격자보다 유리, Hopper가 FP8 텐서코어·트랜스포머 엔진 지원. (b) INT8 — 구세대 GPU는 FP8 텐서코어가 없을 가능성(세대 확인), CNN은 INT8로 견고. FP8 강행해도 가속 안 됨. (c) FP8 우선 검토 — ViT도 트랜스포머라 FP8이 적합할 수 있고 Hopper 지원. 단 (a)~(c) 모두 태스크 지표로 FP8·INT8 실측 비교 후 속도·정확도로 최종 결정.
연습 4 (QAT 디버깅). QAT를 실행했는데 정확도가 PTQ보다 오히려 나빠졌다. 가능한 원인 셋과 각 점검·해결책을 제시하라.
정답
① LR 과대 — 기존 학습률로 QAT해 잘 학습된 가중치를 망가뜨림. 점검: 손실이 초기에 급등하는지. 해결: LR을 1~2 자릿수 낮춰 짧게. ② 미세조정 부족/과다 — 너무 적으면 적응 안 됨, 너무 많으면 과적합·드리프트. 해결: 검증 지표로 에폭 조정(early stop). ③ Q/DQ 오배치·이중 양자화 — 잘못된 위치로 정보 손실. 점검: 툴킷 기본 배치 사용 여부, residual·skip 경로. 해결: 툴킷 기본 설정으로 재삽입. 추가: 초기 스케일 캘리브레이션이 비대표 데이터였는지(5.4), 평가셋 일관성. 핵심은 PTQ 후 낮은 LR 짧은 미세조정 + 툴킷 기본 Q/DQ.
연습 5 (검증 체계). 팀이 INT8 엔진을 "샘플 몇 개 눈으로 보고 괜찮다"며 배포하려 한다. 이를 막고 올바른 검증 파이프라인을 5단계로 제안하라(회귀 포함).
정답
눈대중은 편향·불충분. 파이프라인: ① 기준선 고정 — FP16(또는 FP32) 엔진으로 대표 평가셋의 태스크 지표(예: mAP) 측정·기록. ② 후보 측정 — INT8 엔진을 동일 평가셋·동일 전처리로 측정. ③ 사전 임계 비교 — 합의된 허용 하락(예: mAP −0.5%p) 안인지 판정. ④ 미달 시 좁히기 — 레이어 민감도→혼합정밀, 캘리브레이션 데이터·방법 조정, 필요시 QAT. ⑤ 회귀 등록 — 합격 구성을 CI에 넣어 모델·데이터·TRT 버전 변경 시 자동 재검증. 평가셋은 캘리브레이션/학습과 분리되고 운영 분포를 대표해야 한다.
5.5.11 요약 · 다음 장
- QAT는 학습 그래프에 가짜양자화(Q/DQ) 를 넣고 STE로 그래디언트를 통과시켜 모델을 양자화에 적응시킨다. PTQ보다 정확하나 재학습 비용 — PTQ·혼합정밀로 부족할 때의 카드.
- QAT 모델은 explicit 양자화(Q/DQ가 그래프에 명시)로 TRT에 들어가, 적응된 스케일·배치가 그대로 반영된다(implicit calibrator와 대비).
- FP8(E4M3/E5M2) 은 부동소수라 동적 범위가 넓어 트랜스포머·LLM에서 INT8보다 자주 유리하다. Hopper+ 세대·트랜스포머 엔진(4.2) 종속. FP4는 Blackwell(4.4, 발표 기준).
- 정밀도 선택은 사다리: FP16 → (트랜스포머·Hopper+면 FP8, 아니면 INT8 PTQ) → 혼합정밀 → QAT. 각 단계는 기준선·태스크 지표·사전 임계·민감도·회귀의 검증 절차로 판정.
- 정직: 툴킷 API·패키지명 버전 의존, FP8/FP4 하드웨어 세대 종속(확인 필요), 모든 정확도·속도는 분리된 평가셋으로 실측.
다음 장: 5.6 TensorRT 플러그인·커스텀 레이어. TensorRT가 기본 지원하지 않는 연산(커스텀 op·신규 구조)을 만났을 때, 플러그인으로 직접 커널을 삽입해 엔진을 완성하는 법 — 플러그인 인터페이스·등록·직렬화·동적 shape 대응을 다룬다. 이로써 제5부의 TensorRT 코어(5.2~5.6)를 마무리하고 5.7부터 LLM 특화 런타임(TensorRT-LLM)으로 넘어간다.