ForStream commited on
Commit
72ceb13
·
1 Parent(s): 5955ef8

Fix OOM: KoSimCSE lazy 로드 + torch CPU 휠 + spaces 제거 + thread 제한

Browse files
Files changed (3) hide show
  1. Dockerfile +3 -1
  2. api/main.py +18 -4
  3. api/requirements.txt +3 -3
Dockerfile CHANGED
@@ -19,7 +19,9 @@ ENV PYTHONUNBUFFERED=1 \
19
  PYTHONDONTWRITEBYTECODE=1 \
20
  PIP_NO_CACHE_DIR=1 \
21
  HF_HOME=/app/.cache/huggingface \
22
- TRANSFORMERS_CACHE=/app/.cache/huggingface
 
 
23
 
24
  # HF Spaces 기본 포트
25
  ENV PORT=7860
 
19
  PYTHONDONTWRITEBYTECODE=1 \
20
  PIP_NO_CACHE_DIR=1 \
21
  HF_HOME=/app/.cache/huggingface \
22
+ KOSIMCSE_DEVICE=cpu \
23
+ OMP_NUM_THREADS=2 \
24
+ TOKENIZERS_PARALLELISM=false
25
 
26
  # HF Spaces 기본 포트
27
  ENV PORT=7860
api/main.py CHANGED
@@ -71,7 +71,8 @@ app.add_middleware(
71
  allow_credentials=True, allow_methods=["*"], allow_headers=["*"],
72
  )
73
 
74
- # 전역 데이터 (앱 시작 1회 로드)
 
75
  print(f"[startup] LLM_BACKEND = {llm_adapters.LLM_BACKEND}")
76
  print(f"[startup] 데이터 로드: {TTL_PATH}")
77
  GRAPH = rag_engine.load_ttl(TTL_PATH)
@@ -79,9 +80,18 @@ CHUNKS = rag_engine.load_chunks(JSONL_PATH)
79
  ALIAS = rag_engine.load_alias(ALIAS_PATH)
80
  LOOKUP = rag_engine.load_lookup(LOOKUP_PATH)
81
  print(f"[startup] 트리플 {len(GRAPH):,}, 청크 {len(CHUNKS)}")
82
- print(f"[startup] KoSimCSE warm-up...")
83
- ss.warm_up(CHUNKS)
84
- print(f"[startup] ready")
 
 
 
 
 
 
 
 
 
85
 
86
 
87
  # ============================================================
@@ -158,6 +168,10 @@ def ask(req: AskRequest):
158
  raise HTTPException(400, "question is empty")
159
  mode = req.mode if req.mode in ("axisB", "keyword") else "axisB"
160
 
 
 
 
 
161
  # Python column: LLM 답변 생성 없이 raw 컨텍스트
162
  try:
163
  if mode == "axisB":
 
71
  allow_credentials=True, allow_methods=["*"], allow_headers=["*"],
72
  )
73
 
74
+ # 전역 데이터 가벼운 것(TTL/청크/alias/lookup)만 startup에 로드.
75
+ # KoSimCSE 임베딩은 메모리 스파이크가 커서 첫 질문 때 lazy 로드 (OOM 회피).
76
  print(f"[startup] LLM_BACKEND = {llm_adapters.LLM_BACKEND}")
77
  print(f"[startup] 데이터 로드: {TTL_PATH}")
78
  GRAPH = rag_engine.load_ttl(TTL_PATH)
 
80
  ALIAS = rag_engine.load_alias(ALIAS_PATH)
81
  LOOKUP = rag_engine.load_lookup(LOOKUP_PATH)
82
  print(f"[startup] 트리플 {len(GRAPH):,}, 청크 {len(CHUNKS)}")
83
+ print(f"[startup] ready (KoSimCSE 첫 질문 시 lazy 로드)")
84
+
85
+ _kosimcse_warmed = False
86
+
87
+ def _ensure_kosimcse():
88
+ """KoSimCSE 모델·임베딩을 첫 사용 시 한 번만 로드."""
89
+ global _kosimcse_warmed
90
+ if not _kosimcse_warmed:
91
+ print("[lazy] KoSimCSE warm-up 시작...")
92
+ ss.warm_up(CHUNKS)
93
+ _kosimcse_warmed = True
94
+ print("[lazy] KoSimCSE warm-up 완료")
95
 
96
 
97
  # ============================================================
 
168
  raise HTTPException(400, "question is empty")
169
  mode = req.mode if req.mode in ("axisB", "keyword") else "axisB"
170
 
171
+ # axisB 모드는 KoSimCSE 의미검색 필요 → 첫 사용 시 lazy 로드
172
+ if mode == "axisB":
173
+ _ensure_kosimcse()
174
+
175
  # Python column: LLM 답변 생성 없이 raw 컨텍스트
176
  try:
177
  if mode == "axisB":
api/requirements.txt CHANGED
@@ -1,3 +1,6 @@
 
 
 
1
  fastapi==0.115.6
2
  uvicorn[standard]==0.32.1
3
  pydantic==2.10.4
@@ -15,6 +18,3 @@ anthropic==0.40.0
15
  huggingface_hub==0.36.2
16
  requests
17
  ollama==0.4.4
18
-
19
- # Spaces ZeroGPU
20
- spaces
 
1
+ # torch는 CPU 전용 휠 사용 (CUDA 라이브러리 ~5GB 제거 → 이미지·메모리 대폭 감소)
2
+ --extra-index-url https://download.pytorch.org/whl/cpu
3
+
4
  fastapi==0.115.6
5
  uvicorn[standard]==0.32.1
6
  pydantic==2.10.4
 
18
  huggingface_hub==0.36.2
19
  requests
20
  ollama==0.4.4