안녕하세요. 현재 Mobilint NPU에서 LLM serving scheduler를 구현하면서 KV cache preemption을 실험하고 있습니다.
현재 qbruntime 1.3.2 기준으로 dump_cache_memory / load_cache_memory는 동기식 API만 확인되는데, 몇 가지 확인하고 싶습니다.
LLM KV cache의 dump/load를 asynchronous 또는 non-blocking하게 수행할 수 있는 API가 따로 존재하나요?
공개 API에는 없더라도 KV cache의 host/device transfer와 NPU inference를 동시에 진행할 수 있는 방법이 있나요?
예를 들어 한 request를 NPU에서 inference하는 동안 다른 request의 KV cache를 dump/load하여 transfer latency를 overlap시키는 것이 runtime 구조상 가능한가요?
이를 지원한다면 stream, event, future, DMA queue 등 어떤 synchronization/async mechanism을 사용해야 하나요?
현재 infer_async는 LLM에서는 지원되지 않는 것으로 확인했는데, LLM inference와 KV transfer overlap도 같은 제약 때문에 불가능한 것인지 궁금합니다.
현재 SDK에서는 지원되지 않지만 향후 runtime에서 async KV dump/load 또는 compute-transfer overlap 지원 계획이 있는지도 궁금합니다.
현재 저희 환경에서는 KV snapshot 약 64 MiB 기준으로 dump가 약 30~60 ms, load가 약 16~18 ms 정도 소요되어, preemption이 반복되면 synchronous KV transfer overhead가 전체 serving 성능에 크게 영향을 주고 있습니다.
따라서 현재 Mobilint NPU에서 이러한 KV transfer latency를 inference 뒤에 숨길 수 있는 공식적인 방법이 있는지 확인 부탁드립니다.
현재 qbruntime은 LLM KV-Cache의 load/dump 및 infer 함수에 대한 Async/Non-blocking API를 지원하지 않습니다. 일반 LLM 모델은 하나의 모델당 하나의 KV-Cache 세션만 사용하는 구조라, 동시 연산을 위해 고안된 Async API의 목적과 맞지 않기 때문입니다.
2. Batch Inference로 유사 기능 지원
다만, qbruntime은 모델 하나에 여러 개의 KV-Cache 세션을 두고, 여러 Request를 하나의 Batch로 묶어 동시에 처리하는 LLM batch inference이 가능한 모델들을 지원하고 있습니다. Batch inference 기능을 통해 동시에 여러 Request를 처리할 때의 dump/load로 인한 KV transfer를 뒤에 숨길 수 있을 것으로 예상됩니다.
해당 모델의 특징들은 다음과 같습니다.
컴파일 타임에 정해진 최대 batch_size만큼 KV-Cache 세션을 가지고 있습니다.
각 KV-Cache 세션은 독립적으로 dump/load 가능합니다.
여러 Request를 하나의 Batch로 묶어 한번에 inference를 요청 가능합니다.
따라서 애플리케이션 레벨에서 여러 Request를 동시 처리하면서, 사용 중이지 않은 세션의 캐시를 갱신하는 것이 가능합니다.
Batch Inference 지원 모델의 경우 qbcompiler를 통한 컴파일을 지원하며, Hugging Face에서 사전에 컴파일된 모델도 제공하고 있습니다.
qbcompiler의 LlmConfig에서 batch_size를 1보다 큰 값으로 설정
또는 Mobilint Hugging Face에 모델명 뒤 Batch16이 붙은 배포 모델 사용
저희가 Preemption 기반 스케줄링을 구현하고 있어 추가로 여쭤보고 싶습니다. 질문 3-6번에 나온 것처럼, Batch 세션을 쓸 때 Session A 연산과 Session B의 KV Transfer가 실제로 H/W 레벨에서 Overlap되어 실행되는지, 그리고 향후 Async KV API 지원 로드맵이 있으신지 궁금합니다!