vLLM 엔진 초기화 시 Cannot re-initialize CUDA in forked subprocess 런타임 오류 발생 #1
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Issue 내용
FastAPI 기반 API 서버 컨테이너에서
uvicorn실행 시 vLLM 엔진 초기화 과정에서 다음과 같은 런타임 오류가 발생하며 컨테이너가 종료됨:로그 상 아래와 같은
EngineCore프로세스 스택트레이스가 출력됨:이로 인해 서비스가 정상적으로 기동되지 않고 즉시 종료되는 문제가 발생함.
Issue 원인
multiprocessing기본 start method가fork이기 때문에, 부모 프로세스에서 이미 CUDA 컨텍스트가 초기화된 상태로fork가 발생함fork기반 자식 프로세스에서 CUDA 컨텍스트를 재초기화하려고 시도하면서 충돌 발생정리하면:
vLLM 초기화 이슈 (FastAPI/Uvicorn 환경)
API 서버 실행 시 vLLM 엔진이 초기화되지 못하고 컨테이너가 종료되는 현상을 해결했습니다.
문제 현상
api.py에서 vLLM 엔진 초기화 시ImportError: cannot import name 'LlamaFlashAttention2'오류가 발생하며 서버가 비정상 종료되었습니다.test/test.py스크립트를 직접 실행하면 정상적으로 작동하여 혼란을 주었습니다.근본 원인 분석
api.py가 vLLM 엔진을 초기화하기 전에 필요한 환경 변수를 설정하지 않았기 때문입니다.test/test.py스크립트 내부에는os.environ["VLLM_USE_V1"] = "0"코드가 있어, vLLM의 V1 엔진 대신 호환성 문제가 없는 레거시 엔진을 사용하도록 명시하고 있었습니다.api.py에서는 이 환경 변수를 설정하는setup_environment()함수(config/env_setup.py에 정의됨)를 호출하는 코드가 누락되어 있었습니다.api.py는 vLLM의 기본 V1 엔진을 사용하려 시도했고, 컨테이너에 설치된transformers라이브러리 버전과 호환되지 않아ImportError가 발생한 것입니다.초기 오진단
RuntimeError: Cannot re-initialize CUDA in forked subprocess가 출력되어,multiprocessing의fork와spawn시작 방식이 문제의 원인일 것으로 초기에 추측했습니다.multiprocessing설정은 문제의 원인이 아니었음이 확인되었습니다. 이RuntimeError는ImportError로 인해 비정상 종료되는 과정에서 발생한 부차적인 현상으로 보입니다.최종 해결책
api.py파일의 최상단, 다른 모듈이 임포트되기 전에setup_environment()함수를 호출하여 vLLM 관련 환경 변수를 최우선으로 설정하도록 수정했습니다.이 조치로
api.py와test/test.py의 실행 환경이 동일하게 구성되어 문제가 완전히 해결되었습니다.