focus-llama: 선언적 어텐션(Declarative Attention)을 구현한 llama.cpp 포크 (arXiv:2609.02737)
focus-llama: a llama.cpp fork implementing Declarative Attention (arXiv:2609.02737)
핵심 요약
모델이 필요한 컨텍스트 청크를 직접 선언하여 추론 속도를 높이는 Declarative Attention 기술을 llama.cpp에 구현했습니다.
- Declarative Attention 구현 — 모델이 스스로 필요한 컨텍스트 청크를 태그로 선언하여 불필요한 연산을 줄임
- llama.cpp 포크 — KV 캐시 제어 및 서버 측 변경을 위해 llama-server를 수정함
- 성능 최적화 가능성 — 논문상 Gemma와 Qwen 모델에서 디코드 시간 단축 효과 확인
- 기술적 도전 과제 — 커널 지원이나 압축 없이는 실제 KV 메모리 절약이 어려워 추가 연구 필요
Declarative Attention(arXiv:2609.02737, Google DeepMind 및 KAIST AI)을 구현하려고 llama.cpp를 포크했어. 모델이 자기 출력물에서 어떤 컨텍스트 청크가 필요한지 직접 선언하면(<focus magic_chunks="N">), 엔진이 그걸 듣고 다음 토큰들이 어디에 어텐션을 줄지 제한하는 방식이야. 스코어러도 필요 없고 학습도 필요 없어. 그냥 프롬프팅이랑 태그에 반응하는 엔진만 있으면 됨. 논문에 따르면 응답 생성 시간(decode time)이 기존 대비 0.71배(Gemma), 0.77배(Qwen)까지 줄어든다네. 이건 논문에 나온 vLLM 기준 수치고, 내가 만든 포크 버전은 아직 벤치마크 안 돌려봤어(정확도 테스트도 마찬가지).
= 되는 것 =
- llama-server에서 요청에 대한 KV 토큰 범위를 날려버릴 수 있음(da_rm / da_rm_at). 프리필 중간이나 프리필 이후에도 가능.
- 태그 기반 모드: 클라이언트가 청크 레이아웃을 주면, 서버가 생성 중에 모델의 첫 번째 <focus magic_chunks="N"> 태그를 파싱해서 그 시점에 나머지 청크를 날려버림(원샷, 단방향).
- 두 번째 시퀀스 모드(da_b, --kv-unified 필요): 원래 시퀀스는 그대로 둠.
- 간단한 스모크 테스트(Qwen 하이브리드/GDN 모델이랑 아주 작은 덴스 모델)에서 첫 토큰 logprobs로 확인 완료.
= 왜 포크했나 =
- 순정 llama-server는 생성 중간에 KV 범위를 건드릴 방법이 없어서 서버 쪽 수정이 필수였음.
- llama.cpp에는 페이지드 블록 테이블이 없음(논문의 vLLM 버전은 이걸 다시 짰더라). 그래서 마스킹만으로는 읽어오는 KV 양이 안 줄어듦.
- 제대로 스킵하려면 커널 지원이나 컴팩션이 필요한데, 소스 코드 보니까 지금 CUDA에서 단일 토큰 디코딩할 때는 마스킹된 청크를 스킵 안 하더라고.
- 하이브리드 모델에서는 어텐션 레이어만 제한하고(논문이랑 동일), 리커런트 상태는 건드리지 않음.
저장소: https://github.com/edwardyoon/focus-llama
피드백 환영함. 특히 llama.cpp의 KV나 리커런트 메모리 쪽 건드려본 사람 있으면 더 좋고.


