tensorrtllm-backend

TensorRT-LLM 백엔드

TensorRT-LLM용 Triton 백엔드의 목표는 TensorRT-LLM 모델을 Triton Inference Server로 서빙하게 하는 거예요. inflight_batcher_llm 디렉터리에 inflight batching, paged attention 등을 지원하는 백엔드의 C++ 구현이 있어요.

참고: Triton 백엔드 소스 코드와 테스트는 TensorRT-LLM 아래 triton_backend 디렉터리로 옮겨졌어요.

Triton 백엔드에 대한 더 자세한 내용은 backend 저장소에서, 질문이나 문제는 이슈 페이지에서 찾을 수 있어요.

이 문서는 다음을 다뤄요: Getting Started(시작하기), 소스 빌드, 지원 모델, 모델 구성·배포, 다중 인스턴스 지원, 멀티 노드, 모델 병렬화, MIG, 스케줄링, KV 캐시, 디코딩, 추측 디코딩, Chunked Context, 양자화, LoRa, Slurm, 메트릭, 벤치마킹.

Getting Started: PyTorch 백엔드 (LLM API)

엔진 컴파일 없이 HuggingFace 모델을 그대로 서빙할 수 있어요.

컨테이너 시작

docker run --rm -it --net host --shm-size=2g --ulimit memlock=-1 --gpus all \
    -v ~/.cache/huggingface:/root/.cache/huggingface \
    nvcr.io/nvidia/tritonserver:25.12-trtllm-python-py3 bash

25.12를 NGC의 최신 태그로 바꿔요.

TRT-LLM clone 및 모델 설정

git clone https://github.com/NVIDIA/TensorRT-LLM.git

TensorRT-LLM/triton_backend/all_models/llmapi/tensorrt_llm/1/model.yaml을 편집하고 model:을 아무 HuggingFace 모델 ID나 로컬 경로로 설정해요.

model: TinyLlama/TinyLlama-1.1B-Chat-v1.0

model.yaml의 모든 키는 LLM() 생성자 인자에 직접 매핑돼요. 여기서 KV 캐시, 양자화, 병렬화 등을 설정해요. gated 모델(예: Llama)은 먼저 토큰을 설정해야 해요: export HF_TOKEN=hf_...

시작 및 테스트

중요: git clone을 실행한 디렉터리(TensorRT-LLM/의 부모)에서 실행해야 해요. TensorRT-LLM/ 폴더 안에서 실행하면 ModuleNotFoundError: No module named 'tensorrt_llm.bindings'가 발생해요.

python3 TensorRT-LLM/triton_backend/scripts/launch_triton_server.py \
    --model_repo=TensorRT-LLM/triton_backend/all_models/llmapi/

서버가 뜨면 요청을 보내요.

curl -X POST localhost:8000/v2/models/tensorrt_llm/generate \
    -d '{"text_input": "The future of AI is", "sampling_param_max_tokens": 50}' | jq

진행 중인 요청 취소

원래 요청에서 쓴 것과 같은 request_id"stop": true를 넣은 두 번째 요청을 보내면 돼요. 긴 실행 요청을 시작하고 request_id를 기록해요.

curl -X POST localhost:8000/v2/models/tensorrt_llm/generate \
    -H "triton-request-id: my-req-1" \
    -d '{"text_input": "Write a very long essay about the history of AI", "sampling_param_max_tokens": 500}' &

그리고 취소해요.

curl -X POST localhost:8000/v2/models/tensorrt_llm/generate \
    -H "triton-request-id: my-req-1" \
    -d '{"text_input": "", "stop": true}'

서버는 생성 즉시 멈추고 취소 응답을 반환해요. 멀티 GPU·멀티 노드·고급 옵션은 docs/llmapi.md를 참고해요.

소스에서 빌드

Triton TRT-LLM 컨테이너를 소스에서 빌드하는 방법은 build.md를 참고해요.

지원 모델

일부 예시만 나열돼요. 전체 지원 모델은 지원 매트릭스를 참고해요.

  • LLaMa: Triton으로 llama 7b 실행하는 종단간 워크플로, LLaMA 모델을 TensorRT-LLM에서 빌드·실행, Llama 멀티 인스턴스, HuggingFace Llama2-7b 모델을 Triton에 배포
  • Gemma: sp model 실행, Gemma를 TensorRT-LLM에서 실행
  • Mistral: Mixtral 모델 빌드·실행
  • Multi-modal: 멀티모달 모델(BLIP2-OPT, LLava1.5-7B, VILA 등) 실행, HuggingFace Llava1.5-7b 배포
  • Encoder-Decoder: 인코더-디코더 모델 실행

모델 구성과 배포

모델 구성에 대한 자세한 내용은 model config 문서를 참고해요.

TRT-LLM 다중 인스턴스 지원

TensorRT-LLM 백엔드는 MPI로 여러 GPU·노드에 걸친 모델 실행을 조정해요. 현재 두 가지 모드가 있어요.

