콘텐츠로 이동

서빙 설정

개요

이 페이지는 서빙 인자의 표준 설정과 각 값을 선택한 이유를 설명합니다. 각 설정값을 변경했을 때 서빙 동작이 어떻게 달라지는지도 다룹니다.

이 페이지의 상태 배지는 레퍼런스 디자인 › 상태 배지를 따릅니다. 배지가 없는 설명은 Validated 상태가 아닙니다.

전체 설정은 지연 시간 우선 원칙을 따릅니다. 전체 처리량을 높이는 배치 크기보다 요청별 지연 시간을 우선합니다.

인자 이름은 vllm serve CLI를 따릅니다. 엔진 인자 형식의 이름과 RBLN에서 적용되는 제약은 설정 가이드에서 확인할 수 있습니다.

표준 설정

모델은 MiniMaxAI/MiniMax-M2.7입니다.

공통 인자

상태 열은 Target Configuration 검증에서 각 값을 사용했는지 나타냅니다.

인자 값 상태
--block-size 4096 Validated(--block-size 4096 참고)
--max-model-len 204800 Validated
--max-num-batched-tokens 512 Validated
--kv-cache-dtype fp8 Validated
VLLM_RBLN_SUB_BLOCK_CACHE 1 Validated
--enable-prefix-caching 사용 Validated
--enable-chunked-prefill 사용 Validated
--tool-call-parser minimax_m2 Validated
--reasoning-parser minimax_m2 Validated
--enable-auto-tool-choice 사용 Validated

도구 호출 및 reasoning 관련 인자 3개는 검증 및 제한 사항의 에이전트 워크로드에서 사용했습니다. 이 워크로드에서는 mini-swe-agent가 여러 턴에 걸쳐 도구를 호출합니다.

P/D role별 인자

인자 Prefill Decode 상태
병렬화 PP4(DP1, TP1) DP4(PP1, TP1) Validated
Expert parallel 비활성화 활성화 Validated
--max-num-seqs 4 1 Validated(동시성 16 초과에서는 decode를 2, 4, 8로도 실행)
--gpu-memory-utilization 0.8 설정하지 않음(엔진 기본값) Validated
KV connector LMCache(RDS) + NIXL NIXL만 사용 LMCache는 Default configuration(기능 및 정확도 검증. Target Configuration 검증에서는 prefill과 decode 모두 NIXL만 사용)
Speculative decoding 사용(EAGLE-3) 사용(EAGLE-3) Speculative decoding 참고

LMCache 환경 변수(prefill 전용)

Default configuration: 기능 및 정확도 검증에서 동작을 확인했지만 효과는 측정하지 않았습니다. 설정 파일 없이 환경 변수만으로 구성하며 차트 기본값에서는 modelserver.extraServeEnv.prefill에 지정합니다.

환경 변수 값
LMCACHE_CHUNK_SIZE 4096(기본값은 --block-size와 같습니다. --block-size를 나누는 값이면 됩니다)
LMCACHE_LOCAL_CPU false
LMCACHE_MAX_LOCAL_CPU_SIZE 0
LMCACHE_ENABLE_KV_EVENTS true
LMCACHE_PRE_CACHING_HASH_ALGORITHM sha256_cbor_64bit
LMCACHE_STORAGE_PLUGINS RDSBackend
LMCACHE_EXTRA_CONFIG RDSBackend 모듈 경로와 클래스 이름. rds_max_chunks도 여기에 지정합니다

