Skip to content

[Feature] RAG 답변 생성 병렬 처리 #340

Description

@kangcheolung

📌 Description

RAG 답변 생성은 GPU 1대·Ollama 인스턴스 1개 전제로 순차 처리된다(RagJobWorker
인스턴스 정확히 1개, #218/#286/#288). 질문이 몰리면 뒤에 온 사용자일수록 대기 시간이
누적된다.

GPU를 늘리지 않고도, Ollama의 병렬 슬롯(OLLAMA_NUM_PARALLEL)을 활용해 동시에
최대 N개 질문을 처리하도록 구조를 확장한다. GPU 1대가 갖고 있던 여유 용량(단일
스트림 디코딩은 GPU 연산력을 다 못 씀)을 지금까지 안 쓰고 있었다는 전제에서 출발한다.

기존 안전장치(RagJobTimeoutSweeper의 강제 종료, #288의 조건부 UPDATE 기반
경합 방지)는 그대로 유지되어야 한다 — 이번 작업은 "안전하게 순차 처리"를
"안전하게 N개 동시 처리"로 확장하는 것이지, 안전장치를 다시 만드는 게 아니다.

✅ To-do

  • OLLAMA_NUM_PARALLEL=N 설정 후 curl로 Ollama 자체가 실제 병렬 처리하는지
    인프라 레벨 검증 (애플리케이션 코드 변경 전)
  • RagResponseRepository에 원자적 claim 쿼리 추가
    (SELECT ... FOR UPDATE SKIP LOCKED, embedding_jobs 패턴 재사용)
  • RagJobWorker@Scheduled 단일 폴링에서, 전용 스레드풀 기반 N개 독립
    워커 루프 구조로 전환
  • N=2로 먼저 병렬화 후, 동시 접수 통합테스트 작성/검증
    (#218CountDownLatch 동시 접수 방법론 재사용)
  • N을 3, 4로 올려가며 처리 시간 실측, 수확체감 지점 확인
  • ollama.generate-deadline(60s) / rag.worker.stale-threshold(90s)를
    병렬 처리 실측치 기준으로 재조정
  • RagJobTimeoutSweeper가 처리 중(락 걸린) job을 만났을 때의 대기 동작 관찰
    및 문서화 (같은 sweep 주기 내 다른 stale job 처리 지연 가능성)

✅ 완료 기준

  • 동시에 접수된 N건이 실제로 동시에 Ollama 호출되어 처리됨을 로그/실측으로 확인
  • 같은 job을 두 워커가 동시에 처리하는 경합이 없음(SKIP LOCKED로 방지 확인)
  • 스위퍼의 강제종료 vs Worker의 정상완료 간 경합 방지(#288)가 다중 워커
    환경에서도 그대로 유효함을 테스트로 확인
  • 병렬화 전/후 "동시 N건 처리 소요시간" 비교 데이터가 남음

📒 기타

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions