최적화 레벨

최적화 레벨 (Optimization Levels)

vLLM에는 시작 시간과 성능을 맞바꿀 수 있는 4가지 최적화 레벨(-O0, -O1, -O2, -O3)이 있어요. 개발 단계에서는 빨리 켜는 게 좋고, 운영 환경에서는 성능이 더 중요하죠. 이 레벨 하나로 컴파일·퓨전·cudagraph 동작을 통째로 조정할 수 있어요.

  • -O0: 최적화 없음. 시작이 가장 빠르지만 성능은 가장 낮아요.
  • -O1: 빠른 최적화. 단순 컴파일과 빠른 퓨전, PIECEWISE cudagraph를 써요.
  • -O2: 기본 최적화. 컴파일 범위와 퓨전을 추가하고 FULL_AND_PIECEWISE cudagraph를 사용해요.
  • -O3: 공격적 최적화. 지금은 -O2와 같지만, 앞으로 시간이 오래 걸리거나 실험적인 최적화가 추가될 수 있어요.

모든 최적화 레벨 기본값은 내부 플래그를 직접 설정해서 똑같이 만들 수 있어요. 사용자가 직접 설정한 플래그가 최적화 레벨 기본값보다 우선해요.

레벨 요약과 사용 예시

# CLI usage
vllm serve RedHatAI/Llama-3.2-1B-FP8 -O1

# Python API usage
from vllm.entrypoints.llm import LLM

llm = LLM(
    model="RedHatAI/Llama-3.2-1B-FP8",
    optimization_level=2 # equivalent to -O2
)

-O0: 최적화 없음

가능한 한 빨리 시작하는 레벨이에요. 오토튜닝, 컴파일, cudagraph 모두 없어요. 개발 초기 단계나 디버깅에 좋아요.

설정:

  • -cc.cudagraph_mode=NONE
  • -cc.mode=NONE (-cc.custom_ops=["none"]도 함께 적용)
  • -cc.pass_config.fuse_...=False (모든 퓨전 비활성)
  • --kernel-config.enable_flashinfer_autotune=False

-O1: 빠른 최적화

빠른 시작을 우선하되 컴파일과 cudagraph 같은 기본 최적화는 유지해요. 코드가 cudagraph나 컴파일을 깨지 않는지 확인하면서 시작 속도를 원하는 대부분의 개발 시나리오에 좋은 균형이에요.

설정:

  • -cc.cudagraph_mode=PIECEWISE
  • -cc.mode=VLLM_COMPILE
  • --kernel-config.enable_flashinfer_autotune=True

퓨전:

  • -cc.pass_config.fuse_norm_quant=True*
  • -cc.pass_config.fuse_act_quant=True*
  • -cc.pass_config.fuse_act_padding=True
  • -cc.pass_config.fuse_mla_dual_rms_norm=True

* 두 연산 중 하나라도 커스텀 커널을 쓰면 이 퓨전이 켜지고, 아니면 Inductor 퓨전이 더 좋아요.
† ROCm 전용이고 AITER가 필요해요.

-O2: 전체 최적화 (기본)

시작 시간을 희생하더라도 성능을 우선해요. 프로덕션 워크로드에 권장되기 때문에 기본값이에요. 이 레벨의 퓨전은 컴파일 범위가 추가돼 더 오래 걸릴 수 있어요.

설정 (-O1에 더해):

  • -cc.cudagraph_mode=FULL_AND_PIECEWISE
  • -cc.pass_config.fuse_allreduce_rms=True
  • -cc.pass_config.fuse_rope_kvcache=True

† ROCm 전용이고 AITER가 필요해요.

-O3: 공격적 최적화

현재는 -O2와 같지만, 앞으로 시간이 더 걸리거나 실험적인 최적화가 추가될 수 있어요.

문제 해결

흔한 이슈

  1. 시작 시간이 너무 길다-O0이나 -O1을 써서 시작을 빠르게
  2. 컴파일 오류 — 추가 디버깅 정보를 위해 debug_dump_path 사용
  3. 성능 이슈 — 프로덕션이면 -O2 사용 확인

더 알아보기 (Learn more)