성능·벤치마크 (Performance/Benchmarks)
성능·벤치마크 (Performance/Benchmarks)
vLLM은 성능 테스트와 평가를 위한 포괄적인 벤치마킹 도구 모음을 제공합니다.
- Benchmark CLI:
vllm benchCLI 도구와 특수 벤치마크 스크립트를 통해 인터랙티브하게 성능을 테스트합니다. - Parameter Sweeps: 여러 구성(configuration)에 대해
vllm bench실행을 자동화합니다. 최적화와 튜닝에 유용합니다. - Performance Dashboard: 커밋마다 벤치마크를 게시하는 자동화된 CI입니다.
- vLLM Recipes로 벤치마킹: Recipe 변환 도구를 사용해 vLLM Recipes에서
config.yaml과env.sh를 생성해 벤치마킹에 활용합니다.
벤치마크 모음 (Benchmark Suites)
vLLM은 크게 두 종류의 벤치마크를 제공합니다.
성능 벤치마크 (Performance Benchmarks)
성능 벤치마크는 개발 과정에서 새로운 변경 사항이 다양한 워크로드에서 성능을 향상시키는지 확인하기 위해 사용합니다. 다음과 같은 상황에서 트리거됩니다.
perf-benchmarks레이블과ready레이블이 모두 붙은 커밋마다- PR이 vLLM에 머지될 때
최신 성능 결과는 공개된 vLLM Performance Dashboard에서 확인할 수 있습니다.
야간 벤치마크 (Nightly Benchmarks)
야간 벤치마크는 vLLM의 성능을 대안 프레임워크와 비교하는 벤치마크입니다. 비교 대상은 다음과 같습니다.
- tgi (Text Generation Inference)
- trt-llm (TensorRT-LLM)
- lmdeploy
주로 vLLM의 주요 업데이트 시점(예: 새 버전으로 업그레이드할 때)에 실행됩니다. 주요 목적은 소비자가 vLLM을 다른 옵션 대신 선택할지 평가하는 데 있으므로, perf-benchmarks와 nightly-benchmarks 레이블이 모두 붙은 커밋마다 트리거됩니다.
최신 야간 벤치마크 결과는 vLLM v0.6.0 같은 주요 릴리스 블로그 포스트에서 공유합니다.
Performance Dashboard
성능 대시보드는 어떤 변경 사항이 다양한 워크로드에서 성능을 개선/저하시키는지 확인하는 데 사용합니다. perf-benchmarks와 ready 레이블이 모두 붙은 커밋마다 벤치마크 실행을 트리거하고, PR이 vLLM에 머지될 때도 갱신합니다.
결과는 공개된 vLLM Performance Dashboard에 자동으로 게시됩니다.
벤치마크 수동 실행 (Manually Trigger the benchmark)
vllm-ci-test-repo 이미지와 vLLM 벤치마크 스위트를 사용합니다. 환경에 따라 이미지 접미사가 다릅니다.
- x86 CPU 환경:
-cpu접미사 이미지 사용 - AArch64 CPU 환경:
-arm64-cpu접미사 이미지 사용
다음은 CPU용 docker run 명령 예시입니다. GPU에서는 ON_CPU 환경 변수를 설정하지 않으면 됩니다.
export VLLM_COMMIT=7f42dc20bb2800d09faa72b26f25d54e26f1b694 # main 브랜치의 전체 커밋 해시 사용
export HF_TOKEN=<유효한 Hugging Face 토큰>
if [[ "$(uname -m)" == aarch64 || "$(uname -m)" == arm64 ]]; then
IMG_SUFFIX="arm64-cpu"
else
IMG_SUFFIX="cpu"
fi
docker run -it --entrypoint /bin/bash \
-v /data/huggingface:/root/.cache/huggingface \
-e HF_TOKEN=$HF_TOKEN -e ON_CPU=1 \
--shm-size=16g --name vllm-cpu-ci \
public.ecr.aws/q9t5s3a7/vllm-ci-test-repo:${VLLM_COMMIT}-${IMG_SUFFIX}
그런 다음 docker 인스턴스 안에서 아래 명령을 실행합니다.
bash .buildkite/performance-benchmarks/scripts/run-performance-benchmarks.sh
실행하면 벤치마크 스크립트가 benchmark/results 폴더 아래에 benchmark_results.md와 benchmark_results.json을 생성합니다.
런타임 환경 변수
| 변수 | 설명 | 기본값 |
|---|---|---|
ON_CPU |
Intel® Xeon® 및 Arm® Neoverse™ 프로세서에서 '1'로 설정 | 0 |
SERVING_JSON |
서빙 테스트에 사용할 JSON 파일 | 빈 문자열 (기본 파일 사용) |
LATENCY_JSON |
레이턴시 테스트에 사용할 JSON 파일 | 빈 문자열 (기본 파일 사용) |
THROUGHPUT_JSON |
스루풋 테스트에 사용할 JSON 파일 | 빈 문자열 (기본 파일 사용) |
REMOTE_HOST |
벤치마크할 원격 vLLM 서비스 IP | 빈 문자열 |
REMOTE_PORT |
원격 vLLM 서비스 포트 | 빈 문자열 |
PROMPTS_PER_CONCURRENCY |
서빙 테스트의 num_prompts 계산 배수 (num_prompts = max_concurrency × 값). JSON num_prompts를 덮어씀 |
NULL |
ENABLE_ADAPTIVE_CONCURRENCY |
정적 서빙 max_concurrency 스윕 후 적응형 SLA 기반 동시성 탐색을 활성화하려면 '1' | 0 |
SLA_TTFT_MS |
적응형 동시성 탐색의 기본 TTFT SLA 임계값(밀리초) | 3000 |
SLA_TPOT_MS |
적응형 동시성 탐색의 기본 TPOT SLA 임계값(밀리초) | 100 |
ADAPTIVE_MAX_PROBES |
추가 적응형 탐색 프로브의 최대 수 | 8 |
ADAPTIVE_MAX_CONCURRENCY |
적응형 탐색 중 허용되는 최대 동시성 | 1024 |
시각화 (Visualization)
convert-results-json-to-markdown.py는 벤치마크 결과를 실제 값이 담긴 마크다운 테이블로 만들어 줍니다. 변환된 결과는 buildkite/performance-benchmark 잡 페이지 안에서 테이블로 확인할 수 있습니다. 테이블이 보이지 않으면 벤치마크가 끝날 때까지 기다렸다가 확인하면 됩니다. 테이블의 json 버전(벤치마크의 json 버전과 함께)은 마크다운 파일에 첨부되고, 원시 벤치마크 결과(json 파일 형식)는 벤치마킹의 Artifacts 탭에 있습니다.
성능 결과 비교 (Performance Results Comparison)
compare-json-results.py는 convert-results-json-to-markdown.py로 변환한 벤치마크 결과 JSON 파일을 비교하는 데 사용합니다. 실행하면 벤치마크 스크립트가 benchmark/results 폴더 아래에 benchmark_results.md와 benchmark_results.json을 생성하고, compare-json-results.py가 두 benchmark_results.json 파일을 비교해 Output Tput, Median TTFT, Median TPOT 같은 성능 비율(performance ratio)을 제공합니다.
benchmark_results.json 하나만 전달하면 compare-json-results.py가 해당 파일 안의 서로 다른 TP/PP 구성을 비교합니다.
두 결과를 비교하는 예시입니다. Model, Dataset 이름, input/output 길이가 같은 결과를 max concurrency와 qps 기준으로 비교합니다.
python3 compare-json-results.py -f results_a/benchmark_results.json -f results_b/benchmark_results.json
Output Tput (tok/s) — Model: [meta-llama/Llama-3.1-8B-Instruct], Dataset Name: [random], Input Len: [2048.0], Output Len: [2048.0]
| max concurrency 수 | qps | results_a/benchmark_results.json | results_b/benchmark_results.json | perf_ratio | |
|---|---|---|---|---|---|
| 0 | 12 | inf | 24.98 | 186.03 | 7.45 |
| 1 | 16 | inf | 25.49 | 246.92 | 9.69 |
| 2 | 24 | inf | 27.74 | 293.34 | 10.57 |
| 3 | 32 | inf | 28.61 | 306.69 | 10.72 |
compare-json-results.py 명령줄 파라미터
대부분의 경우 --file만 지정해 원하는 벤치마크 결과를 파싱하면 됩니다.
| 파라미터 | 타입 | 기본값 | 설명 |
|---|---|---|---|
--file |
str (appendable) |
None | 입력 JSON 결과 파일. 여러 벤치마크 출력을 비교하려면 여러 번 지정 가능 |
--debug |
bool |
False |
디버그 모드. 설정 시 문제 해결/검증에 도움이 되는 모든 정보 출력 |
--plot / --no-plot |
bool |
True |
성능 플롯 생성 여부. 그래프 생성을 끄려면 --no-plot 사용 |
--xaxis |
str |
max concurrency 수 |
비교 플롯의 X축에 사용할 컬럼 이름 (예: concurrency 또는 batch size) |
--latency |
str |
p99 |
TTFT/TPOT에 사용하는 레이턴시 집계 방식. median 또는 p99 지원 |
--ttft-max-ms |
float |
3000.0 |
TTFT 플롯의 참조 상한(밀리초). SLA 임계값 시각화에 주로 사용 |
--tpot-max-ms |
float |
100.0 |
TPOT 플롯의 참조 상한(밀리초). SLA 임계값 시각화에 주로 사용 |
유효 Max Concurrency 요약 (Valid Max Concurrency Summary)
설정된 TTFT·TPOT SLA 임계값을 기준으로 compare-json-results.py가 각 벤치마크 결과의 최대 유효 동시성(maximum valid concurrency)을 계산합니다. Max concurrency 수 (Both) 컬럼은 TTFT와 TPOT 제약을 동시에 충족하는 가장 높은 동시성 수준을 의미하며, 용량 계획(capacity planning)과 사이징(sizing) 가이드에 주로 사용됩니다.
| # | 설정 | Max concurrency(TTFT ≤ 10000ms) | Max concurrency(TPOT ≤ 100ms) | Max concurrency(Both) | Output Tput @ Both(tok/s) | TTFT @ Both(ms) | TPOT @ Both(ms) |
|---|---|---|---|---|---|---|---|
| 0 | results-a | 128.00 | 12.00 | 12.00 | 127.76 | 3000.82 | 93.24 |
| 1 | results-b | 128.00 | 32.00 | 32.00 | 371.42 | 2261.53 | 81.74 |
성능 벤치마크와 해당 파라미터에 대한 자세한 정보는 Benchmark README와 performance benchmark description에서 확인할 수 있습니다.
지속적 벤치마킹 (Continuous Benchmarking)
지속적 벤치마킹은 다양한 모델과 GPU 디바이스에 걸쳐 vLLM의 성능을 자동으로 모니터링합니다. 시간에 따른 vLLM의 성능 특성을 추적하고 성능 회귀(regression)나 개선을 식별하는 데 도움이 됩니다.
동작 방식 (How It Works)
지속적 벤치마킹은 PyTorch 인프라 저장소의 GitHub workflow CI를 통해 트리거되며 4시간마다 자동 실행됩니다. 워크플로는 세 가지 유형의 성능 테스트를 실행합니다.
- Serving tests: 요청 처리와 API 성능 측정
- Throughput tests: 토큰 생성 속도 평가
- Latency tests: 응답 시간 특성 평가
벤치마크 구성 (Benchmark Configuration)
벤치마킹은 vllm-benchmarks 디렉토리에 설정된 사전 정의된 모델 세트에서 실행됩니다. 벤치마킹에 새 모델을 추가하려면:
- 벤치마크 구성에서 적절한 GPU 디렉토리로 이동
- 해당 구성 파일에 모델 사양을 추가
- 다음 예정된 벤치마크 실행부터 새 모델이 포함됨