vLLM 엔진 초기화 시 Cannot re-initialize CUDA in forked subprocess 런타임 오류 발생 #1

Open
opened 2025-11-05 17:44:22 +09:00 by kyy · 1 comment
Owner

Issue 내용

FastAPI 기반 API 서버 컨테이너에서 uvicorn 실행 시 vLLM 엔진 초기화 과정에서 다음과 같은 런타임 오류가 발생하며 컨테이너가 종료됨:

RuntimeError: Cannot re-initialize CUDA in forked subprocess. 
To use CUDA with multiprocessing, you must use the 'spawn' start method

로그 상 아래와 같은 EngineCore 프로세스 스택트레이스가 출력됨:

Process EngineCore_0:
...
EngineCore failed to start
...
torch._C._cuda_setDevice(device)

이로 인해 서비스가 정상적으로 기동되지 않고 즉시 종료되는 문제가 발생함.


Issue 원인

  • vLLM 엔진이 초기화될 때 내부적으로 별도의 자식 프로세스(EngineCore) 를 생성함
  • Linux 환경에서 Python multiprocessing 기본 start method가 fork이기 때문에, 부모 프로세스에서 이미 CUDA 컨텍스트가 초기화된 상태fork가 발생함
  • fork 기반 자식 프로세스에서 CUDA 컨텍스트를 재초기화하려고 시도하면서 충돌 발생
  • 해당 환경에서 FastAPI + uvicorn 구동 시, 모듈 임포트 타이밍에 vLLM 초기화를 수행한 것이 원인

정리하면:

“부모 프로세스에서 CUDA 선초기화 + fork로 생성된 EngineCore 자식 프로세스에서 CUDA 재초기화 시도” → 런타임 충돌

## Issue 내용 FastAPI 기반 API 서버 컨테이너에서 `uvicorn` 실행 시 vLLM 엔진 초기화 과정에서 다음과 같은 런타임 오류가 발생하며 컨테이너가 종료됨: ``` RuntimeError: Cannot re-initialize CUDA in forked subprocess. To use CUDA with multiprocessing, you must use the 'spawn' start method ``` 로그 상 아래와 같은 `EngineCore` 프로세스 스택트레이스가 출력됨: ``` Process EngineCore_0: ... EngineCore failed to start ... torch._C._cuda_setDevice(device) ``` 이로 인해 서비스가 정상적으로 기동되지 않고 즉시 종료되는 문제가 발생함. --- ## Issue 원인 * vLLM 엔진이 초기화될 때 내부적으로 **별도의 자식 프로세스(EngineCore)** 를 생성함 * Linux 환경에서 Python `multiprocessing` 기본 start method가 `fork`이기 때문에, 부모 프로세스에서 **이미 CUDA 컨텍스트가 초기화된 상태**로 `fork`가 발생함 * `fork` 기반 자식 프로세스에서 CUDA 컨텍스트를 **재초기화하려고 시도**하면서 충돌 발생 * 해당 환경에서 FastAPI + uvicorn 구동 시, 모듈 임포트 타이밍에 vLLM 초기화를 수행한 것이 원인 정리하면: > **“부모 프로세스에서 CUDA 선초기화 + fork로 생성된 EngineCore 자식 프로세스에서 CUDA 재초기화 시도” → 런타임 충돌**
kyy self-assigned this 2025-11-05 17:44:28 +09:00
Author
Owner

vLLM 초기화 이슈 (FastAPI/Uvicorn 환경)

API 서버 실행 시 vLLM 엔진이 초기화되지 못하고 컨테이너가 종료되는 현상을 해결했습니다.

문제 현상

  • FastAPI로 실행되는 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가 출력되어, multiprocessingforkspawn 시작 방식이 문제의 원인일 것으로 초기에 추측했습니다.
  • 하지만 관련 코드를 모두 제거하고 테스트한 결과, multiprocessing 설정은 문제의 원인이 아니었음이 확인되었습니다. 이 RuntimeErrorImportError로 인해 비정상 종료되는 과정에서 발생한 부차적인 현상으로 보입니다.

최종 해결책

api.py 파일의 최상단, 다른 모듈이 임포트되기 전에 setup_environment() 함수를 호출하여 vLLM 관련 환경 변수를 최우선으로 설정하도록 수정했습니다.

# /mnt/c/Python/workspace/deepseek_ocr/api.py

from config.env_setup import setup_environment

# 환경 변수 설정을 최우선으로 호출
setup_environment()

# ... (이후 나머지 import 및 코드)

이 조치로 api.pytest/test.py의 실행 환경이 동일하게 구성되어 문제가 완전히 해결되었습니다.

## vLLM 초기화 이슈 (FastAPI/Uvicorn 환경) API 서버 실행 시 vLLM 엔진이 초기화되지 못하고 컨테이너가 종료되는 현상을 해결했습니다. ### 문제 현상 - FastAPI로 실행되는 `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 관련 환경 변수를 최우선으로 설정하도록 수정했습니다. ```python # /mnt/c/Python/workspace/deepseek_ocr/api.py from config.env_setup import setup_environment # 환경 변수 설정을 최우선으로 호출 setup_environment() # ... (이후 나머지 import 및 코드) ``` 이 조치로 `api.py`와 `test/test.py`의 실행 환경이 동일하게 구성되어 문제가 완전히 해결되었습니다.
b23072 added a new dependency 2025-11-06 16:52:34 +09:00
b23072 removed a dependency 2025-11-06 16:52:38 +09:00
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: kyy/deepseek_ocr#1