RDS 용량은 디스크 크기가 아닌 rank당 청크 수로 지정합니다. 각 rank(엔진 프로세스)는 RDS에 바인딩한 디바이스에 최대 rds_max_chunks개의 청크를 보관합니다(기본값 1000, LMCACHE_EXTRA_CONFIG에 rds_max_chunks를 추가해 설정). 새 청크를 저장하기 전에 가장 오래 사용하지 않은 청크를 제거합니다. 기본값과 LMCACHE_CHUNK_SIZE 4096을 사용하면 rank당 RDS에 최대 4,096,000 토큰(rds_max_chunks × LMCACHE_CHUNK_SIZE)을 보관합니다. 저장한 청크 하나는 NVMe 드라이브마다 칩렛 0 메모리 2 MiB를 사용합니다. 따라서 rds_max_chunks × 2 MiB × 드라이브 수에 staging 버퍼를 더한 값이 --gpu-memory-utilization이 남긴 칩렛 0 메모리 안에 들어가야 합니다. 두 값은 함께 변경하세요. lmcache-rbln 0.12.0 미만은 rds_max_chunks를 읽지 않습니다. 디바이스 요구 사항은 노드 준비 › RDS 설정을 참고하세요.

Speculative decoding(prefill과 decode 모두)

1
2
3
4
5
{
  "method": "eagle3",
  "model": "asherszhang/MiniMax-M2.7-EAGLE3-draft-vocab200k",
  "num_speculative_tokens": 3
}

prefill과 decode에 같은 값을 설정합니다. EAGLE-3의 draft head는 prefill 순전파 중 자체 KV 캐시를 채우므로 prefill에도 --speculative-config가 필요합니다.

라우터(llm-d EPP/GAIE)

표준 설정에서는 다음 플러그인으로 prefix 캐시를 고려한 라우팅을 사용합니다. scorer 가중치는 서빙 차트가 배포하는 업스트림 pd-epp-config를 따릅니다. 이 설정 전체는 Unverified입니다. 라우팅은 여러 Pod 가운데 대상을 고르는 일이므로 prefill과 decode가 하나씩인 기능 및 정확도 검증으로는 확인할 수 없습니다. Target Configuration 검증은 이 설정을 사용하지 않았습니다.

기능 및 정확도 검증의 P/D 배포도 이 표와 같은 플러그인과 가중치를 사용했습니다.

플러그인 / 설정 값
prefix-based-pd-decider nonCachedTokens: 1. 라우터가 추정한 미캐시 토큰이 1개 미만이면 prefill을 건너뛰고 decode로 바로 보냅니다. 0이면 모든 요청을 prefill 없이 decode로 바로 보냅니다
disagg-profile-handler 사용
prefill-filter, decode-filter 사용
approx-prefix-cache-producer maxPrefixTokensToMatch: 204800; blockSizeTokens와 lruCapacityPerServer는 autoTune이 Pod별로 산출(라우터가 참조하는 KV 용량 참고)
prefix-cache-scorer 가중치 2.0
queue-scorer 가중치 1.0
max-score-picker 사용
kv-cache-utilization-scorer, precise-prefix-cache-scorer 사용하지 않음

라우터는 요청을 보낸 Pod를 기록할 뿐 엔진이 실제로 캐시했는지는 확인하지 않습니다. 따라서 같은 프롬프트를 다시 보내면 decider가 prefill을 건너뜁니다. 모든 요청이 prefill을 거쳐야 하는 측정에서는 prefix-based-pd-decider 대신 always-disagg-pd-decider를 사용하세요.

AGG 레시피는 prefill Pod가 없으므로 다른 플러그인을 사용합니다. approx-prefix-cache-producer, inflight-load-producer, prefix-cache-affinity-filter, token-load-scorer를 단일 scheduling profile에 둡니다. prefix-cache-affinity-filter의 peakPrefillThroughput은 이 모델의 AGG 구성에서 측정한 2256(토큰/초)입니다.

병렬화

PP와 DP의 동시 사용 제한

엔트리포인트는 pipeline-parallel-size > 1과 data-parallel-size > 1을 동시에 설정하면 실행을 거부합니다. 이 제약에 따라 P/D role별 구성은 사실상 prefill PP4/DP1, decode DP4/PP1로 결정됩니다.

Prefill: PP4

PP4는 62개 레이어를 4부분으로 나누어 가중치를 카드 4개에 분산합니다. 각 스테이지는 레이어 경계에서 활성값만 교환합니다.

