분리형 프리필
분리형 프리필 (Disaggregated Prefilling, 실험적)
LLM 추론은 크게 프리필(prefill) 과 디코드(decode) 두 단계로 나뉘어요. 분리형 프리필(Disaggregated Prefilling) 은 이 두 단계를 서로 다른 vLLM 인스턴스에서 실행하는 실험적 기능입니다.
📌 참고: 이 기능은 실험적(experimental) 이며 변경될 수 있어요.
왜 분리형 프리필일까요? (Why disaggregated prefilling?)
주된 두 가지 이유가 있어요.
1. 꼬리단(tail) ITL 제어
분리형 프리필이 없으면, vLLM은 어떤 요청을 디코딩하는 중간에 다른 요청의 프리필 작업을 끼워 넣을 수 있어요. 그 결과 꼬리 지연 시간(tail latency) 이 높아지죠. 분리형 프리필은 이 문제를 해결하고 꼬리 ITL(inter-token-latency, 토큰 사이 지연)을 제어할 수 있게 해줍니다.
청크드 프리필(chunked prefill)도 적절한 청크 크기로 같은 목표를 달성할 수 있지만, 실제로는 올바른 청크 크기를 잡기가 어려워요. 그래서 분리형 프리필이 꼬리 ITL을 제어하는 훨씬 신뢰할 수 있는 방법이라고 할 수 있죠.
2. TTFT와 ITL을 각각 튜닝
분리형 프리필은 LLM 추론의 프리필과 디코드 단계를 서로 다른 vLLM 인스턴스에 배치합니다. 이렇게 하면 각 단계에 서로 다른 병렬 전략(tp, pp 등)을 지정해서, TTFT(time-to-first-token)를 튜닝할 때 ITL에 영향을 주지 않고, 반대로 ITL을 튜닝할 때 TTFT에 영향을 주지 않게 할 수 있어요.
📌 참고: 분리형 프리필은 처리량(throughput)을 개선하지 않아요. 목적은 지연 시간 제어이지, 처리량 향상이 아니라는 점을 기억하세요.
사용 예시 (Usage example)
사용 예시는 examples/online_serving/disaggregated_prefill.sh를 참고하세요.
지원되는 커넥터 6종
분리형 프리필에서는 KV 캐시를 옮기는 커넥터(connector) 가 중요한 역할을 해요. 현재 6가지 커넥터 타입을 지원합니다.
| 커넥터 | 설명 / 예시 |
|---|---|
MultiConnector |
kv_connector_extra_config를 활용해 여러 커넥터를 순서 있는 kwargs 목록에 담아 한꺼번에 사용해요. |
MooncakeConnector |
examples/online_serving/disaggregated_serving/mooncake_connector/run_mooncake_connector.sh 예시 |
P2pNcclConnector |
examples/online_serving/disaggregated_serving_p2p_nccl_xpyd/disagg_example_p2p_nccl_xpyd.sh 예시 |
NixlConnector |
완전 비동기 send/recv를 지원. tests/v1/kv_connector/nixl_integration/run_accuracy_test.sh 예시 |
LMCacheConnectorV1 |
NIXL을 기반 KV 전송으로 사용. examples/others/lmcache/disagg_prefill_lmcache_v1/disagg_example_nixl.sh 예시 |
ExampleConnector |
examples/offline_inference/disaggregated-prefill-v1/run.sh 예시 |
여러 커넥터를 조합할 때는 MultiConnector를 쓰면 돼요. 예를 들면 다음과 같습니다.
--kv-transfer-config '{"kv_connector":"MultiConnector","kv_role":"kv_both","kv_connector_extra_config":{"connectors":[{"kv_connector":"NixlConnector","kv_role":"kv_both"},{"kv_connector":"ExampleConnector","kv_role":"kv_both","kv_connector_extra_config":{"shared_storage_path":"local_storage"}}]}}'
NixlConnector에서는 하나 이상의 NIXL 백엔드(NIXL_Backend)도 지정할 수 있어요.
--kv-transfer-co...