vLLM, LibTorch Stable ABI로 이전해 PyTorch 재빌드 부담 줄인다
들어가며
vLLM은 C++ 및 CUDA 백엔드에서 PyTorch의 LibTorch 인터페이스를 광범위하게 사용한다. 과거에는 소스 코드에서 사용하는 API가 그대로여도 LibTorch의 바이너리 인터페이스가 바뀌면 vLLM을 다시 컴파일하고 링크해야 할 수 있었다. 이 결합은 새 PyTorch 지원을 늦추고 wheel 유지보수와 배포 비용을 키우는 요인이었다.
vLLM은 최근 LibTorch Stable ABI로의 이전 과정을 공개했다. v0.33.0부터는 Stable ABI를 사용하는 CUDA wheel을 배포한다. 다른 호환성 조건까지 충족한다면, 사용자는 호환되는 PyTorch 버전으로 업데이트할 때 vLLM을 다시 빌드하는 대신 torch wheel을 교체해 기존 패키지에서 불러올 수 있다.
Stable ABI가 해결하는 문제
ABI는 컴파일된 코드가 함수를 호출하는 방식, 데이터를 배치하는 방식, 심볼을 해석하는 방식을 규정한다. 따라서 API가 동일해 보여도 이미 컴파일된 확장 모듈이 계속 작동한다는 보장은 없다. Stable ABI는 호환 가능한 라이브러리 버전 사이에서 지원 대상 바이너리 인터페이스를 유지한다.
PyTorch의 LibTorch Stable ABI는 세 가지 층으로 구성된다. 일부 LibTorch 기능을 노출하는 안정적인 C shim, 이를 사용하기 쉽게 만드는 C++ 래퍼, 그리고 libtorch.so에 링크하지 않는 torch::headeronly 유틸리티다. 즉, LibTorch 전체를 안정화한 것이 아니라 범위를 제한한 안정 인터페이스다.
vLLM의 이전 방식
- 의존성 조사: PyTorch 호출을 목록화하고 현재 안정 API로 처리할 수 없는 부분과 필요한 보완 API를 확인했다.
- 일부 기능을 Python으로 이동: Stable ABI가 안정적인 SymInt와 PyTorch autograd 기능을 제공하지 않기 때문에 일부 meta function과 AutogradFunction을 C++에서 Python으로 옮겼다.
- 별도 안정 라이브러리 구축: CUDA 빌드에만 175개가 넘는 C++/CUDA 소스와 120개 이상의 헤더가 있어 전체를 한 번에 바꾸지 않았다. 별도 라이브러리를 만든 뒤 커널을 작은 단위로 이전했다.
TORCH_TARGET_VERSION빌드 플래그는 불안정한 LibTorch 헤더가 포함되면 빌드가 실패하도록 한다. - 연산자 등록 경로 변경: Stable ABI 연산자는
STABLE_TORCH_LIBRARY로 등록하고, 구현부를TORCH_BOX로 감싸 C++ 타입을 ABI를 통과할 수 있는StableIValue로 변환한다. - 파일별 API 교체: 예를 들어
torch::Tensor를torch::stable::Tensor로 바꾸고, 직접적인 LibTorch 호출 대신 안정 래퍼와 header-only 유틸리티를 사용한다. - 결과 검증: 단위 테스트와 성능 테스트, 변경 사항에 대한 줄 단위 검토를 수행한다. 또한
torch-abi-audit로 공유 라이브러리의 PyTorch 심볼을 검사해 불안정 심볼이 남았는지 확인한다.
한계와 비용
Stable ABI가 보장하는 것은 LibTorch의 바이너리 호환성이다. Python API의 차이, 최소 지원 CUDA 버전과 같은 GPU 요구사항, 서드파티 의존성은 별도로 맞춰야 한다. 이전 과정에서 is_pinned()에는 안정적인 대체 API가 없었기 때문에 vLLM은 torch_call_dispatcher를 통해 ATen 연산자를 ABI 안정적인 방식으로 호출했다. 이후 PyTorch 2.14에는 안정적인 C++ is_pinned() 메서드가 추가됐다.
C shim은 타입 변환, 연산자 검색, boxing 때문에 호스트 측 오버헤드를 추가할 수 있다. 일반적으로 비용은 작고 CUDA Graph 워밍업 이후에는 사라질 수 있지만, eager 모드에서 매우 빠른 커널을 반복 실행하면 영향을 받을 수 있다. vLLM은 이전 과정에서 눈에 띄는 런타임 성능 저하를 확인하지 않았다고 설명했다.
의미와 영향
이번 변화는 추론 엔진과 PyTorch의 출시 주기를 묶어 두던 요인을 하나 줄인다. 사용자는 호환되는 PyTorch 업데이트를 더 빠르게 활용할 수 있고, 개발자와 배포자는 반복적인 재빌드와 재링크 작업을 줄일 수 있다. 또한 대규모 CUDA 프로젝트가 실제로 자주 사용하는 API가 드러나면서 PyTorch의 Stable ABI 범위를 넓히는 데 필요한 실용적인 피드백도 제공한다.
다만 Stable ABI는 어떤 PyTorch 버전이든 무조건 교체할 수 있다는 약속이 아니다. vLLM의 사례에서 중요한 점은 단계적 이전, 빌드 단계의 차단 장치, 심볼 감사, 런타임 테스트를 결합해 바이너리 호환성을 검증 가능한 엔지니어링 작업으로 바꿨다는 데 있다.
출처: vLLM Blog
댓글
로그인 상태 확인 중…
댓글 불러오는 중…