엔터를 치기 전에 생각한다 — GPU가 놀고 있던 시간을 훔친 MAFDET
로컬 LLM을 쓰다 보면 몸에 밴 대기가 하나 있다. 메시지를 다 쓰고 엔터를 누른 뒤, 첫 단어가 나올 때까지 화면을 들여다보는 일. 추론 모델이라면 10초 넘게 앉아 있는 것도 예사다. 그동안 GPU는 뭘 하고 있었을까. 아무것도 안 했다. 내가 문장을 쓰는 그 몇십 초 동안 GPU는 쉬고 있었다.
어제 r/LocalLLM에 이 빈 시간을 정면으로 건드린 프로젝트가 올라왔다. MAFDET. 이름은 이집트 신화의 고양이 머리 여신 마프데트에서 왔는데, 뱀과 전갈이 공격하기 전에 먼저 덮치는 “달리는 자”다. 하려는 일을 이름부터 요약하고 있다.
입력하는 동안 몰래 하는 일
MAFDET이 하는 일은 두 가지다. 둘 다 타이핑하는 그 시간을 쓴다.
첫째, 읽기 미리하기. KV 캐시가 쓰고 있는 텍스트를 실시간으로 따라간다. 오타, 중간 수정, 붙여넣기 전부 포함이다. 엔터를 누르는 순간 프리필(prefill)이 이미 끝나 있으니 새로 계산할 게 없다. 이 부분은 근사가 아니다. 처음부터 다시 계산한 결과와 항상 정확히 일치한다고 만든 쪽이 설명한다.
둘째, 생각 미리하기. Qwen3가 아직 보내지 않은 메시지에 대해 추론을 시작한다. 도중에 문장을 고치면 어떻게 되나. 기존 추론을 버리지 않는다. 새 버전 메시지 뒤에 메모로 붙여두고, 모델은 거기서 이어서 생각한다. 엔터가 눌리면 도달한 지점에서 마저 끝낸다.
숫자가 이 프로젝트를 대신 말해준다. RTX 2060 6GB에서 24개의 문제를 실제로 타이핑하며 측정했다. Qwen3-4B의 엔터 후 평균 대기는 12.2초에서 3.2초로 줄었다. 정확도는 24개 중 24개 그대로. VRAM에 절반쯤 들어가는 Qwen3-14B에서는 108초가 47초가 됐다. 6GB짜리 카드로 이 정도면 스펙을 바꾸지 않고 체감부터 바꾼 셈이다.
안 끝난 문장을 어떻게 생각하게 하나
여기서 가장 어려운 문제는 뜻밖에도 모델 쪽이다. 아직 끝나지 않은 문장을 보여주면 모델은 대부분 “사용자가 아직 입력 중입니다…” 같은 소견을 늘어놓는다. 아무 짝에도 쓸모 없는 메모다. 만든 쪽이 찾은 답은 짧은 프레임 하나. 사실과 부분적 계산 결과를 모으라고 지시하니 오프 트랙인 메모가 86%에서 20%로 떨어졌다.
댓글에서는 날카로운 구멍도 짚혔다. 12를 입력했는데 모델이 3 × 12 = 36을 메모해 둔 뒤, 사용자가 12를 15로 고치면? 새 단어는 다음 줄에 남지만 12가 사라졌다는 정보는 어디에도 없다. 가끔 보내지 않은 버전으로 답하는 원인이 되리라는 지적이다. 만든 쪽이 인정하는 한계도 솔직하다. 생각 미리하기는 Qwen3에서만 측정했고, 검증 환경은 Windows + NVIDIA뿐이다. 리눅스는 아마 되겠지만 누군가 확인해줬으면 한다는 태도다.
재미있는 건 안 된 결과도 README에 적어뒀다는 점이다. VRAM보다 큰 모델을 위해, 타이핑 동안 작은 모델이 자료를 모아 큰 모델에게 넘기는 구조를 시도했다. 손으로 완벽하게 정리한 자료를 줘도 큰 모델이 스스로 미리 생각한 것과 겨우 비슷했다고 한다. 작은 모델의 도움으로 큰 모델을 가속한다는, 있을 법한 아이디어가 실은 공짜가 아니라는 결과다.
그 외에도 다운로드 전에 각 모델이 내 VRAM에 들어가는지, 얼마나 빠르게 돌지 미리 estimate하는 카탈로그(실측과 약 12% 오차), Textual 기반 터미널 UI, llama.cpp 자동 세팅까지 들어 있다. Apache 2.0 라이선스에 PyTorch는 필요 없다.
왜 주목할까
r/LocalLLM의 단골 질문은 “이 예산에 이 GPU면 어떤 모델이 최고냐”다. 사양표를 갈아치우는 논의는 넘쳐나는데, 정작 소프트웨어 쪽에서 기다림 자체를 줄이는 시도는 드물었다. 댓글에도 “스펙 질문글 사이의 신선한 공기”라는 반응이 달렸다. 그럴 만하다.
접근 방향이 다르다는 게 포인트다. 지연을 줄이는 통상의 답은 더 빠른 GPU였다. MAFDET의 답은 GPU가 이미 가지고 있던 시간을 되찾는 것이다. 하드웨어를 업그레이드하지 않고, 기다림의 정의부터 바꾼다. 요즘 로컬 진영에서 “VRAM 부족은 소프트웨어가 메운다”는 흐름이 여러 각도에서 확인되고 있는데, 이 프로젝트는 그중에서도 가장 우아한 축에 속한다.
저사양 GPU 사용자에게는 더 직접적이다. 6GB 카드로 4B 모델을 돌리던 사람에게 3초의 대기는 12초의 대기와 전혀 다른 도구다. 체감 속도가 하드웨어 세대를 한 단계 뛰어넘는 순간이고, 그게 프롬프트 하나로 가능하다니 말이 안 되는 게 아니라 놀라운 일이다.
정리
MAFDET은 Qwen3 전용이고 검증 환경도 좁다. 숫자를 고치는 엣지 케이스 같은 구멍도 남아 있다. 그래도 방향은 명확하다. 추론 모델의 “생각 시간”을 사용자가 입력하는 시간 안으로 밀어 넣는 발상은, 다른 프론트엔드와 에이전트 UI에도 그대로 옮겨질 수 있다.
클라우드와 로컬의 격차 논쟁이 하드웨어 대 소프트웨어의 논쟁으로 바뀌고 있다는 얘기를 어제도 했지만, 이런 프로젝트가 그 전환의 증거다. 뱀이 공격하기 전에 움직이는 여신의 이름을 붙인 이유를 이제 알겠다. 기다림도, 미리 움직이면 줄일 수 있다.
원본 스레드: I made my local LLM start thinking while I’m still typing: 12s → 3s wait on a 6 GB GPU (open source) · GitHub - TheLastOxygen/mafdet