Decode: DP4, expert parallel 활성화

decode는 요청마다 한 번에 토큰 1개를 생성하므로 소수의 expert만 활성화됩니다. DP4와 expert parallel을 결합하여 expert 256개를 카드 4개에 분산합니다. decode에서는 PP를 사용할 수 없으므로 expert parallel을 끄면 모든 카드에 전체 가중치가 필요합니다.

값 변경의 영향

변경 결과
decode에서 expert parallel 비활성화 카드마다 전체 가중치를 로드해야 합니다. 234 GB를 144 GB에 넣을 수 없으므로 인스턴스가 시작되지 않습니다.
PP 병렬도 변경 prefill의 --max-num-seqs도 함께 변경해야 합니다. devices.npu.count는 prefill과 decode가 함께 사용하는 값이며 prefill과 decode 각각의 DP × TP × PP와 같아야 합니다. 따라서 decode의 병렬도도 같은 NPU 수가 되도록 변경해야 하며, 그렇지 않으면 렌더링에 실패합니다. DRA 모드에서는 ResourceClaimTemplate(이하 RCT)이 Pod당 NPU 수를 정합니다. 새 NPU 수의 RCT를 새 이름으로 적용하고 devices.claimTemplateName이 이를 가리키게 하세요. 재컴파일이 필요합니다.
decode의 DP 병렬도 변경 EPP의 targetPorts 목록(decode DP rank당 포트 1개)도 함께 변경해야 합니다. PP 변경과 마찬가지로 prefill의 병렬도, devices.npu.count, RCT도 같은 NPU 수로 맞춰야 합니다. expert parallel이 DP rank에 expert를 분산하므로 재컴파일이 필요합니다.

P/D role별 --max-num-seqs 값

P/D role 값 의미
prefill 4 PP 병렬도에 따라 결정되는 값입니다. PP4의 스테이지 4개를 채워 파이프라인 버블을 줄이며 동시 처리 용량을 뜻하지 않습니다.
decode 1 rank당 배치 크기 1로, 지연 시간 우선 원칙을 반영합니다.

PP 병렬도를 변경하면 prefill의 이 값도 함께 변경해야 합니다. PP2에서 --max-num-seqs 4를 지정하면 스테이지 수보다 많은 시퀀스가 대기하여 지연 시간이 늘어납니다. --pipeline-parallel-size가 2 이상이면 vllm-rbln은 시작할 때 --max-num-seqs가 PP 병렬도 이상인지 검사합니다. 따라서 PP8에는 8 이상을 지정해야 합니다.

decode 값을 1보다 높이면 rank당 배치 크기가 커지고 TPS/user는 낮아집니다. 전체 처리량은 늘어날 수 있지만 이 설계는 사용자별 지연 시간을 우선합니다.

DP 구성에서는 --max-num-batched-tokens(512)가 decode 값으로 나누어떨어져야 합니다. 나누어떨어지지 않으면 엔진이 max_num_batched_tokens must be divisible by max_num_seqs when DP enabled.로 시작을 거부합니다. 1, 2, 4, 8은 사용할 수 있고 3은 사용할 수 없습니다.

KV 캐시

--block-size 4096

Validated.

KV 캐시는 4,096 토큰 단위 블록으로 할당합니다. sub-block prefix caching을 활성화했으므로 prefix 재사용 단위는 이 블록보다 작습니다. 자세한 내용은 512 토큰의 prefix 재사용 단위에서 확인할 수 있습니다.

512 토큰의 prefix 재사용 단위

Default configuration: 기능 및 정확도 검증에서 동작을 확인했지만 sub-block 크기가 성능에 주는 효과는 측정하지 않았습니다.

sub-block prefix caching(VLLM_RBLN_SUB_BLOCK_CACHE=1)을 사용하면 sub-block 크기가 --max-num-batched-tokens 값이 됩니다(차트 기본값처럼 VLLM_RBLN_SUB_BLOCK_SIZE를 지정하지 않은 경우). 따라서 prefix 재사용 단위는 --block-size(4096)가 아닌 512입니다.

