llama.cpp 프롬프트 룩업 드래프팅 최대 42배 빠르게 만들기
Faster prompt lookup drafting in llama.cpp
TL;DR Highlight
맵 복사 제거와 자료구조 교체로 llama.cpp 드래프팅이 최대 42배 빨라졌다
Who Should Read
llama.cpp로 로컬 LLM 추론을 돌리며 n-gram 기반 추측 디코딩의 드래프팅 오버헤드가 궁금한 백엔드 개발자
Core Mechanics
- 프롬프트 룩업은 아주 단순한 드래프트 모델이다
- 프롬프트 룩업 디코딩(n-gram 추측)은 추측 디코딩에서 n-gram 모델을 드래프트 모델로 쓰는 특수한 경우다.
- llama.cpp, vllm, transformers 라이브러리가 이 방식을 지원한다.
- 캐시는 세 종류, 순서대로 시도한다
- context 캐시, dynamic 캐시, static 캐시가 있고 n=4,3,2,1 순으로 임계값을 통과하는 첫 토큰을 드래프트한다.
- context에서 모두 실패해야 dynamic을 쓰고, 둘 다 실패하면 static만으로 시도한다.
- 내부 맵 복사를 없애니 4.5~25.6배
- 내부 맵이 드래프팅 단계마다 불필요하게 복사되고 있었고, 참조로 읽게 바꿨다.
- 코퍼스 크기에 따라 드래프팅이 4.5배~25.6배 빨라졌다.
- 최적화라기보다 버그 수정에 가깝다고 저자가 말한다.
- 바깥 맵을 flat hash map으로 교체
- std::unordered_map을 ankerl::unordered_dense segmented_map으로 바꿨다. 직전 단계(복사 제거) 대비다.
- static 캐시 로딩 1.41~1.65배, 드래프팅 1.02~1.13배 빨라졌고 메모리는 1.07~1.11배 줄었다.
- 안쪽 맵은 정렬 벡터와 고정 길이 이진 탐색으로
Community Reactions
- 최종 사용자 토큰/초 개선폭이 궁금하다는 질문
- 드래프팅 속도만 측정했다는 점에서 실제 tk/s 개선은 얼마인지 묻는 댓글이 달렸다.
- 글에는 그에 대한 답이 없다.
- Lemire 최적화가 추가됐다는 작성자의 후속 댓글
- 작성자가 Lemire가 PR로 추가 최적화를 보냈다고 알렸다.
- 직접 벤치마크해 글에 반영하겠다고 했고, 이후 "Lemire가 완전히 해냈다"며 결과를 공유했다.
- 작성자와 llama.cpp 커뮤니티의 갈등을 지적하는 반응
- 작성자가 llama.cpp 오픈소스 커뮤니티에서 겪는 대인 문제에 조언을 구했다.
- 한 댓글은 비공개로 해결하라는 요청을 두고 여기서 하소연하는 건 잘못된 방식이라고 비판했다.
How to Apply
- llama-lookup-stats로 내 환경의 드래프팅 시간 재보기
- llama.cpp 예제의 llama-lookup-create로 static 캐시를 만들고 llama-lookup-stats로 파일을 재생해 보자.
- 드래프트 토큰당 지연, 로딩 시간, 메모리를 측정해 병목을 확인하라.
- 자체 캐시 코드의 불필요한 맵 복사부터 점검하기
- 중첩 맵을 값으로 반환하거나 for 루프에서 복사하는 곳을 찾아 const 참조로 바꿔라.
- 원문에서 이 한 가지만으로 4.5~25.6배 개선이 나왔다.
- 읽기 전용 데이터는 불변 구조로 바꾸기
- 로딩 후 수정하지 않는 룩업 테이블은 constmap 같은 불변 맵과 연속 배열로 옮겨라.
- 로딩 시간과 메모리를 같이 재서 비교하라.
- 조기 종료 조건을 점수 계산 앞으로 당기기
- 후보 전체를 점수화한 뒤 임계값을 확인하는 코드는 총 횟수와 최빈 후보부터 먼저 검사하게 바꿔라.
- 최빈 후보가 탈락하면 나머지 계산은 건너뛰어라.
Try It
# llama.cpp 빌드 후 터미널에서 실행 (원문 도구 사용, 옵션은 --help로 확인)
# 1) static n-gram 캐시 만들기
./llama-lookup-create --help
# 2) 코퍼스를 재생하며 드래프팅 통계 측정
./llama-lookup-stats --help
# 이어서 해 볼 것: 코퍼스 크기(25/50/100/200MB)별로 3회씩 돌려 드래프트 지연, 로딩 시간, 메모리의 중앙값을 비교해 보자.Terminology
관련 논문
Mercury 3: 규모를 키운 diffusion LLM, 초당 1,000토큰 이상
Diffusion LLM을 40배 키웠더니 속도 4~8배, 품질은 속도 특화 모델 수준
Timestral: Mistral의 시계열 파운데이션 모델
209M 파라미터 시계열 모델이 3대 벤치마크 1위, CPU에서도 돌아간다
DeepSeek V4.1 Flash 1017 (Max) 성능·속도·가격 분석
DeepSeek V4.1 Flash 1017 Max는 지능 지수 45에 211 tok/s, 입력 $0.30
LLM 프록시를 직접 안 돌리면 무슨 일이 벌어지는지 어떻게 아나
자체 LLM 프록시를 세웠더니 키·모델·캐시 미스를 직접 볼 수 있다
DeepSeek V4.1 Flash 1017: 싼 가격에 1M 컨텍스트를 주는 에이전트용 모델
DeepSeek V4.1 Flash 1017은 입력 $0.05/M, 1M 컨텍스트의 에이전트용 모델
DeepSeek-V4.1-Flash-1017 공개: 더 짧게 생각하고 더 빠르게 일하는 에이전트용 모델
DeepSeek V4.1 Flash 마이너 업데이트로 코딩·에이전트 벤치 점수↑, 실행 시간·출력 길이↓
Llmspeed: 로컬 LLM 속도를 하드웨어 구매 전에 체감해 보는 시뮬레이터
GPU·모델을 고르면 로컬 LLM 속도를 미리 체감하게 해 주는 시뮬레이터