You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
|`VLLM_CONCURRENCY`| 4 | 동시 호출 상한(Semaphore). 권장 1\~8 |
276
275
|`MAX_BATCH_ITEMS`| 128 |`/chat/batch` 한 요청의 최대 items |
277
276
|`VLLM_TIMEOUT_SECONDS`| 600s | 업스트림 호출 타임아웃 |
278
-
|`VLLM_ACQUIRE_TIMEOUT_SECONDS`| 300s | 세마포어 퍼밋 획득 최대 대기(초). 초과 시 그 요청만 실패 처리 → 퍼밋 누수·half-open(끊긴 클라 FIN 미수신)으로 인한 데드락 백스톱|
277
+
|`VLLM_ACQUIRE_TIMEOUT_SECONDS`| 300s | 세마포어 퍼밋 획득 최대 대기(초). 초과 시 그 요청만 실패 처리.|
279
278
280
279
#### 3.2.3. 배치 NDJSON 스트리밍
281
280
282
-
-`/chat/batch` 는 다건을 받아 fan-out(`asyncio.create_task` ) 후 **완료 순서** (`asyncio.wait(..., return_when=FIRST_COMPLETED)` )로 한 줄씩 흘린다(`application/x-ndjson` , chunked). 입력 순서가 아니므로 `id` 로 매칭하며, 한두 건이 실패해도 나머지는 계속 진행한다(각 라인의 `status` 로 판단).
283
-
-**백프레셔·데드락 하드닝:** 스트리밍 루프는 0.5초마다 `request.is_disconnected()` 로 클라 생존을 확인해, 클라가 끊기면(FIN 수신) in-flight task 를 전부 cancel 하고 세마포어 퍼밋을 즉시 반납한다. half-open(FIN 미수신)처럼 끊김을 못 잡는 경우는 `client.chat()` 의 **퍼밋 획득 타임아웃** (`VLLM_ACQUIRE_TIMEOUT_SECONDS` , 기본 300s)이 되어 그 요청만 실패 처리한다 → 끊긴 런이 퍼밋을 영구 점유해 게이트웨이가 멈추는 데드락 방지.
281
+
-`/chat/batch` 는 다건을 받아 fan-out 후 **완료 순서** 로 한 줄씩 흘린다.
282
+
- 입력 순서가 아니므로 `id` 로 매칭하며, 한두 건이 실패해도 나머지는 계속 진행한다.
283
+
- 백프레셔, 데드락 방지 : 동시 처리 수는 세마포어 퍼밋으로 제한한다. 퍼밋이 다 차면 새 요청은 빌 때까지 대기한다. 끊긴 요청이 퍼밋을 붙든 채 남으면 게이트웨이가 멈출 수 있어, 두 단계로 회수한다:
284
+
1. 스트리밍 루프가 0.5초마다 request.is_disconnected()로 연결을 확인 → 끊기면 진행 중 작업을 취소하고 퍼밋을 즉시 반납한다.
285
+
286
+
1. 끊김 신호가 안 오는 half-open 연결은 퍼밋 획득 타임아웃(`VLLM_ACQUIRE_TIMEOUT_SECONDS` , 기본 300초)으로 해당 요청만 실패시켜 퍼밋을 회수한다.
284
287
285
288
요청 본문:
286
289
287
290
```json
288
291
{"items": [
289
-
{"id": "0001_0600-0606", "body": {<vLLM chat.completions body — /chat 와 동일>}},
292
+
{"id": "0001_0600-0606", "body": {<vLLM chat.completions body - /chat 와 동일>}},
290
293
{"id": "0002_0606-0612", "body": {<...>}}
291
294
]}
292
295
```
@@ -309,7 +312,7 @@ done
309
312
310
313
#### 3.2.4. 서버 실행
311
314
312
-
게이트웨이는`script/service.sh` 로 관리한다.
315
+
서버는`script/service.sh` 로 관리한다.
313
316
314
317
```bash
315
318
./script/service.sh start # 백그라운드 기동 (healthz OK 까지 대기)
@@ -319,15 +322,14 @@ done
319
322
```
320
323
321
324
- 직접 실행: `PYTHONPATH=src uv run uvicorn app:app --host 0.0.0.0 --port 8001`
배치가 순차보다 빠름(약 **1.7배** , 게이트웨이 동시성 `VLLM_CONCURRENCY=4` 만큼 fan-out 병렬 — 빈출력/폭주 jitter 로 실행마다 배수는 변동). 도착 순서 ≠ 입력 순서(**완료순 스트리밍** ), `X-Batch-Total=12` . 다건 1요청·완료순 스트리밍·각 건 독립 `status` 모두 정상.
676
+
배치가 순차보다 빠름(약 **1.7배** , 게이트웨이 동시성 `VLLM_CONCURRENCY=4` 만큼 fan-out 병렬. 빈출력/폭주 jitter 로 실행마다 배수는 변동). 도착 순서 ≠ 입력 순서(**완료순 스트리밍** ), `X-Batch-Total=12` . 다건 1요청·완료순 스트리밍·각 건 독립 `status` 모두 정상.
SceneMaker의 클립 영상 분석은 영상에 포함된 **시각·청각 정보를 안정적으로 생성** 해내는 것을 목표로 한다. 6초 클립 하나를 입력 받아 세 갈래의 정보를 `{summary, objects, ocr, actions, bgm, sfx}`6필드 JSON으로 구조화한다.
12
+
SceneMaker의 클립 영상 분석은 영상에 포함된 **시각·청각 정보를 안정적으로 생성** 해내는 것을 목표로 한다. 6초 클립을 입력 받아 시청각 정보를 `{summary, ocr, actions, sounds}`json 형식의 4필드로 구조화한다.
13
13
14
14
-**종합 분석**
15
15
-`summary` : 시각·청각을 종합한 한 문장 요약
16
16
17
17
-**시각 분석**
18
-
-`objects` (핵심 객체·인물)
19
-
20
18
-`ocr` (화면 텍스트: 자막·로고)
21
19
22
-
-`actions` (행동·움직임·장면 전환)
20
+
-`actions` (행동·움직임 등)
23
21
24
22
-**청각 분석**
25
-
-`bgm` (배경음·음악·분위기)
26
-
27
-
-`sfx` (효과음: 박수·타이핑 등)
23
+
-`sounds` (효과음: 박수·타이핑 등)
28
24
29
-
여기서 관건은 **안정성** 이다. 700개 클립을 일괄 처리하는 벤치마크에서 같은 클립·같은 프롬프트인데도 실행마다 출력이 흔들리거나 무너지면 품질 점수 자체를 신뢰할 수 없다. 1편(파이프라인 구축) 검증 과정에서 네 가지 품질저하 패턴이 간헐적으로 식별됐다.
25
+
**관건은 안정성** 이다. 출력이 흔들리면 품질 점수를 믿을 수 없다. 1편 검증에서 이를 위협하는 네 가지 품질저하 패턴이 간헐적으로 발견됐다.
30
26
31
27
1.**조기 종료 (Premature EOS)** : 첫 토큰부터 EOS(문장 종료)를 출력해 content가 빈 문자열로 끝난다. strict JSON schema의 과도한 압박 등으로 모델이 "할 말 없이" 바로 닫아버리는 경우.
32
28
2.**붕괴 (Text Degeneration)** : 정상 확률분포를 잃고 이종문자·시스템 토큰을 쏟아내다 JSON을 완성 못 하고 터진다(Gibberish Generation).
33
29
3.**반복 (Repetition Loop)** : 같은 단어·항목·JSON 구조를 확률 갇힘으로 맴돌며 반복 생성한다.
34
30
4.**추론 시간 편차 (Latency Jitter)** : 붕괴·반복이 정상 EOS를 막아 출력이 `max_tokens` 까지 늘어지는 탈주 생성(Runaway Generation) 때문에, 클립당 추론 시간의 최소\~최대 격차가 극심하다.
35
31
36
-
이 패턴들은 1편에서 **관찰·식별** 됐을 뿐, 추론 파라미터로 **통제 가능한지는 다루지 않았다** . 본 편(2편)은 출력을 strict JSON Schema로 고정한 상태를 전제로 한다. 그 위에서 두드러지는 **반복·degeneration 등** 이 추론 파라미터로 통제되는지를 한 번에 하나씩(OFAT, one-factor-at-a-time) 크게 흔들어 규명한 **1단계 스크리닝** 의 기록이다.
32
+
본 편은 그 패턴들이 추론 파라미터로 통제되는지를 규명한다. 1편에서는 네 패턴을 관찰·식별했을 뿐, 파라미터로 잡을 수 있는지는 다루지 않았기 때문이다.
33
+
전제는 출력을 strict JSON Schema로 고정한 상태다. 그 위에서도 두드러지는 반복·degeneration 등을 대상으로, 파라미터를 한 번에 하나씩(OFAT) 크게 흔들어 어느 것이 통제에 듣는지 1차로 굵게 거르는 단계다.
37
34
38
35
## 2. 실험 환경
39
36
40
-
벤치마크와 **동일한 모델·서빙·호출 경로** 에서 수행했다. 파라미터 효과를 그 환경 그대로 관찰하기 위함이다. 환경 구성의 상세는 1편 「멀티모달 LLM 한국 방송 6초 클립 영상 이해 벤치마크 파이프라인 구축」에 있으므로, 여기서는 핵심 요약과 본 실험의 **튜닝 대상 파라미터** 만 다룬다.
37
+
벤치마크와 **동일한 모델·서빙·호출 경로** 에서 수행했다. 파라미터 효과를 그 환경 그대로 관찰하기 위함이다. 환경 구성의 상세는 1편 「멀티모달 LLM 한국 방송 6초 클립 영상 이해 벤치마크 파이프라인 구축」에 있으므로, 여기서는 핵심 요약과 본 실험의 **튜닝 대상 파라미터** 만 다룬다.
41
38
42
39
### 2.1. 환경 요약
43
40
@@ -62,9 +59,9 @@ SceneMaker의 클립 영상 분석은 영상에 포함된 **시각·청각 정
62
59
63
60
### 2.2. 튜닝 대상 파라미터
64
61
65
-
추론 매개변수는 서버 설정이 아니라 **클라이언트가 요청 본문에 직접 명시** 한다. 파라미터는 작동 레이어에 따라 두 갈래로 나뉜다 —**vLLM 입력 처리** (미디어를 모델에 넣기 전 준비)와 **Qwen3-Omni 생성 샘플링** (모델이 출력을 뽑는 디코딩). 본 실험의 OFAT 스윕은 *생성 샘플링* 그룹만 한 번에 하나씩(변동) 흔들고, 나머지는 전 구간 고정한다.
62
+
추론 매개변수는 서버 설정이 아니라 **클라이언트가 요청 본문에 직접 명시** 한다. 파라미터는 작동 레이어에 따라 두 갈래로 나뉜다.**vLLM 입력 처리** (미디어를 모델에 넣기 전 준비)와 **Qwen3-Omni 생성 샘플링** (모델이 출력을 뽑는 디코딩). 본 실험의 OFAT 스윕은 *생성 샘플링* 그룹만 한 번에 하나씩(변동) 흔들고, 나머지는 전 구간 고정한다.
0 commit comments