검증 및 제한 사항¶
개요¶
이 페이지는 MiniMax-M2.7 레퍼런스 디자인의 검증 범위와 결과 재현 방법을 정리합니다. 검증 기록은 두 가지입니다.
- Target Configuration 검증. 4노드, NPU 32개 스택을 소프트웨어 스택과 버전의 버전으로 배포했습니다. P/D 배치 3가지(4P4D, 5P3D, 3P5D)에서 동시성을 바꿔 가며 검증 워크로드를 실행했습니다.
- 기능 및 정확도 검증. 인스턴스당 NPU 4개로 서빙 구성 4가지를 배포했습니다. 각 구성에 기능을 조합한 모든 조건에서 배포 시작, 응답 생성, 결정성, 캐시 재사용, 정확도를 확인했고, lm-evaluation-harness의 gsm8k와 mmlu_pro로 절대 정확도를 측정했습니다. 버전은 사용 버전에 있습니다.
Validated 배지의 근거는 항목에 따라 다릅니다. 노드 수나 P/D 배치에 따라 달라지는 항목은 Target Configuration 검증만 근거로 합니다. 인스턴스 하나 안에서 결정되는 항목은 두 기록 중 어느 쪽이든 근거가 됩니다.
Target Configuration 검증¶
Validated(2026-10-13).
환경¶
| 항목 | 값 |
|---|---|
| 하드웨어 | RebelServer™ 노드 4개, RBLN-CR13 카드 32개 |
| 소프트웨어 | 소프트웨어 스택과 버전의 버전, RBLN Driver 3.5.1 및 Kubernetes 1.36.4 |
| GatewayClass provider | Istio 1.30.0 |
| 워크로드 | ISL 51,200 토큰, OSL 1,024 토큰. 각 프롬프트의 80%(40,960 토큰)가 모든 요청에서 공유하는 prefix |
검증에 사용한 서빙 설정¶
| 항목 | 값 |
|---|---|
| P/D 배치 | 4P4D, 5P3D, 3P5D |
| Prefill | PP4, --max-num-seqs 4 |
| Decode | expert parallel을 적용한 DP4. 동시성 1~16에서는 --max-num-seqs 1, 동시성 32, 64, 128에서는 각각 2, 4, 8 |
| KV 캐시 | --block-size 4096, --max-model-len 204800, --max-num-batched-tokens 512, --kv-cache-dtype fp8 |
| Prefix caching | sub-block prefix caching(VLLM_RBLN_SUB_BLOCK_CACHE=1, default on)을 적용한 Automatic Prefix Caching(APC) |
| Speculative decoding | 세 배치 모두 EAGLE-3(num_speculative_tokens: 3). 4P4D에서는 동시성 1~64에서 suffix decoding, 동시성 1~32에서 n-gram(num_speculative_tokens: 3, prompt_lookup_max: 5, prompt_lookup_min: 2)도 사용 |
| KV 전송 | LMCache 없이 NIXL만 사용(RblnNixlConnector) |
| 라우팅 | 에이전트 워크로드에는 prefix 캐시를 고려하는 라우팅 사용. 이때 라우터 설정은 서빙 설정 › 라우터의 표준 설정과 달리 prefix-cache-scorer 3.0, kv-cache-utilization-scorer 2.0, queue-scorer 2.0, lruCapacityPerServer 8400(직접 지정). P/D 배치 비교에서는 각 배치가 균등한 부하를 받도록 인스턴스 간 라운드 로빈 적용 |
| 동시성 | 1, 2, 4, 8, 16, 32, 64, 128. 측정 지점별 요청 수는 10 × 동시성 |
같은 세 배치에서 수행한 두 번째 실행은 prefix caching과 speculative decoding을 끄고 동시성 1~64를 다뤘습니다. 이 결과는 하드웨어 › P:D 비율의 prefix caching 미사용 시 배치 지침의 근거입니다.
4P4D 배치에서는 에이전트 워크로드도 실행했습니다. 입력이 가장 긴 SWE-bench Lite 문제 64개를 대상으로 mini-swe-agent 64개를 동시에 실행하고 prefix 캐시를 고려한 라우팅을 사용했습니다. 각 문제를 처리하면서 여러 턴에 걸쳐 도구 호출과 응답이 오갔으므로 이 실행을 통해 서빙 설정의 도구 호출 및 reasoning 인자를 검증했습니다.
확인 항목¶
세 배치의 모든 측정 지점에서 다음 확인 항목을 통과했습니다.
| 확인 항목 | 통과 조건 |
|---|---|
| 배포 시작 | 모든 prefill 및 decode 인스턴스가 Ready 상태가 됨 |
| 요청 완료 | 해당 측정 지점의 모든 요청이 완료됨 |
| Prefix 재사용 | prefix 캐시 hit 비율이 워크로드에서 가능한 상한에 도달함. EAGLE-3에서는 draft head가 마지막 캐시 블록을 버리므로 상한은 공유 prefix보다 한 블록 작음 |
| 스케줄링 | 선점되는 요청이 없음 |
| 부하 분산 | 라운드 로빈 라우팅에서 인스턴스별 요청 수 차이가 최대 1개 |
| Speculative decoding | 배치와 동시성에 관계없이 EAGLE-3 채택률이 같은 범위(46%~50%)를 유지함 |
이 실행에서 사용하지 않은 표준 설정의 Unverified 항목은 Rebel100™ 기반 Coding Assistant › 검증 범위와 제한 사항에 정리되어 있습니다.
기능 및 정확도 검증¶
이 절의 결과는 인스턴스당 NPU 4개와 다음 표의 버전으로 얻었습니다. pdd-pp4-dp4ep-throughput은 Target Configuration과 병렬화가 같습니다.
사용 버전¶
기능 및 정확도 검증은 다음 조합에서 실행했습니다. 이 절의 모든 수치는 이 조합을 기준으로 합니다.
| 구성 요소 | 버전 |
|---|---|
| rbln-serve 이미지 | 0.12.0-ubi10.2-py3.12 |
| RBLN Driver | 3.5.1 |
| RBLN Compiler | 0.12.0 |
| torch | 2.11.0+cpu |
| torch-rbln | 0.12.0 |
| optimum-rbln | 0.12.0 |
| lmcache | 0.5.4 |
| lmcache-rbln | 0.12.0 |
| nixl | 1.1.0+cpu |
| nixl-rbln | 0.12.0 |
| vllm | 0.30.0+cpu |
| vllm-rbln | 0.12.0 |
서빙 구성¶
| 이름 | 토폴로지 | Prefill | Decode | NPU |
|---|---|---|---|---|
| agg-dp4ep-latency | AGG | - | DP4 + EP, --max-num-seqs 1 | 4 |
| agg-pp4-throughput | AGG | - | PP4, EP 비활성화, --max-num-seqs 4 | 4 |
| pdd-dp4ep-latency | P/D 분리 | DP4 + EP, --max-num-seqs 1 | DP4 + EP, --max-num-seqs 1 | 4 + 4 |
| pdd-pp4-dp4ep-throughput | P/D 분리 | PP4, EP 비활성화, --max-num-seqs 4 | DP4 + EP, --max-num-seqs 4 | 4 + 4 |
--kv-cache-dtype=fp8, --max-model-len=204800, --block-size=4096
기능¶
각 검증 축은 Prefix Caching, KV 캐시 오프로딩, Speculative Decoding에 설명되어 있습니다.
| 검증 축 | 모드 | 설명 |
|---|---|---|
prefix_caching | off | APC 비활성화 |
prefix_caching | on | --block-size 단위 APC |
prefix_caching | on_sub_block | prefill 청크(--max-num-batched-tokens 512)의 sub-block 단위 Prefix caching |
lmcache | off | KV 오프로딩 비활성화 |
lmcache | cpu | 호스트 메모리 계층 |
lmcache | rds | Rebellions Direct Storage(RDS): NPU vmem에서 NVMe로 직접 전송 |
spec_decode | off | Speculative decoding 비활성화 |
spec_decode | ngram | 프롬프트 조회 기반 drafting |
spec_decode | suffix | 요청과 캐시를 대상으로 하는 suffix tree drafting |
spec_decode | eagle3 | 별도 draft head |
pd_chunk | off | P/D KV 전송에서 마지막 블록을 한 번에 전송 |
pd_chunk | on | chunk_mode로 마지막 블록을 청크로 나누어 전송(P/D 분리 구성만) |
sampler | greedy | temperature 0.0 |
sampler | random | temperature 1.0, top_p 0.95, top_k 40 |
sampler | penalties | presence, frequency, repetition penalty 적용 |
| structured output | off | 문법 없음 |
| structured output | JSON schema | 요청에 스키마 첨부 |
| structured output | regex, choice, grammar | 요청에 정규식, 선택지, 문법 첨부 |
| tool calling | off | 도구 없음 |
| tool calling | named | 요청이 호출할 도구를 지정 |
| tool calling | auto | 모델이 호출 여부를 결정 |
| tool calling | multi_turn | 도구 결과를 대화에 넣고 최종 응답을 요청 |
정확도¶
| 태스크 | 행 수 | 점수 | 표준 오차 |
|---|---|---|---|
| gsm8k | 1,319(전체) | 0.9530(1,257/1,319) | 0.0058 |
| mmlu_pro | 280(하위 태스크 14개 × 20) | 0.7429(208/280) | 0.026 |
검증 항목¶
앞의 서빙 구성과 기능을 조합한 모든 조건에서 다음 항목을 확인했습니다.
| 확인 항목 | 통과 조건 |
|---|---|
| 배포 시작 | 롤아웃이 완료되고 /health가 응답함 |
| 응답 생성 | 길이와 성격이 다른 프롬프트 5개에서 토큰이 생성됨 |
| 결정성 | 같은 요청을 두 번 보내면 일치하는 token id를 반환함 |
| 캐시 재사용 | 활성화한 캐시 축의 재사용 카운터가 0이 아님 |
| 절대 정확도 | 모든 축을 끈 조건에서 GSM8K 5-shot 점수가 0.9 이상 |
| 기능 적용 후 정확도 | 같은 서빙 구성에서 모든 축을 끈 조건의 점수와 차이가 0.1 이내 |
| 문법 준수 | JSON schema, 정규식, 선택지, 문법을 포함한 요청의 응답이 해당 제약을 만족함 |
| 도구 호출 | named, auto 요청의 응답이 요청한 도구와 인자 형식에 맞는 tool call을 포함하고, multi_turn 요청의 최종 응답이 도구 결과를 반영함 |
| 샘플링 경로 | temperature 1.0 요청이 GSM8K 하한인 0.5를 초과함 |
| 벤치마크 정확도 | lm-evaluation-harness로 gsm8k와 mmlu_pro 절대 점수를 기록함 |
재현 방법¶
다음 구성은 pdd-pp4-dp4ep-throughput에 prefix_caching on_sub_block, lmcache rds, spec_decode eagle3를 적용한 것으로, MiniMax-M2.7 레시피가 권장하는 조합입니다. prefill과 decode는 각각 RBLN-CR13 카드 4개에서 실행됩니다.
표준 설정이 아닌 레시피 구성
다음 명령은 MiniMax-M2.7 레시피의 명령이며, 2026-10-07에 vllm-rbln 0.12.0과 RBLN Driver 3.5.1로 검증했습니다. decode --max-num-seqs는 서빙 설정의 표준 설정과 다릅니다. 이 명령은 4를, 표준 설정은 1을 사용합니다. <POD_IP>는 서버를 실행하는 Pod의 IP 주소로, <EPP_HOST>는 KV 캐시 이벤트를 받는 llm-d 라우터의 Endpoint Picker(EPP) 호스트로 바꾸세요.
Prefill¶
--gpu-memory-utilization 0.8은 RDS가 KV 캐시 밖에서 사용할 NPU 디바이스 메모리를 남겨 둡니다. RDS가 이 영역에 할당하는 항목은 KV 캐시 오프로딩을 참고하세요.
Decode¶
decode는 DP rank 4개를 각각 별도 프로세스로 실행합니다. 다음 명령은 rank 0용입니다. rank마다 달라지는 값은 명령 뒤의 표에 있습니다.
--data-parallel-rank | RBLN_VISIBLE_DEVICES | VLLM_NIXL_SIDE_CHANNEL_PORT | --port | --kv-events-config endpoint | --kv-events-config topic |
|---|---|---|---|---|---|
0 | 0 | 5659 | 8200 | tcp://<EPP_HOST>:5557 | kv@<POD_IP>:8200@MiniMaxAI/MiniMax-M2.7 |
1 | 1 | 5660 | 8201 | tcp://<EPP_HOST>:5556 | kv@<POD_IP>:8201@MiniMaxAI/MiniMax-M2.7 |
2 | 2 | 5661 | 8202 | tcp://<EPP_HOST>:5555 | kv@<POD_IP>:8202@MiniMaxAI/MiniMax-M2.7 |
3 | 3 | 5662 | 8203 | tcp://<EPP_HOST>:5554 | kv@<POD_IP>:8203@MiniMaxAI/MiniMax-M2.7 |
lm-eval¶
GATEWAY를 배포한 스택 앞단의 OpenAI 호환 엔드포인트로, OUT을 결과 저장 디렉터리로 설정한 뒤 두 태스크를 순서대로 실행합니다. 셸이 변수를 확장하도록 --model_args 값은 큰따옴표로 감쌉니다.
harness는 lm-eval[api]==0.4.12입니다. seed가 포함된 요청은 RBLN vLLM의 CPU generator offset을 되돌려 엔진을 멈추게 하므로 seed=None을 명시합니다. 0.4.12는 문자열 none을 null로 변환하므로 기본값 1234를 제거합니다.
이 명령은 generate_until 태스크만 실행할 수 있습니다. loglikelihood 태스크(예: 객관식 태스크)는 프롬프트 토큰의 logprob이 필요하지만 chat completions API는 이 값을 반환하지 않습니다. RBLN vLLM의 prompt_logprobs 지원은 검증하지 않았습니다.
제한 사항¶
EAGLE-3는 MiniMax-M2.7용 draft head인 asherszhang/MiniMax-M2.7-EAGLE3-draft-vocab200k에서만 검증했습니다.
관련 문서¶
- Rebel100™ 기반 Coding Assistant › 검증 방법 - 검증 워크로드와 설계 벤치마크 방법
- 서빙 설정 - 표준 설정
- Kubernetes 배포 - 정확도 측정 명령이 호출하는 엔드포인트를 제공하는 스택 배포