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 재초기화 시도” → 런타임 충돌**
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 관련 환경 변수를 최우선으로 설정하도록 수정했습니다.
# /mnt/c/Python/workspace/deepseek_ocr/api.pyfromconfig.env_setupimportsetup_environment# 환경 변수 설정을 최우선으로 호출setup_environment()# ... (이후 나머지 import 및 코드)
이 조치로 api.py와 test/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
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
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의 실행 환경이 동일하게 구성되어 문제가 완전히 해결되었습니다.