라우터가 prefix를 해시하는 단위는 autoTune 값에 따라 달라집니다. 차트와 레시피가 유지하는 기본값 autoTune: true에서는 라우터가 vllm:cache_config_info의 블록 크기와 블록 수로 approx-prefix-cache-producer.blockSizeTokens와 lruCapacityPerServer를 덮어씁니다. vllm-rbln은 sub-block prefix caching을 사용해도 이 메트릭에 --block-size(4096)를 보고합니다. 따라서 라우터는 prefix를 4,096 토큰 단위로 해시합니다. 한 블록보다 짧은 prefix는 엔진이 재사용할 수 있지만 라우터는 추적하지 않습니다. 차트 values의 blockSizeTokens: 512와 lruCapacityPerServer: 1024는 라우터가 Pod의 메트릭을 처음 읽기 전에만 적용하는 기본값입니다. 이후 메트릭을 읽지 못하면 라우터는 마지막으로 읽은 값을 유지합니다. autoTune: false이면 라우터는 지정한 blockSizeTokens를 사용하며 512가 sub-block 단위와 일치합니다. 이때 lruCapacityPerServer는 그 단위의 Pod당 블록 수로 지정해야 합니다. 이 구성은 Unverified입니다.

KV 블록 수

엔진이 시작 시 --gpu-memory-utilization에 맞춰 KV 블록 수를 산출합니다. 시작 시 노드에서 Not enough memory for N blocks of KV cache 또는 SYS_EBUSY: Lack of device memory를 보고할 때만 --gpu-memory-utilization을 낮추세요.

Warning

vLLM은 null 블록 1개를 예약하므로 블록 수는 최소 ceil(--max-model-len / --block-size) + 1이어야 합니다. --max-model-len 204800, --block-size 4096에서는 51개 블록입니다.

라우터가 참조하는 KV 용량

Default configuration: 동작은 확인했지만 효과는 측정하지 않았습니다.

llm-d 라우터의 Endpoint Picker(EPP)는 각 Pod가 보유한 prefix의 인덱스를 유지합니다. approx-prefix-cache-producer의 lruCapacityPerServer는 Pod별 인덱스 항목 수를 blockSizeTokens 단위로 지정합니다. 표준 설정은 두 값을 메트릭을 읽기 전에 쓰는 기본값으로만 지정합니다(blockSizeTokens: 512, lruCapacityPerServer: 1024). 기본적으로 활성화된 autoTune이 각 Pod의 vllm:cache_config_info 메트릭(CacheBlockSize, CacheNumBlocks)를 읽어 두 값을 Pod별로 덮어씁니다. 지정한 값은 라우터가 해당 Pod의 메트릭을 처음 읽기 전에만 적용합니다. 동적 KV를 사용하면 블록 수가 런타임에 결정되므로 메트릭이 기준이 됩니다. 이렇게 산출하므로 prefill과 decode Pod의 HBM 용량이 서로 달라도 각자에 맞는 용량을 적용합니다.

참고로 다음 표는 엔진이 보고한 HBM 용량입니다. Target Configuration의 4P4D에서 decode --max-num-seqs 1을 사용했을 때의 값입니다. 시작 시 동적 KV 크기 조정 후 vllm:cache_config_info의 num_gpu_blocks × --block-size로 구한 값입니다. 엔진이 워밍업 전에 기록하는 KV 캐시 크기는 조정 전 추정치이므로 더 큰 값이 표시됩니다.

Speculative decoding Pod 엔진 엔진당 HBM 용량(토큰) Pod당 HBM 용량(토큰)
EAGLE-3(표준) prefill 1(PP4) 1,212,416 1,212,416
EAGLE-3(표준) decode 4(DP4) 315,392 1,261,568
suffix decoding, n-gram prefill 1(PP4) 1,536,000 1,536,000
suffix decoding, n-gram decode 4(DP4) 356,352 1,425,408

