## Image Worker API (FastAPI) ### 개요 - 이미지 번역 파이프라인을 별도 프로세스로 격리한 로컬 API 서버입니다. - 단일 워커 프로세스가 순차 처리하며, OCR 이후에는 번역(I/O)과 마스크 생성(CPU)을 동시 실행해 성능을 높입니다. - 재시작/메모리 이슈를 대비해 워커 롤링(메모리/건수/업타임), 잡 타임아웃, 롤링 중 버퍼링, 429 백프레셔를 제공합니다. ### 아키텍처 - FastAPI 서버(가벼움) + 워커 프로세스(무거운 모듈) - 모듈별 프로바이더 전략(DirectML 우선 → 실패 시 CPU 폴백) 및 성공 프로바이더 캐시 - OCR: `modules/onnx_ocr_module/src/onnx_ocr_wrapper.py` - MIGAN: `modules/migan_module.py` - Rembg(BriaAI): `modules/bria_background_removal_module.py` - 데이터 전달은 파일 경로 기반(대용량 base64 불사용) - ProgramData 경로 표준화 - 작업/임시: `C:\ProgramData\ImgWorker\work` - 출력: `C:\ProgramData\ImgWorker\outputs` ### 환경변수(.env) - IMGWK_MAX_PENDING=200 # 큐 대기 한도(가득 차면 429) - IMGWK_ROLL_MAX_RSS_MB=1800 # 워커 RSS 임계(MB) - IMGWK_ROLL_MAX_JOBS=500 # 워커 재시작 처리 건수 임계 - IMGWK_ROLL_MAX_UPTIME_SEC=7200 # 워커 업타임 임계(초) - IMGWK_JOB_TIMEOUT_SEC=600 # 잡 타임아웃(초) - IMGWK_TEST_ROLL_EVERY_2=0 # (테스트) 2건마다 롤링 - IMGWK_OCR_PROVIDER=auto # auto|dml|cpu (강제 가능) - IMGWK_REMBG_PROVIDER=auto # rembg용 provider 강제(auto|dml|cpu) - (선택) 기타 모델 경로/스레드 설정은 토글로 전달 ### 기본 토글(default) - Rembg: 자체 로컬 사용(use_local_rembg=True) - Inpaint: MIGAN을 기본(GPU 시도; DirectML→CPU 폴백) - OCR provider override: `.env` IMGWK_OCR_PROVIDER(없으면 auto) ### 프로바이더 선택/폴백/캐시 - 순서: DirectML 우선 → 실패 시 CPU 폴백 - 성공한 프로바이더는 캐시 파일에 저장되어 이후 재초기화 시 재검증 생략 - OCR: `user_data/ocr_provider.json` - MIGAN: `user_data/migan_provider.json` - Rembg: `user_data/rembg_provider.json` - 모델별 강제 설정 - OCR: 토글 `ocr_provider_override` = auto|dml|cpu - MIGAN: 토글 `migan_provider_override` = auto|dml|cpu - Rembg: 환경변수 IMGWK_REMBG_PROVIDER = auto|dml|cpu ### 엔드포인트 - GET `/health` - ready 여부, 워커 PID - GET `/info` - 환경/경로/워커 상태 정보 - POST `/v1/process-image` - Body: `{ file_path, index, file_prefix?, toggle_overrides?, group_id?, seq? }` - Return: `{ accepted: true, job_id }` - POST `/v1/remove-background` - Body: `{ file_path, file_prefix?, toggle_overrides? }` - Return: `{ accepted: true, job_id }` - GET `/v1/jobs/{job_id}` - 상태: queued|running|done|error|cancelled, 결과/오류 포함 - DELETE `/v1/jobs/{job_id}` - queued 상태일 때만 취소 - 제어 엔드포인트 - POST `/v1/ocr/reinit` `{ provider?: 'auto'|'dml'|'cpu' }` → OCR 재초기화(프로바이더 반영/캐시) - POST `/v1/migan/reset` `{ use_cuda?: true|false }` → MIGAN 세션 재설정(DirectML 시도/폴백) ### 파이프라인(1 이미지) 1) 로드/검증 → 2) OCR → 3) [번역, 마스크] 병렬 → 4) 인페인트(MIGAN 기본) → 5) 렌더링 → 6) 저장 - 그룹 순서 보장: 클라이언트는 `group_id + seq`로 정렬, 서버는 무순서 완료 허용 ### 런타임 변경 - OCR 프로바이더: `/v1/ocr/reinit` 로 dml/cpu/auto 적용 가능(재초기화) - MIGAN: `/v1/migan/reset` 으로 DirectML 사용 여부 전환 가능 ### 운영 팁 - DML 미지원 VM/환경에서는 자동으로 CPU 폴백 - 큐 가득 차면 429 반환 → 재시도 로직 구현 권장 - 롤링 임계는 .env 로 조정 - 로그는 `logs/`에서 롤링 저장, 자세한 타이밍/프로바이더 사용 내역 확인 가능