최적화와 튜닝

최적화와 튜닝 (Optimization and Tuning)

vLLM을 제대로 활용하려면 성능 튜닝을 무시할 수 없어요. 같은 모델이라도 시작 속도, 처리량(throughput), 지연 시간(latency)이 크게 달라질 수 있거든요. 이 페이지에서는 vLLM을 더 빠르고 효율적으로 돌리기 위한 주요 최적화 기법들을 정리할게요.

출처: vLLM 공식 문서 — optimization

더 빠른 시작 (Faster Startup)

서버가 뜨는 데 오래 걸리는 것도 하나의 큰 병목이에요. vLLM은 시작 시 컴파일과 CUDA 그래프 캡처를 수행하는데, 이를 건너뛰면 훨씬 빨리 시작할 수 있습니다.

  • CUDA 그래프 없이 서브하기: --enforce-eager — 컴파일과 CUDA 그래프 캡처를 모두 건너뛰어 가능한 한 빠르게 시작해요. 다만 안정 상태의 디코드(생성) 성능은 희생됩니다. 개발 반복 루프에서 유용하고, 부팅 과정 중 얼마나 많은 시간이 컴파일/캡처에 쓰이는지 측정할 때도 좋아요.

청크드 프리필 (Chunked Prefill)

프리필(prefill) 단계가 길면 그만큼 GPU가 다른 요청을 처리하지 못하고 멈춰 있어야 해요. 청크드 프리필(Chunked Prefill) 은 긴 프리필을 여러 조각으로 나눠, 디코드(생성) 단계와 번갈아 처리되도록 해 GPU 활용률을 끌어올리는 기법이에요.

청크드 프리필로 성능 튜닝하기

  • 최적의 처리량을 위해서는 max_num_batched_tokens > 8192로 설정하는 것을 권장해요. 특히 큰 GPU에서 작은 모델을 돌릴 때 효과적이죠.
from vllm import LLM

# max_num_batched_tokens로 성능을 튜닝합니다
llm = LLM(model="meta-llama/Llama-3.1-8B-Instruct", max_num_batched_tokens=8192)

병렬 처리 전략 (Parallelism Strategies)

vLLM은 다양한 병렬 처리 전략을 지원하며, 이들을 조합해서 서로 다른 하드웨어 구성에서 성능을 최적화할 수 있어요.

멀티 소켓 GPU 노드를 위한 NUMA 바인딩

여러 소켓에 GPU가 나뉘어 있는 시스템에서는 메모리 접근 패턴(NUMA)이 성능에 영향을 줘요. vLLM은 GPU에 맞는 NUMA 노드를 자동 감지하거나, 명시적으로 매핑할 수 있습니다.

# 보이는 GPU에 대한 NUMA 노드를 자동 감지
vllm serve meta-llama/Llama-3.1-8B-Instruct \
  --tensor-parallel-size 4 \
  --numa-bind ...

# 명시적인 NUMA 노드 매핑
vllm serve meta-llama/Llama-3.1-8B-Instruct \
  --tensor-parallel-size 4 \
  --numa-bind ...

NUMA 바인딩을 쓸 때 알아둘 점이 몇 가지 있어요.

  • CLI 사용 시 멀티프로세싱은 자동으로 spawn 메서드를 강제로 사용해요. Python API로 NUMA 바인딩을 켠다면 VLLM_WORKER_MULTIPROC_METHOD=spawn도 함께 설정하세요.
  • 자동 감지는 호스트의 NVML과 NUMA 지원에 의존해요. 매핑을 확실히 알 수 없다면 --numa-bind-nodes를 명시적으로 넘기세요.

CPU 백엔드 스레드 친화도 (CPU Backend Thread Affinity)

CPU 백엔드에서는 자동 정책을 재정의하려면 VLLM_CPU_OMP_THREADS_BIND를 CPU 백엔드용 CPU 리스트 형식으로 명시적으로 설정하거나, 이 동작을 끄려면 nobind를 사용하면 돼요.

입력 처리 (Input Processing)

fastokens 백엔드

VLLM_USE_FASTOKENS는 vLLM v0.23.0 이후에서 사용할 수 있어요. 설치된 vLLM 버전이 이 환경 변수를 인식하지 못한다면, 오버라이드를 켜기 전에 vLLM을 업그레이드하세요.

VLLM_USE_FASTOKENS=1 vllm serve Qwen/Qwen3-8B

오프라인 API에서도 동일하게 사용할 수 있습니다.

병렬 처리 (Parallel Processing)

입력 처리는 API 서버 스케일아웃을 통해 병렬로 실행할 수 있어요.

# API 프로세스 4개 + 엔진 코어 프로세스 1개 실행
vllm serve Qwen/Qwen2.5-VL-3B-Instruct --api-server-count 4

# API 프로세스 4개 + 엔진 코어 프로세스 2개 실행
vllm serve Qwen/Qwen2.5-VL-3B-Instruct --api-server-count 4 -dp 2

어텐션 백엔드 선택 (Attention Backend Selection)

vLLM은 서로 다른 하드웨어와 사용 사례에 최적화된 여러 어텐션 백엔드를 지원해요. 백엔드는 GPU 아키텍처, 모델 유형, 설정에 따라 자동으로 선택되지만, 최적 성능을 위해 직접 지정할 수도 있습니다.

사용 가능한 백엔드, 각 백엔드의 기능 지원, 설정 방법에 대한 자세한 내용은 Attention Backend Feature Support 문서를 참고하세요.

더 알아보기 (Learn more)