EAGLE-3의 draft head와 자체 KV 캐시가 HBM 일부를 사용하므로 draft 모델을 로드하지 않는 방식보다 용량이 작습니다. decode의 --max-num-seqs를 높이면 decode 그래프가 추가될 때마다 메모리를 예약하여 용량이 더 줄어듭니다. EAGLE-3에서 --max-num-seqs 8을 사용하면 decode 엔진당 282,624 토큰을 보관합니다.

이 메트릭에는 HBM만 포함됩니다. prefill Pod의 RDS 용량(rank당 rds_max_chunks × LMCACHE_CHUNK_SIZE 토큰)은 산출 값에 반영되지 않습니다. LMCache/RDS를 활성화하면 인덱스가 실제 prefill 보유량보다 작아집니다. 라우터가 RDS에 남아 있는 일부 prefix를 놓쳐 hit 비율은 낮아지지만 오류는 발생하지 않습니다. Target Configuration 검증은 LMCache 없이 실행했으므로 이 동작은 Unverified입니다.

--kv-cache-dtype fp8

차트에 포함된 MiniMax-M2.7과 DeepSeek-V3.2 레시피는 KV 캐시에 fp8을 사용하며 이 설계에서도 사용합니다. KV 캐시를 8비트로 저장하고 모델 가중치와 활성값은 W8A16으로 실행하므로 전체 구성은 W8A16KV8입니다. 토큰당 약 124 KiB의 KV 캐시 크기는 이 구성을 기준으로 합니다. 이 인자를 변경하면 Rebel100™ 기반 Coding Assistant › KV 캐시 크기와 라우터가 참조하는 KV 용량을 다시 계산해야 합니다.

Speculative decoding

표준 설정의 기본값은 num_speculative_tokens: 3인 EAGLE-3이며 prefill과 decode 모두에 설정합니다. draft head는 prefill 순전파 중 자체 KV 캐시를 채우므로 prefill에도 --speculative-config가 필요합니다. 실제 speculative decoding은 decode에서 실행합니다.

EAGLE-3를 기본값으로 선택한 이유는 학습된 draft head가 새로운 텍스트에서도 계속 토큰을 제안하기 때문입니다. suffix decoding과 n-gram은 출력이 프롬프트나 이전 응답을 반복하는 구간에서만 제안이 채택됩니다. Coding Assistant 워크로드의 출력에는 두 유형이 섞여 있으므로 학습된 head가 더 넓은 구간을 처리합니다. 실제 워크로드에서 측정하여 선택이 적절한지 확인하는 것을 권장합니다.

MiniMax-M2.7은 MTP 모듈 3개를 정의하지만 공개 체크포인트에 해당 가중치가 없습니다. 따라서 draft-model 방식은 외부에서 학습하고 가중치를 공개한 draft head를 사용해야 합니다. 이 설계의 head는 MiniMax-M2.7용으로 HuggingFace에 공개된 asherszhang/MiniMax-M2.7-EAGLE3-draft-vocab200k입니다.

방식 상태
EAGLE-3 Validated(num_speculative_tokens: 3, hidden state 전송 포함). 표준 설정의 기본값
suffix decoding vLLM 기본값의 {"method":"suffix"}로 Validated(4P4D). 아래 참고 사항이 적용됩니다
n-gram Validated(4P4D)

suffix decoding 파라미터

Target Configuration 검증의 suffix 실행은 vLLM 기본값을 사용했습니다. 이때 num_speculative_tokens는 suffix_decoding_max_tree_depth(24)를 따르므로 vllm-rbln은 폭이 25 토큰인 decode 그래프를 컴파일합니다. {"method":"suffix","num_speculative_tokens":3,"suffix_decoding_max_cached_requests":0}처럼 제한한 설정은 기능 및 정확도 검증에서 정확도를 확인했으므로 Validated입니다. 채택률은 측정하지 않았습니다.

P/D KV 전송의 chunk_mode