주의: 이것은 Triton Server의 모델 다중 인스턴스 지원(같거나 다른 GPU에 모델 인스턴스를 여러 개 실행)과는 다르다는 점을 기억해 두세요.

Leader Mode (리더 모드) — TensorRT-LLM 백엔드가 GPU마다 Triton Server 프로세스 하나를 생성해요. rank 0 프로세스가 리더예요. 다른 Triton Server 프로세스들은 포트 충돌을 피하고 다른 프로세스가 요청을 받도록 TRITONBACKEND_ModelInstanceInitialize 호출에서 반환하지 않아요. 이 모드는 MPI_Comm_spawn을 쓰지 않아서 Slurm 배포에 친화적이에요.

Orchestrator Mode (오케스트레이터 모드) — 백엔드가 오케스트레이터 역할을 하는 단일 Triton Server 프로세스를 생성하고, 각 모델이 필요로 하는 GPU마다 Triton Server 프로세스를 하나씩 생성해요. 주로 TensorRT-LLM 백엔드로 여러 모델을 서빙할 때 쓰여요. 이 모드에서는 TRT-LLM 백엔드가 필요할 때 새 worker를 자동 생성하므로 MPI world size가 1이어야 해요. MPI_Comm_spawn을 쓰기 때문에 Slurm 배포에서는 제대로 동작하지 않을 수 있고, 현재 단일 노드 배포에서만 동작해요.

LLaMa 모델 다중 인스턴스 실행

다양한 구성에서 LLaMa 모델의 다중 인스턴스를 실행하는 방법은 Running Multiple Instances of the LLaMa Model 문서를 참고해요.

멀티 노드 지원

Triton Server와 TensorRT-LLM의 멀티 노드 배포는 Multi-Node Generative AI w/ Triton Server and TensorRT-LLM 튜토리얼을 참고해요.

모델 병렬화: 텐서·파이프라인·전문가 병렬화

TensorRT-LLM은 텐서 병렬화(Tensor Parallelism), 파이프라인 병렬화(Pipeline Parallelism), 전문가 병렬화(Expert Parallelism)를 지원해요. LLM API로는 병렬화를 model.yaml에서 직접 설정하는데, 키가 LLM() 생성자 인자에 매핑돼요.

LLaMA v3 70B를 4-way 텐서 병렬화 + 2-way 파이프라인 병렬화로 서빙

model: meta-llama/Meta-Llama-3-70B
tensor_parallel_size: 4
pipeline_parallel_size: 2

Mixtral 8x22B를 텐서·전문가 병렬화로 서빙 (MoE)

model: mistralai/Mixtral-8x22B-v0.1
tensor_parallel_size: 8
moe_expert_parallel_size: 4
moe_tensor_parallel_size: 2

Mixture of Experts(MoE)에서 전문가 병렬화 지원에 대해 더 알고 싶으면 LLM API 참조를 봐요.

MIG 지원

MIG로 TRT-LLM 모델과 Triton을 실행하는 방법은 MIG 튜토리얼을 참고해요.

스케줄링

스케줄러 정책은 배치 관리자가 요청을 어떻게 스케줄할지 조정해요. TensorRT-LLM에는 MAX_UTILIZATIONGUARANTEED_NO_EVICT 두 가지가 있어요. tensorrt_llm 모델의 모델 구성에서 batch_scheduler_policy 파라미터로 지정할 수 있어요.

키-값 캐시 (KV Cache)

KV cache 지원 방식은 KV Cache 섹션을, 히트율을 높이는 KV Cache Reuse 활성화 방법은 KV Cache Reuse 문서를 참고해요. KV 캐시 옵션은 LLM API로 model.yaml에서 설정해요.

디코딩: Top-k, Top-p, Beam Search, Medusa, ReDrafter, Lookahead, Eagle

TensorRT-LLM은 top-k, top-p, top-k top-p, beam search, Medusa, ReDrafter, Lookahead, Eagle 등 다양한 디코딩 모드를 지원해요. 실제 성능 향상이 있는 speculative decoding(추측 디코딩) 지원은 Speculative Decoding 문서를 참고해요. 디코딩 모드 파라미터는 tensorrt_llm 모델의 모델 구성에서, 추측 디코딩 파라미터는 tensorrt_llm_bls 모델의 모델 구성에서 찾을 수 있어요.

Chunked Context

chunked context 사용법은 Chunked Context 섹션을, 파라미터는 tensorrt_llm 모델의 모델 구성에서 찾을 수 있어요.

양자화

양자화 툴킷 설치와 TensorRT-LLM 모델 양자화는 Quantization Guide를, 양자화로 추론 가속화는 블로그 포스트를 참고해요.

LoRa

TensorRT-LLM과 Triton에서 LoRa를 쓰는 방법은 lora.md를 참고해요.

Slurm 기반 클러스터에서 Triton 서버 시작

tensorrt_llm_triton.subtensorrt_llm_triton.sh 스크립트를 준비해요.

tensorrt_llm_triton.sub

