(MLA100 sdk) KV cache 지원 문의

Q1. filter_cache_tail()을 지원하는 precompiled MXQ가 있나요?

현재 공개된 Qwen/Llama 계열 precompiled MXQ 중 filter_cache_tail() API를 지원하는 모델 또는 runtime bundle이 있나요?

지원되지 않는다면, filter_cache_tail()을 사용하기 위해 필요한 모델 구조나 compiler option은 무엇인가요?

Q2. INT8 이외의 KV-cache를 공식적으로 지원하나요?

현재 실험에서는 INT8 KV-cache만 정상적으로 동작하는 것을 확인했습니다.

INT4 또는 INT2와 같은 low-bit KV-cache를 지원하는 모델이나 runtime bundle이 있나요?

지원된다면,

  • 별도의 compiler option이나 model configuration이 필요한지,

  • 실제 KV-cache도 packed INT4/INT2 형식으로 저장되어 메모리 사용량과 memory traffic이 감소하는지 궁금합니다.

Q3. KV-cache write/read 과정에 사용자 정의 처리를 삽입할 수 있나요?

KV-cache write/read 과정에 사용자가 직접 quantize → pack → unpack → dequantize 등의 처리를 삽입할 수 있는 공식적인 방법이 있나요?

예를 들어 compiler interface, custom operator, custom kernel, 또는 StatefulKVCacheWrapper 확장 등을 통해 KV-cache pipeline을 사용자 정의할 수 있는지 궁금합니다.

아니면 KV-cache 동작은 compiler/runtime 내부에 고정되어 있어 사용자가 변경할 수 없는 구조인가요?

Q4. KV-cache binary를 수정한 뒤 다시 주입하는 것이 공식적으로 지원되나요?

dump_cache_memory_to() 또는 dump_cache_memory()로 추출한 KV-cache를 사용자가 수정한 뒤 load_cache_memory_from() 또는 load_cache_memory()를 통해 다시 주입하여 추론을 이어가는 방식이 공식적으로 지원되는 사용 방법인가요?

아니면 해당 API는 cache snapshot 저장 및 복원만을 위한 용도이며, 수정된 cache를 사용하는 것은 지원 대상이 아닌가요?

dangeun님 안녕하세요? 모빌린트 임범수입니다.

Q1. filter_cache_tail()은 KV Cache가 사용되는 모델(LLM, VLM 등)에서 전부 사용 가능하십니다. 구체적으로는, LlmConfig가 세팅되어 컴파일되는 종류의 모델들은 다 사용 가능합니다.

Q2. 현재 릴리즈된 LLM 모델의 경우 대부분 Weight는 4bit, KV cache 중 Value activation은 8bit를 사용한 설정으로 컴파일하여 제공드리고 있습니다. 관련 세팅은 mxq_compile에 전달되는 BitConfig 객체에서 설정 가능하십니다.

bit_config = BitConfig(
    transformer=BitConfig.Transformer(
        weight=BitConfig.Transformer.Weight(
            query=4,
            key=4,
            value=8,
            output=4,
            ffn=4,
            head=8,
        ),
    ),
)

학계에서 사용하는 INT2 양자화의 경우 대부분 메모리 병목을 해소하기 위해 연산 과정에서 Online dequantization을 하는 방식으로 알고 있습니다만, 현재 ARIES, REGULUS에서는 순수 INT 커널만 제공하고 있기 때문에 INT2 양자화는 정확도 측면에서 무리가 있을 것으로 판단됩니다. Bit width 설정에 따라 mxq가 컴파일되기 때문에 예상하신 대로 bit 수를 줄이면 메모리 병목을 줄일 수 있습니다. 이에 따라 릴리즈되는 LLM/VLM 모델 전부 Weight 4bit + Value 8bit 양자화(W4V8)와 전체 8bit 양자화(W8)를 제공드리고 있습니다.

Q3. 현재 qb SDK에서 공식적으로 제공되는 API가 아닌 다른 방식의 사용자 정의 처리는 지원하고 있지 않습니다. qb Compiler는 자사 NPU에 맞게 이미 최적화를 거친 Attention 구조를 만들어 고객분들께 제공하고 있고, 계획하시는 파이프라인의 경우 PCIe를 통해 대량의 KV Cache 데이터가 이동해야 하기 때문에 최적화 측면에서도 불리함을 가지고 있습니다. qb Compiler는 사용자가 별개의 최적화를 거치지 않고도 KV Cache의 bit-width만 지정하면 메모리 병목까지 고려한 최적의 NPU instruction을 생성하기 때문에 qb Compiler의 세팅을 이용해주시면 감사드리겠습니다.

Q4. 해당 API를 통해 얻은 KV Cache Blob의 편집에 대한 공식적인 지원은 하지 않습니다. 말씀하신 대로 KV Cache Snapshot을 Host PC에서 저장 및 관리하기 위한 기능으로 제공 드리고 있습니다. 고객분들이 직접 제작하시는 Cache Eviction 등의 기술을 적용하기 위해 KV Cache 관련 API를 확장할 계획은 가지고 있습니다.

자사 제품을 사용해주셔서 감사드리며, 사용 중에 궁금하신 사항이나 불편하신 점이 있으시다면 주저하지 마시고 포럼을 통해 문의해주세요 :slight_smile:

감사합니다.

안녕하세요! 질문자와 동일 팀에서 프로젝트를 진행하고 있습니다.

Mobilint 공식 Hugging Face 페이지에서 공개된 mobilint/Qwen2.5-0.5B-Instruct 모델을 다운로드하여 사용하고 있습니다. 직접 컴파일한 모델이 아니라 저장소에 포함된 precompiled Qwen2.5-0.5B-Instruct-W8.mxq를 mobilint-qb-runtime 1.2.0에서 실행했습니다. get_cache_infos()를 통해 24개 layer의 K/V cache 총 48개를 확인했으며, cache dump/load도 정상 동작합니다.
하지만 실제 inference 후 유효한 cache_size, tail_size, mask를 사용해 filter_cache_tail()을 호출하면 bundle_0 doesn’t support cache rearrangement 오류가 발생합니다.

해당 공개 MXQ가 LlmConfig로 컴파일되어 filter_cache_tail()을 지원하는 모델인지 궁금합니다. 이 모델에서 해당 API가 검증되었다면 권장 qb Runtime 버전과 호출 조건을 알려주실 수 있을까요? 별도의 compile option이 필요하다면 함께 안내해주시면 감사하겠습니다.

jason님 안녕하세요? 모빌린트 임범수입니다.

다시 자세히 확인한 결과, filter_cache_tail()과 move_cache_tail()은 최신 qb Compiler에서는 지원하지 않도록 되어있었으나 qb Runtime에서는 API가 남아있었던 문제였습니다. 모델 주 릴리즈된 모델은 qb Compiler의 미릴리즈 최신 버전을 사용하기 때문에 해당 API를 지원하지 않습니다.

위의 답변에서 말씀드린 점 또한 현재로서는 잘못된 정보였으며, 공식적으로 qb SDK에서는 더 이상 cache tail 관련 operation API를 공식적으로 지원하지 않습니다. 혼란을 드려서 죄송합니다.

임범수 드림