Optional. Default configuration: 기능 및 정확도 검증에서 동작을 확인했지만 성능 효과는 측정하지 않았습니다. 기본 동작에서 RblnNixlConnector는 요청의 마지막 블록을 한 번에 전송합니다. chunk_mode를 켜면 마지막 블록을 청크로 나누어 전송합니다. 청크 크기는 기본적으로 prefill 청크(--max-num-batched-tokens)와 같습니다.

RblnNixlConnector의 kv_connector_extra_config에 "chunk_mode": true를 추가하고 prefill과 decode에 같은 값을 지정합니다. decode의 --kv-transfer-config는 다음과 같습니다.

1
2
3
4
5
6
7
8
9
{
  "kv_connector": "RblnNixlConnector",
  "kv_role": "kv_both",
  "kv_buffer_device": "rbln",
  "kv_connector_extra_config": {
    "name": "nixl",
    "chunk_mode": true
  }
}

prefill처럼 MultiConnector를 사용하는 P/D role에서는 connectors 목록의 RblnNixlConnector 항목에만 추가합니다. RBLNLMCacheConnectorV1 항목은 바꾸지 않습니다.

청크 크기는 같은 kv_connector_extra_config의 chunk_tokens(토큰 수)로 바꿀 수 있습니다. 기본값 0은 --max-num-batched-tokens를 사용합니다. --max-num-batched-tokens보다 작은 값을 지정하면 엔진이 시작하지 않습니다. 엔진은 지정한 값 이상이면서 블록을 나누어떨어지게 하는 가장 작은 크기를 사용합니다. 예를 들어 --block-size 4096에서 1500을 지정하면 청크는 2,048 토큰입니다.

사용 조건은 다음과 같습니다.

  • kv_buffer_device가 rbln(D2D)이어야 합니다. cpu(호스트 staging)로 지정하면 엔진이 시작하지 않습니다.
  • KV 캐시 그룹 중 full attention 그룹이 하나여야 합니다. MiniMax-M2.7은 이 조건을 만족합니다.
  • 엔진이 블록을 청크로 나눌 수 없으면 chunk_mode를 켜도 블록을 한 번에 전송합니다. 이때 시작 로그에 chunk_mode registered no chunk range가 기록됩니다.

LMCache와 RDS

Default configuration: 기능 및 정확도 검증에서 동작을 확인했지만 효과는 측정하지 않았습니다. Target Configuration 검증은 LMCache 없이 실행했으며, 그 워크로드의 KV 재사용량은 LMCache와 RDS의 효과를 평가하기에 충분하지 않았습니다. P/D 구성에서는 LMCache를 prefill 인스턴스에만 연결하고, decode는 NIXL만 사용합니다. AGG 레시피는 decode Pod에 연결합니다.

prefill이 프롬프트의 KV를 생성하고 decode가 NIXL을 통해 받으므로 LMCache는 prefill에만 배치합니다. decode에 배치하면 조회가 한 번 더 발생하고 staging 메모리만 추가로 사용합니다.

동작 특성은 다음과 같습니다.

  • 저장은 비동기로 수행하며 write-back은 수행하지 않습니다.
  • LMCACHE_LOCAL_CPU=false이므로 CPU(DRAM) 계층을 사용하지 않습니다.
  • 인스턴스에서 RDS를 사용할 수 없어도 시작에 실패하지 않으며 RDS 없이 Ready 상태가 됩니다. 기능이 저하된 상태로 알림 없이 실행됩니다. 시작 로그에 [entrypoint] ⚠️ no RDS device (/dev/rblnfs*) in this container가 기록됩니다. 시작 후에는 로그에서 이 줄을 찾거나 kubectl -n <ns> exec <pod> -- sh -c 'ls /dev/rblnfs*'를 실행해 RDS 디바이스가 있는지 확인하는 것을 권장합니다.
  • rds_max_chunks에 도달하거나 NVMe가 가득 차면 가장 오래 사용하지 않은 청크를 제거하여 공간을 확보합니다. 공간 부족으로 저장이 실패하지는 않습니다.