#!/bin/bash
#SBATCH -o logs/tensorrt_llm.out
#SBATCH -e logs/tensorrt_llm.error
#SBATCH -J <REPLACE WITH YOUR JOB's NAME>
#SBATCH -A <REPLACE WITH YOUR ACCOUNT's NAME>
#SBATCH -p <REPLACE WITH YOUR PARTITION's NAME>
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=8
#SBATCH --time=00:30:00

sudo nvidia-smi -lgc 1410,1410

srun --mpi=pmix \
    --container-image triton_trt_llm \
    --container-workdir /tensorrtllm_backend \
    --output logs/tensorrt_llm_%t.out \
    bash /tensorrtllm_backend/tensorrt_llm_triton.sh

tensorrt_llm_triton.sh

TRITONSERVER="/opt/tritonserver/bin/tritonserver"
MODEL_REPO="/triton_model_repo"

${TRITONSERVER} --model-repository=${MODEL_REPO} --disable-auto-complete-config --backend-config=python,shm-region-prefix-name=prefix${SLURM_PROCID}_

srun이 mpi 환경을 초기화하면 srun --mpi pmix launch_triton_server.py --oversubscribe로 Triton 서버를 시작할 수 있어요.

Slurm 작업 제출

sbatch tensorrt_llm_triton.sub

클러스터 관리자에게 도움을 요청해야 할 수도 있어요.

Triton 메트릭

23.11 릴리스부터 Triton metrics 엔드포인트로 TRT-LLM 배치 관리자 통계를 얻을 수 있어요. curl localhost:8002/metrics로 조회해요. 배치 관리자 통계는 nv_trt_llm_ 프리픽스가 붙은 필드로 보고돼요. 예를 들어 inflight batcher 모델의 출력은 이렇게 보여요.

# HELP nv_trt_llm_request_metrics TRT LLM request metrics
# TYPE nv_trt_llm_request_metrics gauge
nv_trt_llm_request_metrics{model="tensorrt_llm",request_type="waiting",version="1"} 1
nv_trt_llm_request_metrics{model="tensorrt_llm",request_type="context",version="1"} 1
nv_trt_llm_runtime_memory_metrics{memory_type="gpu",model="tensorrt_llm",version="1"} 1610236
nv_trt_llm_kv_cache_block_metrics{kv_cache_block_type="free",model="tensorrt_llm",version="1"} 6239

V1 모델을 시작했다면 inflight batcher 관련 필드 대신 nv_trt_llm_v1_metrics가 나와요.

# HELP nv_trt_llm_v1_metrics TRT LLM v1-specific metrics
# TYPE nv_trt_llm_v1_metrics gauge
nv_trt_llm_v1_metrics{model="tensorrt_llm",v1_specific_metric="total_generation_tokens",version="1"} 20

23.12 이전 Triton 버전은 기본 Triton 메트릭을 지원하지 않으므로, 기본 메트릭 필드(nv_inference_request_success 등)가 0으로 보고돼요.

벤치마킹

TensorRT-LLM 모델 벤치마킹에는 GenAI-Perf 도구를 써요. benchmark_core_model 스크립트로 핵심 모델 tensorrt_llm을 벤치마킹할 수도 있어요. 이 스크립트는 배포된 tensorrt_llm 모델에 직접 요청을 보내요. 코어 모델 지연은 TensorRT-LLM의 추론 지연을 나타내며, 보통 HuggingFace 같은 제3자 라이브러리가 처리하는 전/후처리 지연은 포함하지 않아요.

cd tools/inflight_batcher_llm

예제: 제공된 토크나이저로 10 req/sec 요청률의 데이터셋 실행.

python3 benchmark_core_model.py -i grpc --request_rate 10 dataset --dataset <dataset path> --tokenizer_dir <> --num_requests 5000

예제: 입력 정규분포(mean_seqlen=128, stdev=5), 출력 정규분포(mean_seqlen=20, stdev=2)로 I/O seqlen 토큰 생성. stdev=0이면 상수 seqlen.

python3 benchmark_core_model.py -i grpc --request_rate 10 token_norm_dist --input_mean 128 --input_stdev 5 --output_mean 20 --output_stdev 2 --num_requests 5000

예상 출력:

[INFO] Warm up for benchmarking.
[INFO] Start benchmarking on 5000 prompts.
[INFO] Total Latency: 26585.349 ms
+----------------------------+----------+
|            Stat            |  Value   |
+----------------------------+----------+
|        Requests/Sec        |  188.09  |
|       OP tokens/sec        | 3857.66  |
|     Avg. latency (ms)      | 2313.93  |
|      P99 latency (ms)      | 3624.95  |
+----------------------------+----------+

문서의 예상 출력은 참고용이에요. 특정 성능 수치는 사용하는 GPU에 따라 달라져요.

TensorRT-LLM 백엔드 테스트

테스트 실행 방법은 tensorrt_llm/triton_backend/ci/README.md 가이드를 따라요.


출처: 공식문서 (TensorRT-LLM Backend)