uv 바이트코드 컴파일로 vLLM 시작 시간 줄이기

새로운 vLLM 컨테이너는 사전 컴파일된 Python 바이트코드를 제공함으로써 시작 시간을 크게 줄일 수 있으며, 이는 런타임 임포트 중 반복적인 컴파일을 방지합니다.

런타임 패키지를 설치하기 전에 UV_COMPILE_BYTECODE=1 환경 플래그를 설정하면 uv 빌드 도구가 빌드 프로세스 중에 Python 소스 코드를 바이트코드로 컴파일합니다. 이 방식은 모델 간에 공유되는 임포트 중 발생하는 비용이 많이 드는 반복 컴파일을 피하여 측정 가능한 시작 시간 절감 효과를 제공합니다.

H100 서버에서의 성능 향상

사전 컴파일된 바이트코드를 제공했을 때 H100 서버에서 실행 시 상당한 시작 시간 절감 효과가 있었으며, 다양한 모델 크기에서 일관된 성능 개선을 보여주었습니다.

Qwen3-8B 및 Qwen3-32B의 경우, 중앙값 기준 쌍별 시작 시간 절감은 각각 17.6초와 17.8초였습니다.これらの測定は、Xeon Platinum 8480+ / H100 SXM 80GB 서버에서 수행되었으며, 바이트코드가 포함된 패키지와 캐시가 제거된 패키지를 비교했습니다. 이러한 타이밍은 이미지 풀 및 모델 다운로드 시간을 제외한다는 점에 유의해야 합니다.

시작 시간의 백분율 감소는 8B 모델(17.6%)이 32B 모델(13.9%)보다 더 컸으며, 이는 두 모델이 공유하는 Python 임포트 작업을 피하는 것과 일치합니다.

구현 및 공식 지원

사용자는 이미지 빌드 중 런타임 패키지를 설치하기 전에 UV_COMPILE_BYTECODE=1 플래그를 설정하여 이 성능 개선을 구현할 수 있습니다. 이는 빌드 단계에서 Python 소스 파일을 바이트코드로 컴파일하도록 uv에 지시합니다.

공식 vLLM 이미지를 사용하는 사용자의 경우, 필요한 변경 사항이 CUDA nightly 빌드(예: vllm/vllm-openai:nightly-8cbd5d03006c33185f402249ff2b448efd594986)에 포함되었습니다. 이 기능은 v0.32.0 버전부터 공식 릴리스 이미지에서 기본적으로 지원되므로, 사용자가 빌드 플래그를 수동으로 설정할 필요가 없습니다.

시작 시간 절감의 기술적 메커니즘

Python은 기본적으로 실행 전에 소스 코드를 코드 객체로 컴파일하기 때문에 시작 시간이 줄어듭니다. 유효한 .pyc 파일은 이 컴파일된 코드를 저장하므로, Python은 이후 임포트 시 컴파일 단계를 건너뛰고 해당 파일을 직접 로드할 수 있습니다.

pip와 같은 표준 패키지 관리자는 설치 중에 바이트코드를 컴파일하지만, uv는 기본적으로 이 단계를 건너뜁니다. 이미지에 바이트코드가 포함되어 있으면 Python 인터프리터는 사전 컴파일된 파일을 즉시 로드할 수 있습니다. 이는 serving-CLI 임포트 프로세스 중 소스 컴파일러 호출에 소요되는 시간을 크게 줄입니다.

진단 테스트에서 serving-CLI 임포트 시간은 사전 컴파일된 이미지를 사용할 때 5,257회의 소스 컴파일러 호출에서 0회로 감소했습니다. 또한 Docker 외부의 독립 설치에서 유효한 바이트코드는 계측된 serving-CLI 임포트 시간을 12.20초에서 5.01초로 줄여 7.19초를 절약했습니다.

하드웨어 간 성능 관찰

성능 향상은 소비자 하드웨어에서도 관찰되었지만, 하드웨어 및 런타임 환경이 다르기 때문에 결과는 별도로 유지됩니다.

i9-13900HX / RTX 4090 Laptop에서 Qwen3-0.6B, Qwen3-1.7B 및 SmolLM2-1.7B를 포함한 일치 이미지 연구에서는 중앙값 쌍별 절감이 12.8초에서 13.5초 범위로 나타나, 테스트된 18개 쌍 모두에서 사전 컴파일이 유리했습니다.

별도의 비-Docker 설치에서는 설치된 파일이 이미 메모리에 상주한 상태에서 사전 컴파일된 패키지 캐시가 서버 시작 시 9~12초를 절약했습니다. 이 측정은 파일이 OS 페이지 캐시에 유지된 경우에도 절감 효과를 확인했습니다.

구현 시 주의사항 및 트레이드오프

유용하지만 바이트코드 컴파일을 활성화하면 이미지 빌드 및 배포에 특정 고려 사항이 도입됩니다.

  • 이미지 크기: 사전 컴파일된 이미지는 압축 시 약 153MB(또는 한 테스트에서 전체 크기의 1.8%)가 추가되며, 초기 이미지 풀이 느린 경우 관련이 있을 수 있습니다.
  • 빌드 프로세스: 사용자 지정 이미지를 빌드할 때 uv 명령이 런타임 패키지를 설치하기 전에 UV_COMPILE_BYTECODE=1 플래그를 설정해야 합니다. 또한 최종 이미지를 확인하고 런타임 Python의 compileall 함수를 사용하여 누락된 캐시를 준비해야 합니다.
  • 절감 범위: 주요 절감은 임포트 중 컴파일러 시간 감소에서 비롯됩니다. 모듈 초기화 및 기타 설정 작업은 남아 있으며, 전체 서버 시작 절감이 전적으로 컴파일러에 기인하는 것은 아닙니다.

자세한 환경, 실행 순서 및 대조군에 대한 전체 방법과 측정값은 보충 데이터에서 확인할 수 있습니다.

Sources