네. 지금까지의 acceptance 흐름에서 Stage7은 Stage1/Stage6와 목적이 완전히 다릅니다.
따라서 Stage7의 최종 산출물은 단순 PASS/FAIL이 아니라 모델별 Production Profile이어야 합니다.
예를 들어 최종적으로 이런 표를 만드는 단계라고 보면 됩니다.
| Model | Precision | TP | max-model-len | max-num-seqs | gpu-mem-util | Prefix | Concurrency | Replica | SLO |
|---|---|---|---|---|---|---|---|---|---|
| GLM-5.3 | FP8 | 8 | ... | ... | ... | ON | ... | 1 | ... |
| Qwen3.6-35B-A3B | FP8 | 2 | ... | ... | ... | ON | ... | 2 | ... |
| gpt-oss-20b | ... | 1 | ... | ... | ... | ... | ... | ... | ... |
| DeepSeek-V4.1-Flash | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| PaddleOCR-VL-1.6 | ... | ... | ... | ... | ... | ... | ... | ... | ... |
여기에 단순 vLLM parameter만 있는 것이 아니라:
GPU / replica
TP
precision / quantization
max-model-len
max-num-seqs
gpu-memory-utilization
chunked prefill
prefix cache
KV strategy
concurrency limit
RPM / TPM
TTFT / ITL SLO
Output TPS
local model cache requirement
startup time
까지 포함하는 것이 좋습니다.
그리고 이 결과가 나중에:
Stage7
│
├── vLLM Deployment values
├── InferencePool/EPP
├── LiteLLM model config
├── LiteLLM RPM/TPM/concurrency quota
└── capacity / replica planning
으로 연결됩니다.
Stage7은 Stage6가 끝나지 않은 상태에서 시작하지 않는 것을 권합니다.
최소 Gate는:
Stage1 PASS
↓
Stage3a baseline 확보
↓
Stage6 preflight PASS
├ GPU Operator
├ GPU 1/8 smoke
├ topology
└ DCGM
↓
Stage6c PASS
↓
Stage6a NCCL PASS
↓
Stage6b Network PASS
↓
Stage6e AIStor PASS
↓
Stage6k basic/mixed/saturation PASS
↓
Stage7
입니다.
6h/6i 같은 NetworkPolicy/Hubble은 production readiness 측면에서는 필요하지만, 모델 parameter 탐색 자체를 시작하기 위한 hard prerequisite까지는 아닙니다.
6f resilience 역시 Stage7 전에 할 필요 없습니다.
Stage7에서는 단순히:
GLM-5.3
만 기록하면 부족합니다.
반드시:
model
repository
revision / commit
weight format
quantization
tokenizer revision
vLLM version
CUDA
driver
container image digest
를 고정해야 합니다.
예:
model:
name: GLM-5.3
repository: ...
revision: ...
tokenizer_revision: ...
runtime:
vllm: 0.30.0
image: ...
image_digest: sha256:...
precision:
dtype: ...
quantization: ...
Stage7 도중 모델 revision이나 container가 바뀌면 이전 결과와 이후 결과를 같은 dataset으로 취급하면 안 됩니다.
Stage7 benchmark 중 모델 다운로드 시간을 섞지 않는 것이 중요합니다.
권장 구조는:
AIStor / MinIO
│
│ source of truth
▼
B300 local NVMe
/mnt/local-nvme-cache/models/
│
├ GLM-5.3/
├ Qwen3.6-35B-A3B/
├ gpt-oss-20b/
├ DeepSeek-V4.1-Flash/
└ ...
│
▼
vLLM Pod
입니다.
Stage7 performance test에서는 기본적으로 warm local model cache를 사용합니다.
AIStor → NVMe cold model load 성능은 별도 storage/startup test로 분리하는 편이 좋습니다.
Stage7에서 가장 흔히 생기는 문제가 모든 모델에:
input=1024
output=512
concurrency=64
를 똑같이 넣고 성능을 비교하는 것입니다.
그렇게 하면 실제 production capacity와 상당히 다른 결과가 나올 수 있습니다.
현재 계획을 기준으로 모델군을 최소한:
① Ontology / Reasoning
GLM-5.3
Qwen3.6-35B-A3B
gpt-oss-20b
② Online discovery
DeepSeek-V4.1-Flash
GLM-5.3-Flash
③ Document / Vision
PaddleOCR-VL-1.6
docling-layout-heron
docling-models
DocumentFigureClassifier
로 나누는 것이 좋습니다.
그리고 각각에 production workload profile을 만들어야 합니다.
예를 들어 LLM이면:
interactive-short
input P50/P95
output P50/P95
long-context
input P50/P95
output P50/P95
mixed
short : long 비율
prefix-reuse
예상 shared prefix 길이
예상 reuse ratio
를 정의합니다.
Document/VLM 계열은 token benchmark와 별개로:
pages/document
image resolution
PDF size
pages/sec
documents/sec
batch size
GPU memory
end-to-end latency
가 중요합니다.
즉 Stage7 LLM test와 Document/VLM test harness는 같으면 안 됩니다.
예를 들어:
TP 1/2/4/8
precision BF16/FP8/FP4
concurrency 1~2048
max-num-seqs 여러 값
gpu-mem-util 여러 값
context 여러 값
을 Cartesian product로 돌리면 시험량이 폭발합니다.
대신 coarse → fine 탐색이 좋습니다.
Model qualification
↓
Precision
↓
TP
↓
Memory parameters
↓
Concurrency
↓
Workload
↓
Feature
↓
Soak
순으로 후보를 계속 줄입니다.
가장 먼저 각 모델이 현재 runtime에서 제대로 뜨는지 확인합니다.
Model load
↓
Ready
↓
single request
↓
short input
↓
long input
↓
expected output
↓
no CUDA error
↓
no XID/ECC
이 단계에서는 성능 최적화를 하지 않습니다.
목표는:
이 모델/version이 현재 vLLM/B300 환경에서 정상적으로 실행 가능한가?
입니다.
실패하는 모델은 parameter search 대상에서 제외합니다.
그다음 모델별 precision 후보를 찾습니다.
예:
BF16
↓
FP8
↓
FP4 (지원되는 모델/runtime일 경우)
비교할 것은 단순 TPS만이 아닙니다.
model load success
HBM
TTFT
ITL
Output TPS
quality
error
kernel/runtime stability
를 같이 봅니다.
예를 들어:
BF16
HBM 150GB
TPS 1.0x
quality baseline
FP8
HBM 90GB
TPS 1.5x
quality acceptable
FP4
HBM 55GB
TPS 1.9x
quality degradation
이라면 production 후보는 FP8이 될 수 있습니다.
Stage7에서는 quality gate가 반드시 필요합니다.
Stage1 FP8/FP4는 hardware/kernel sanity였고, Stage7 FP8/FP4는 해당 모델의 품질 + 성능 선택 문제입니다.
그다음 가장 중요한 parameter가 TP입니다.
가능하면:
TP1
↓
TP2
↓
TP4
↓
TP8
순서로 모델이 들어가는 최소 TP부터 시작합니다.
목표는 무조건 TP8이 아닙니다.
예를 들어:
Qwen model
TP1
OOM
↓
TP2
PASS
↓
TP4
PASS
↓
TP8
PASS
라면 TP2/4/8을 비교합니다.
왜냐하면:
TP8 × replica 1
보다:
TP2 × replica 4
가 production aggregate throughput에서 훨씬 유리할 수도 있기 때문입니다.
따라서 Stage7에서는:
가장 빠른 TP
보다
SLO를 만족하면서 GPU당 throughput이 가장 좋은 TP
를 찾는 것이 중요합니다.
TP마다 최소:
TTFT P50/P95/P99
ITL P50/P95/P99
Output TPS
Request/s
HBM/GPU
GPU util
power
NCCL traffic
을 기록합니다.
그리고:
Output TPS / GPU
도 계산하세요.
예:
TP2 = 1,000 tok/s
→ 500 tok/s/GPU
TP4 = 1,600 tok/s
→ 400 tok/s/GPU
TP8 = 2,200 tok/s
→ 275 tok/s/GPU
라면 TP8이 절대 TPS는 가장 높지만 cluster capacity 관점에서는 TP2가 더 효율적일 수 있습니다.
Precision과 TP 후보가 정해지면:
gpu-memory-utilization
max-model-len
max-num-seqs
chunked-prefill
등을 조정합니다.
예를 들어:
gpu-memory-utilization
0.80
↓
0.85
↓
0.90
↓
0.92
↓
0.95
처럼 탐색할 수 있습니다.
목표는 0.95를 쓰는 것이 아니라:
충분한 KV capacity
+
OOM safety margin
+
stable latency
사이의 적정점을 찾는 것입니다.
Production에서는 acceptance benchmark 최대값보다 약간의 여유를 두는 것이 좋습니다.
여기서 Stage3a6/Stage6k saturation 방법을 그대로 재사용하면 됩니다.
예:
C1
C2
C4
C8
C16
C32
C64
C128
...
또는 모델 특성에 맞는 범위로 시작합니다.
관찰:
TTFT
ITL
Output TPS
request/s
vllm:num_requests_running
vllm:num_requests_waiting
vllm:kv_cache_usage_perc
GPU util
HBM
그리고:
Throughput
│
│ ______
│ /
│ /
│ /
│_______/____________ Concurrency
↑
knee point
을 찾습니다.
Stage7에서 매우 중요합니다.
예를 들어:
C256
TPS 1000
TTFT P99 2.5s
C384
TPS 1250
TTFT P99 4.0s
C512
TPS 1300
TTFT P99 8.5s
C768
TPS 1310
TTFT P99 20s
라면 실행 가능한 최대치는 C768일 수 있지만 production 설정은 C384 정도가 될 수 있습니다.
즉:
max executable concurrency ≠ production concurrency
입니다.
Stage7 결과에는 둘을 별도로 기록하세요.
이제 synthetic saturation에서 끝내지 않고 실제 traffic 형태를 넣습니다.
예:
short interactive 60%
medium 25%
long context 10%
very-long 5%
같은 분포입니다.
Stage3a3에서 만든 balanced crossover 방식도 여기서 매우 유용합니다.
특히:
long request가 들어왔을 때
short request TTFT가 얼마나 악화되는가?
를 모델별로 확인합니다.
실제 서비스에서 system prompt, ontology, agent context 등이 반복된다면 매우 중요합니다.
Stage6k-prefix와 동일하게:
Cold
↓
same exact prefix
↓
Warm
을 테스트합니다.
그리고:
prefix_cache_queries
prefix_cache_hits
cold TTFT
warm TTFT
hit rate
를 측정합니다.
단순히:
--enable-prefix-caching
을 켜면 빠를 것이라고 가정하면 안 됩니다.
실제 workload의 prefix reuse가 낮으면 오히려 production sizing에서 중요한 feature가 아닐 수도 있습니다.
KV offload가 필요한 모델만 수행합니다.
우선순위는 현재 환경에서는:
HBM
↓
local NVMe
↓
remote tier
입니다.
비교:
none
local_nvme
remote_object
memkv_tcp
다만 AIStor/MinIO remote_object와 native MemKV TCP는 계속 별개의 tier로 유지합니다.
측정:
TTFT
ITL
TPS
KV hit
restore latency
restore bandwidth
network traffic
그리고 remote tier가 실제 이득이 없으면 굳이 production architecture에 넣지 않습니다.
최종 후보 설정만 장시간 테스트합니다.
모든 조합을 soak할 필요 없습니다.
예:
GLM candidate #1
Qwen candidate #1
gpt-oss candidate #1
...
만 대상으로:
2h / 4h / 필요 시 8h
운영합니다.
관찰:
TTFT drift
ITL drift
TPS drift
GPU temp
clock
power
HBM
ECC
XID
Pod restart
OOM
request error
첫 5~10분은 measurement에서 제외합니다.
예를 들어 Stage7 결과가:
Qwen
TP2
production concurrency = 64
output TPS = 500
SLO PASS
라면 B300 8 GPU node에서:
GPU0-1 replica A
GPU2-3 replica B
GPU4-5 replica C
GPU6-7 replica D
즉:
TP2 × 4 replicas
를 후보로 계산할 수 있습니다.
반면 GLM이 TP8을 요구한다면:
GPU0~7
↓
GLM replica 1
이 됩니다.
그래서 Stage7 결과가 바로 주간 모델 배치 / 야간 모델 전환 설계로 연결됩니다.
예를 들어 Stage7에서 Qwen의 production-safe concurrency가 64라고 나왔다고 합시다.
그러면 LiteLLM/Gateway에서 무작정 200 request를 backend에 보내는 것이 아니라:
Users
↓
LiteLLM
├─ auth
├─ team quota
├─ RPM
├─ TPM
└─ concurrency admission
↓
Inference Gateway / EPP
↓
Qwen replicas
↓
vLLM
처럼 Stage7 capacity를 admission control에 반영합니다.
즉 Stage7은 benchmark 보고서를 만드는 단계라기보다 production control-plane parameter를 만드는 단계입니다.
PaddleOCR/Docling 계열을 LLM과 같은 Stage7 script에 억지로 넣지 않는 것을 권합니다.
예를 들어:
Stage7-LLM
├ precision
├ TP
├ context
├ concurrency
├ prefix
└ KV
Stage7-Document
├ image resolution
├ pages/document
├ batch size
├ GPU concurrency
├ pages/sec
├ document latency
├ HBM
└ CPU preprocessing
으로 분리합니다.
Document pipeline에서는 GPU보다:
PDF decode
↓
CPU preprocessing
↓
image transfer
↓
GPU inference
↓
postprocessing
중 CPU preprocessing이 병목일 수도 있기 때문입니다.
제가 현재 환경에서 실행한다면 다음 순서로 합니다.
Stage6 Gate
│
▼
┌────────────────────┐
│ Stage7-0 │
│ Model Inventory │
│ revision/image 고정│
└─────────┬──────────┘
▼
┌────────────────────┐
│ Stage7-1 │
│ Functional │
│ Qualification │
└─────────┬──────────┘
▼
┌────────────────────┐
│ Stage7-2 │
│ Precision Search │
│ BF16/FP8/FP4 │
└─────────┬──────────┘
▼
┌────────────────────┐
│ Stage7-3 │
│ TP Search │
│ 1 → 2 → 4 → 8 │
└─────────┬──────────┘
▼
┌────────────────────┐
│ Stage7-4 │
│ Memory / Runtime │
│ Parameter Search │
└─────────┬──────────┘
▼
┌────────────────────┐
│ Stage7-5 │
│ Saturation Search │
│ production C 찾기 │
└─────────┬──────────┘
▼
┌────────────────────┐
│ Stage7-6 │
│ Real Workload Mix │
└─────────┬──────────┘
▼
┌────────────────────┐
│ Stage7-7 │
│ Prefix Cache │
└─────────┬──────────┘
▼
┌────────────────────┐
│ Stage7-8 │
│ KV Tier(optional) │
└─────────┬──────────┘
▼
┌────────────────────┐
│ Stage7-9 │
│ Soak │
└─────────┬──────────┘
▼
Production Profile
핵심은 앞 단계에서 후보를 줄이고 다음 단계로 넘기는 것입니다. 예를 들어 precision에서 BF16보다 FP8이 품질 기준을 만족하면서 명확히 우수하면 이후 TP/concurrency search는 FP8 중심으로 진행해서 시험량을 줄입니다.
현재 상황에서는 Stage6 완료와 별개로 Stage7용으로 ① 실제 사용할 모델의 정확한 repo/revision, ② 각 모델의 실제 workload 특성(input/output/context 또는 document 특성), ③ 서비스별 TTFT/ITL 또는 처리시간 SLO, ④ 품질 acceptance 기준, ⑤ 예상 동시 사용자/트래픽을 먼저 정의하는 게 중요합니다.
특히 SLO가 없으면 Stage7 saturation 결과에서 C384와 C768 중 무엇을 production concurrency로 선택해야 하는지 객관적으로 결정할 수 없습니다.
그리고 현재 8×B300 한 노드라는 조건에서는 Stage7 결과를 단순히 “모델 X의 최고 TPS”로 정리하기보다 TPS/GPU + SLO-compliant concurrency + 필요한 GPU 수 + 가능한 replica 수까지 같이 계산하는 것이 이후 주간/야간 모델 배치 설계에 훨씬 직접적으로 사용할 수 있습니다.