콘텐츠로 이동

검증 및 제한 사항

개요

이 페이지는 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 캐시 오프로딩을 참고하세요.

LMCACHE_CHUNK_SIZE=4096 \
LMCACHE_ENABLE_KV_EVENTS=True \
LMCACHE_EXTRA_CONFIG='{
  "storage_plugin.RDSBackend.module_path": "lmcache_rbln.storage_plugin.rds_backend",
  "storage_plugin.RDSBackend.class_name": "RDSBackend"
}' \
LMCACHE_LOCAL_CPU=False \
LMCACHE_MAX_LOCAL_CPU_SIZE=0 \
LMCACHE_PRE_CACHING_HASH_ALGORITHM=sha256_cbor_64bit \
LMCACHE_STORAGE_PLUGINS=RDSBackend \
PYTHONHASHSEED=42 \
VLLM_ENGINE_READY_TIMEOUT_S=9600 \
VLLM_NIXL_SIDE_CHANNEL_HOST='<POD_IP>' \
VLLM_NIXL_SIDE_CHANNEL_PORT=5559 \
vllm serve MiniMaxAI/MiniMax-M2.7 \
    --block-size 4096 \
    --enable-auto-tool-choice \
    --gpu-memory-utilization 0.8 \
    --kv-cache-dtype fp8 \
    --kv-events-config '{
      "enable_kv_cache_events": true,
      "publisher": "zmq",
      "endpoint": "tcp://<EPP_HOST>:5557",
      "topic": "kv@<POD_IP>:8000@MiniMaxAI/MiniMax-M2.7"
    }' \
    --kv-transfer-config '{
      "kv_connector": "MultiConnector",
      "kv_role": "kv_both",
      "kv_connector_extra_config": {
        "connectors": [
          {
            "kv_connector": "RblnNixlConnector",
            "kv_role": "kv_both",
            "kv_buffer_device": "rbln",
            "kv_connector_extra_config": {
              "name": "nixl"
            }
          },
          {
            "kv_connector": "RBLNLMCacheConnectorV1",
            "kv_connector_module_path": "lmcache_rbln.integration.vllm.connector",
            "kv_role": "kv_both",
            "kv_connector_extra_config": {
              "name": "lmcache"
            }
          }
        ]
      }
    }' \
    --max-model-len 204800 \
    --max-num-batched-tokens 512 \
    --max-num-seqs 4 \
    --model-impl vllm \
    --pipeline-parallel-size 4 \
    --port 8000 \
    --prefix-caching-hash-algo sha256_cbor \
    --reasoning-parser minimax_m2 \
    --safetensors-load-strategy prefetch \
    --speculative-config '{
      "method": "eagle3",
      "model": "asherszhang/MiniMax-M2.7-EAGLE3-draft-vocab200k",
      "num_speculative_tokens": 3
    }' \
    --tool-call-parser minimax_m2 \
    --trust-remote-code

Decode

decode는 DP rank 4개를 각각 별도 프로세스로 실행합니다. 다음 명령은 rank 0용입니다. rank마다 달라지는 값은 명령 뒤의 표에 있습니다.

RBLN_VISIBLE_DEVICES=0 \
VLLM_ENGINE_READY_TIMEOUT_S=9600 \
VLLM_NIXL_SIDE_CHANNEL_HOST='<POD_IP>' \
VLLM_NIXL_SIDE_CHANNEL_PORT=5659 \
vllm serve MiniMaxAI/MiniMax-M2.7 \
    --block-size 4096 \
    --data-parallel-address '<POD_IP>' \
    --data-parallel-rank 0 \
    --data-parallel-rpc-port 5555 \
    --data-parallel-size 4 \
    --enable-auto-tool-choice \
    --enable-expert-parallel \
    --kv-cache-dtype fp8 \
    --kv-events-config '{
      "enable_kv_cache_events": true,
      "publisher": "zmq",
      "endpoint": "tcp://<EPP_HOST>:5557",
      "topic": "kv@<POD_IP>:8200@MiniMaxAI/MiniMax-M2.7"
    }' \
    --kv-transfer-config '{
      "kv_connector": "RblnNixlConnector",
      "kv_role": "kv_both",
      "kv_buffer_device": "rbln",
      "kv_connector_extra_config": {
        "name": "nixl"
      }
    }' \
    --max-model-len 204800 \
    --max-num-batched-tokens 512 \
    --max-num-seqs 4 \
    --model-impl vllm \
    --port 8200 \
    --prefix-caching-hash-algo sha256_cbor \
    --reasoning-parser minimax_m2 \
    --safetensors-load-strategy prefetch \
    --speculative-config '{
      "method": "eagle3",
      "model": "asherszhang/MiniMax-M2.7-EAGLE3-draft-vocab200k",
      "num_speculative_tokens": 3
    }' \
    --tool-call-parser minimax_m2 \
    --trust-remote-code
--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 값은 큰따옴표로 감쌉니다.

export GATEWAY=http://<gateway>:80
export OUT=<output-dir>
1
2
3
4
5
6
python -m lm_eval --model local-chat-completions \
  --model_args "base_url=${GATEWAY}/v1/chat/completions,model=MiniMaxAI/MiniMax-M2.7,num_concurrent=16,timeout=6000" \
  --tasks gsm8k \
  --apply_chat_template --fewshot_as_multiturn true \
  --gen_kwargs max_gen_toks=65536,seed=None,temperature=1.0,top_p=0.95 \
  --output_path "${OUT}"
1
2
3
4
5
6
python -m lm_eval --model local-chat-completions \
  --model_args "base_url=${GATEWAY}/v1/chat/completions,model=MiniMaxAI/MiniMax-M2.7,num_concurrent=16,timeout=6000" \
  --tasks mmlu_pro --limit 20 \
  --apply_chat_template --fewshot_as_multiturn true \
  --gen_kwargs max_gen_toks=65536,seed=None,temperature=1.0,top_p=0.95 \
  --output_path "${OUT}"

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에서만 검증했습니다.