review · 느린 모델에 손님이 몰리면
리뷰 한 줄 읽는 데 1초, 손님은 열둘
손님 리뷰를 주제 24개와 짝지어 읽는 교차 인코더(bge-reranker-base, int8 279 MB)입니다. 이 상자(CPU 1개)에서 리뷰 한 건에 1초 안팎이 걸립니다. 그런 모델에 여러 명이 한꺼번에 오면 어떻게 받아 낼까요? 같은 모델·같은 입력을 네 가지 경로로 두었습니다 — 바꿔 가며 눌러 보세요.
| # | 리뷰 | 응답 | 시간 띠 (회색 기다림 · 주황 추론 · 파랑 접수증) | 기다림 | 추론 | 왕복 | 1위 주제 |
|---|
기다림·추론은 상자가 Server-Timing 헤더로 알려 준 값, 왕복은 브라우저가 잰 값(인터넷 왕복 포함). 띠의 길이는 이번 묶음에서 가장 늦게 끝난 요청 기준.
네 가지가 각각 무엇을 포기하나
① 순진하게 /naive/predict
들어오는 대로 전부 동시에 추론합니다(FastAPI 스레드 풀). CPU 하나를 N명이 나누니 모두가 N배 느려지고, 아무도 거절당하지 않지만 아무도 제때 받지 못합니다. 메모리도 동시 수만큼 늘어 — 12명이면 상한(1.2 GiB)을 넘겨 커널이 상자를 죽입니다(502, 2026-10-20 실측). "그냥 올렸더니 느려요… 그러다 죽어요" 의 정체.
② 줄 세우고 넘치면 거절 /limited/predict
동시에 추론 1건, 대기석 4. 대기석이 차면 429 + Retry-After 로 바로 돌려보냅니다. 받은 사람은 제 속도로 받고, 못 받은 사람은 즉시 알고 다시 옵니다. 과정 M7 D3 의 429 는 "한 사람이 너무 자주", 여기는 "상자가 감당 못 함" — 같은 번호, 다른 이유. 15초 넘게 기다리면 503.
③ 마이크로 배칭 /batched/predict
25 ms 동안 모인 요청을 한 번의 추론으로 돌립니다(최대 8). GPU 라면 8건이 1건 값에 가깝게 나와 처리량이 크게 늡니다. 그런데 CPU 1개에선? 응답 헤더 X-Batch-Size 와 추론 시간을 보면 답이 보입니다 — 배칭은 "어디서" 이득인지 재 보는 자리.
④ 접수증 /queue/jobs
바로 202 + 접수 번호 + 몇 번째 + 예상 대기를 주고 끊습니다. 뒤에서 일꾼 하나가 차례로 처리하고, 손님은 접수증으로 묻습니다(queued → running → done). 과정 M1 이름표 "방송 직후 주문이 몰리면 줄을 세우고 뒤에서 처리한다" 의 가장 작은 실물. 줄이 20을 넘으면 429. 운영에선 줄을 Redis·SQS 에 두어 상자가 재시작돼도 남게 합니다 — 여기선 프로세스 안이라 재시작하면 사라집니다(일부러 남긴 결함).
②③④ 는 추론 레인 하나(스레드 1개)를 같이 씁니다 — "추론기는 하나" 라는 운영의 전제. ① 만 그 전제를 무시합니다. 같은 글은 캐시(X-Cache: hit)라 어느 방식이든 즉시입니다. 상자의 지표(review_*)는 강사 Grafana 의 "6단계" 행에 — 처리 중·대기·거절·기다린 시간·배치 크기가 그려집니다.
직접 호출
Swagger: /api/docs · 지금 상태 /api/stats · 모델 /api/model
B=https://review.camp.itda.work/api
curl -si $B/limited/predict -H 'content-type: application/json' -d '{"text":"가격이 좀 비싸긴 한데 직원분이 친절했어요"}' | grep -iE 'HTTP/|server-timing|x-cache|topics'
# 접수증
curl -s $B/queue/jobs -H 'content-type: application/json' -d '{"text":"30분 줄 섰는데 단팥빵 품절이라고 해서 화났어요"}'
# → {"job_id":"a1b2c3d4","status":"queued","position":0,"eta_seconds":1.2}
curl -s $B/queue/jobs/a1b2c3d4 # → {"status":"done","result":{"topics":[…]},"waited_ms":…,"inference_ms":…}
# 열둘이 한꺼번에(맥에서): just burst $B 12