본문으로 건너뛰기

[vllm] vLLM의 콜드 스타트 성능을 20% 향상시키는 비동기 최적화 기법

PR 링크: vllm-project/vllm#40331 상태: Merged | 변경: +None / -None

들어가며

vLLM은 대규모 언어 모델(LLM) 서빙을 위한 강력한 프레임워크이지만, 초기 구동 시 발생하는 무거운 라이브러리 임포트와 모델 가중치 로딩으로 인해 '콜드 스타트(Cold-start)' 시간이 길다는 단점이 있었습니다. 이번 PR은 엔진 구동 과정에서 직렬로 수행되던 작업들을 백그라운드 스레드로 분산하여, 전체적인 초기화 시간을 최대 20% 이상 단축했습니다.

코드 분석

1. vllm/entrypoints/cli/main.py: 라이브러리 임포트 및 forkserver 병렬화

기존에는 메인 스레드에서 torchtransformers를 순차적으로 임포트하며 약 4초 이상의 I/O 대기 시간이 발생했습니다. 이를 백그라운드 스레드로 옮겨 메인 스레드가 다른 초기화 작업을 수행하는 동안 로딩을 완료하도록 개선했습니다.

# Before: 메인 스레드에서 순차적 임포트
# After: 백그라운드 스레드에서 비동기 프리로드
def _bg_preload_torch() -> None:
    try:
        import torch
    except Exception:
        return
    with contextlib.suppress(Exception):
        import transformers

_threading.Thread(target=_bg_preload_torch, daemon=True).start()

또한, forkserver 방식을 도입하여 EngineCore 프로세스 생성 시 발생하는 파이썬 인터프리터 초기화 비용을 제거했습니다.

2. vllm/entrypoints/openai/api_server.py: 가중치 프리페치(Weight Prefetching)

엔진이 모델 파일을 mmap하기 전에, 부모 프로세스에서 미리 OS 페이지 캐시로 파일을 읽어들이는 작업을 수행합니다.

# 부모 프로세스에서 백그라운드 스레드로 가중치 프리페치
def _prefetch_worker() -> None:
    # ... (생략) ...
    with ThreadPoolExecutor(max_workers=8) as pool:
        list(pool.map(read_one, shard_paths))

threading.Thread(target=_prefetch_worker, daemon=True).start()

왜 이게 좋은가

이번 최적화의 핵심은 'GIL(Global Interpreter Lock)의 활용''I/O와 CPU 작업의 오버랩'입니다. torch.so 파일 로딩이나 파일 읽기 작업은 GIL을 해제하므로, 백그라운드 스레드에서 수행해도 메인 스레드의 파이썬 코드 실행을 방해하지 않습니다.

성능 개선 수치 (Qwen2.5-7B-Instruct 기준)

  • Cold Start: 92.44s → 73.72s (-20.2%)
  • Warm Start: 49.59s → 46.88s (-5.5%)

교훈

  1. I/O Bound 작업은 메인 스레드에서 분리하라: 라이브러리 로딩이나 파일 읽기는 메인 로직과 병렬로 수행할 수 있는 최적의 후보입니다.
  2. Forkserver의 이점: spawn 방식은 매번 새로운 파이썬 환경을 구축하지만, forkserver는 미리 준비된 환경을 복제하므로 프로세스 생성 속도가 훨씬 빠릅니다.
  3. Best-effort 전략: 프리페치 실패 시 기존 로직으로 자연스럽게 폴백(fallback)되도록 설계하여 시스템 안정성을 유지했습니다.

리뷰어 피드백 반영

  • daemon=True 설정을 통해 CLI 종료 시 프로세스가 행(hang) 걸리는 문제를 해결했습니다.
  • ModelScopeHuggingFace 환경 모두를 지원하도록 분기 처리했습니다.
  • API 전용 워커(headless)에서는 불필요한 프리페치를 수행하지 않도록 가드 조건을 추가했습니다.

참고 자료

⚠️ 알림: 이 분석은 AI가 실제 코드 diff를 기반으로 작성했습니다.

댓글

관련 포스트

PR Analysis 의 다른글