CPU 계층

Optional: RDS를 사용할 수 없는 노드에서는 호스트 메모리를 KV 오프로딩 계층으로 사용할 수 있습니다. Default configuration: 기능 및 정확도 검증의 lmcache cpu 모드로 정확도와 캐시 재사용을 확인했지만 효과는 측정하지 않았습니다. KV connector 구성(MultiConnector)은 RDS와 같고, modelserver.extraServeEnv.prefill의 다음 값만 바꿉니다.

환경 변수 값
LMCACHE_LOCAL_CPU true
LMCACHE_MAX_LOCAL_CPU_SIZE CPU 계층에 할당할 용량(GB). 기능 및 정확도 검증에서는 10.0
LMCACHE_CHUNK_SIZE --block-size를 나누는 값. 기능 및 정확도 검증에서는 256
LMCACHE_STORAGE_PLUGINS, LMCACHE_EXTRA_CONFIG null로 지정해 제거

LMCACHE_ENABLE_KV_EVENTS와 LMCACHE_PRE_CACHING_HASH_ALGORITHM은 RDS 구성과 같은 값을 유지합니다. prefill의 --gpu-memory-utilization 0.8은 RDS가 사용할 칩렛 0 메모리를 남기기 위한 값이므로 CPU 계층만 사용할 때는 지정하지 않아도 됩니다. CPU 계층은 prefill Pod의 호스트 메모리를 사용하므로 Pod 메모리 한도 안에 들어가야 합니다.

컴파일 캐시 무효화 시 주의 사항

PP와 DP 병렬도, --max-num-seqs, --kv-cache-dtype, speculative decoding 설정, SDK 버전은 Compile Cache › 캐시 키에 포함됩니다. 설정을 변경하면 컴파일 캐시 PVC를 유지해도 cold 컴파일이 필요할 수 있으므로 변경 전에 시작 및 준비 상태 프로브에서 시작 예산을 확인하세요. 시작 시 Not enough memory for N blocks of KV cache 또는 SYS_EBUSY: Lack of device memory가 발생하면 KV 메모리 부족으로 진단해야 합니다. 이 오류가 PVC를 삭제해야 한다는 근거는 아닙니다(장애 대응 › 증상별 진단 참고).

변경 영향 요약

변경 값 함께 변경해야 하는 항목 재컴파일
PP 병렬도 prefill --max-num-seqs, 같은 NPU 수의 decode 병렬도·devices.npu.count·RCT 필요
DP 병렬도 EPP targetPorts(decode DP rank당 포트 1개), 같은 NPU 수의 prefill 병렬도·devices.npu.count·RCT 필요
--max-num-batched-tokens 엔진의 prefix 재사용 단위(sub-block 크기). 엔진이 --block-size를 보고하므로 autoTune은 이 값을 따르지 않습니다. autoTune을 비활성화한 배포에서만 EPP blockSizeTokens를 함께 변경합니다. DP 구성에서는 decode --max-num-seqs로 나누어떨어져야 합니다 필요
--max-model-len EPP maxPrefixTokensToMatch 필요
--speculative-config(method, num_speculative_tokens) EAGLE-3는 prefill과 decode에서 모두 실행되므로 반대 P/D role의 --speculative-config 필요
--block-size EPP blockSizeTokens와 용량 인덱스. autoTune이 둘 다 다시 산출(라우터가 참조하는 KV 용량 참고). LMCACHE_CHUNK_SIZE는 --block-size를 나누는 값이어야 합니다 필요
--kv-cache-dtype 토큰당 KV 크기. EPP 용량 인덱스는 autoTune을 통해 반영 필요
--gpu-memory-utilization(prefill) LMCACHE_EXTRA_CONFIG의 rds_max_chunks. 저장한 청크 하나가 NVMe 드라이브마다 칩렛 0 메모리 2 MiB를 사용하므로 사용률을 올리면 청크 상한을 낮춰야 합니다 필요