vllm-backend
vLLM 백엔드
vLLM용 Triton 백엔드는 지원되는 모델을 vLLM 엔진 위에서 실행하도록 설계됐어요. Triton 백엔드에 대한 더 자세한 내용은 backend 저장소에서, 질문이나 문제는 이슈 페이지에서 찾을 수 있어요.
이 백엔드는 Python 기반 백엔드예요. 이 백엔드를 쓰면 모든 요청이 수신되는 즉시 vLLM AsyncEngine에 전달돼요. inflight batching과 paged attention은 vLLM 엔진이 처리해요.
vLLM 백엔드 설치
설치·배포 방법은 여러 가지가 있어요.
옵션 1: 미리 빌드된 Docker 컨테이너 사용
NGC 레지스트리에서 vLLM 백엔드가 포함된 tritonserver:<xx.yy>-vllm-python-py3 컨테이너를 받아요. <xx.yy>는 쓰고 싶은 Triton 버전이에요. Triton의 vLLM 컨테이너는 23.10 릴리스부터 도입됐다는 점을 기억해 두세요.
docker pull nvcr.io/nvidia/tritonserver:<xx.yy>-vllm-python-py3
옵션 2: 소스에서 커스텀 컨테이너 빌드
Building With Docker 가이드의 단계를 따라 build.py 스크립트를 쓰면 돼요. 최신 Triton vLLM 컨테이너 버전(릴리스의 최신 YY.MM)은 NGC 레지스트리에서 확인해요.
# YY.MM is the version of Triton.
export TRITON_CONTAINER_VERSION=<YY.MM>
./build.py -v --enable-logging
--enable-stats
--enable-tracing
--enable-metrics
--enable-gpu-metrics
--enable-cpu-metrics
--enable-gpu
--filesystem=gcs
--filesystem=s3
--filesystem=azure_storage
--endpoint=http
--endpoint=grpc
--endpoint=sagemaker
--endpoint=vertex-ai
--upstream-container-version=${TRITON_CONTAINER_VERSION}
--backend=python:r${TRITON_CONTAINER_VERSION}
--backend=vllm:r${TRITON_CONTAINER_VERSION}
--backend=ensemble
옵션 3: 기본 Triton 컨테이너에 vLLM 백엔드 추가
NGC Triton 컨테이너에 vLLM 백엔드를 직접 설치할 수 있어요. 먼저 vLLM을 설치하고(pip install vllm==<vLLM_version>), 컨테이너 안에서 vLLM 백엔드를 설정해요.
mkdir -p /opt/tritonserver/backends/vllm
git clone https://github.com/triton-inference-server/vllm_backend.git /tmp/vllm_backend
cp -r /tmp/vllm_backend/src/* /opt/tritonserver/backends/vllm
vLLM 백엔드 사용하기
samples 폴더에 예제 model_repository가 있어요. 그대로 쓰되, model.json의 model 값을 바꾸면 모델을 교체할 수 있어요. model.json은 모델 초기화 시 vLLM의 AsyncLLMEngine에 전달되는 키-값 딕셔너리예요. 지원되는 인자는 vLLM의 arg_utils.py에서 확인할 수 있어요.
멀티 GPU 지원: model.json에 tensor_parallel_size 같은 EngineArgs를 지정할 수 있어요. 멀티 GPU 모델을 쓸 때는 config.pbtxt의 인스턴스 그룹 종류를 반드시 KIND_MODEL로 설정해야 해요.
기본적으로 vLLM은 Triton 프로세스에 보이는 모든 GPU에서 선택해요. 멀티 GPU 모델을 특정 GPU 하위 집합에 고정하려면 config.pbtxt에 GPU_DEVICE_IDS 파라미터를 제공할 수 있어요. GPU 요구사항이 다른 여러 모델을 한 Triton 서버에 함께 배치할 때 유용해요.
instance_group [
{
count: 1
kind: KIND_MODEL
}
]
parameters {
key: "GPU_DEVICE_IDS"
value: { string_value: "1,2" }
}
GPU_DEVICE_IDS에 지정한 GPU ID 수는 총 병렬 world size(tensor_parallel_size * pipeline_parallel_size)와 일치해야 해요.
vLLM은 기본 설정에서 GPU 메모리의 최대 90%를 탐욕적으로 소비해요. 예제 모델은
gpu_memory_utilization을 50%로 설정해 이 동작을 바꿔요.model.json의gpu_memory_utilization같은 필드로 조정할 수 있어요.
Triton Inference Server 시작
모델 저장소를 준비했다면 Triton 서버를 시작할 차례예요. 이 예제에서는 NGC의 미리 빌드된 vLLM 백엔드 Triton 컨테이너를 쓸게요. vllm_backend 디렉터리 안에서 다음 명령을 실행해요.
docker run --gpus all -it --net=host --rm -p 8001:8001 --shm-size=1G --ulimit memlock=-1 --ulimit stack=67108864 -v ${PWD}:/work -w /work nvcr.io/nvidia/tritonserver:<xx.yy>-vllm-python-py3 tritonserver --model-repository ./samples/model_repository
<xx.yy>를 쓰고 싶은 Triton 버전으로 바꿔요. 서버가 시작되고 모델을 로드하는 출력이 보여요. 다음 같은 출력이 보이면 Triton이 추론 요청을 받을 준비가 된 거예요.
I1030 22:33:28.291908 1 grpc_server.cc:2513] Started GRPCInferenceService at 0.0.0.0:8001
I1030 22:33:28.292879 1 http_server.cc:4497] Started HTTPService at 0.0.0.0:8000
I1030 22:33:28.335154 1 http_server.cc:270] Started Metrics Service at 0.0.0.0:8002
첫 번째 추론 보내기
샘플 모델 저장소로 Triton을 시작했다면, generate 엔드포인트로 첫 추론 요청을 빠르게 실행할 수 있어요. 다른 터미널에서 아래 명령을 실행해 보세요.
curl -X POST localhost:8000/v2/models/vllm_model/generate -d '{"text_input": "What is Triton Inference Server?", "parameters": {"stream": false, "temperature": 0}}'
성공하면 서버가 이런 응답을 반환해요.
{"model_name":"vllm_model","model_version":"1","text_output":"What is Triton Inference Server?\n\nTriton Inference Server is a server that is used by many"}
samples 폴더에는 Triton의 asyncio gRPC 클라이언트 라이브러리로 추론을 실행하는 예제 클라이언트 client.py도 있어요.
최신 vLLM 버전 실행
Triton Inference Server에 포함된 vLLM 버전은 Framework Containers Support Matrix에서 확인할 수 있어요. 컨테이너 안에서 pip install ...으로 vLLM 버전을 올릴 수 있어요.
Triton 서버 다중 인스턴스 실행
Python 기반 백엔드로 Triton 서버를 여러 개 실행한다면, 서버마다 **다른 shm-region-prefix-name**을 지정해야 해요.
추가적인 vLLM 출력
추가 vLLM 출력은 요청 단위로 선택적으로 요청할 수 있어요.
Triton 메트릭
24.08 릴리스부터 Triton metrics 엔드포인트를 조회해 특정 vLLM 메트릭을 얻을 수 있어요. 서버를 띄운 뒤 curl localhost:8002/metrics로 조회해요. vLLM 통계는 vllm: 프리픽스가 붙은 필드로 보고돼요. Triton은 현재 vLLM의 다음 메트릭을 보고해요.
counter_prompt_tokens— 처리된 프리필 토큰 수 (카운터)counter_generation_tokens— 처리된 생성 토큰 수 (카운터)histogram_time_to_first_token— 첫 토큰까지의 시간 (초) 히스토그램histogram_time_per_output_token— 출력 토큰당 시간 (초) 히스토그램histogram_e2e_time_request— 종단 간 요청 지연 (초) 히스토그램histogram_num_prompt_tokens_request— 처리된 프리필 토큰 수histogram_num_generation_tokens_request— 처리된 생성 토큰 수histogram_best_of_request— best_of 요청 파라미터 히스토그램histogram_n_request— n 요청 파라미터 히스토그램
출력은 이런 형태예요.
# HELP vllm:prompt_tokens_total Number of prefill tokens processed.
# TYPE vllm:prompt_tokens_total counter
vllm:prompt_tokens_total{model="vllm_model",version="1"} 10
# HELP vllm:time_to_first_token_seconds Histogram of time to first token in seconds.
# TYPE vllm:time_to_first_token_seconds histogram
vllm:time_to_first_token_seconds_count{model="vllm_model",version="1"} 1
vllm:time_to_first_token_seconds_sum{model="vllm_model",version="1"} 0.03233122825622559
vLLM 엔진이 메트릭을 수집하도록 하려면 model.json의 disable_log_stats 옵션을 false로 하거나 비워 두면 돼요(기본 false).
"disable_log_stats": false
vLLM 메트릭은 잠재적 성능 저하 때문에 기본적으로 Triton 메트릭 서버에 보고되지 않아요. vLLM 모델의 메트릭 보고를 켜려면
config.pbtxt에 이 라인도 추가해야 해요.
parameters: {
key: "REPORT_CUSTOM_METRICS"
value: {
string_value: "true"
}
}
vLLM 엔진 건강 검사 (BETA)
vLLM Engine Health Check는 서버가 보고하는 모델 상태를 더 정확히 하기 위해 선택적으로 켤 수 있어요.