2 minute read

16GB짜리 그래픽카드에 27B 모델을 올리고, 컨텍스트를 무려 200K(20만 토큰)까지 꽉꽉 채워 넣으면서 초당 50토큰의 속도로 쏜다? 로컬 LLM 좀 만져본 사람이라면 “그게 말이 되냐, 약 팔지 마라”며 멱살부터 잡을 이야기다. 보통 16GB VRAM이면 27B 모델을 4비트로 양자화해서 올리는 순간 메모리가 거의 꽉 차서, 컨텍스트 8K만 넘겨도 바로 OOM(Out of Memory) 터지며 장렬하게 뻗는 게 정상이니까.

그런데 r/LocalLLM에 이 불가능해 보이는 미션을 악착같은 짠돌이 엔지니어링으로 정면 돌파한 글이 올라왔다. 흔해 빠진 RTX 5070Ti(16GB) 하나로 Qwen 3.8 27B를 196K 컨텍스트까지 밀어 넣고 50 t/s를 뽑아낸 후기다. 읽는 내내 “와… 사람이 독기를 품으면 이렇게까지 깎는구나” 싶어 감탄이 절로 나왔다(진짜 광기다).

출발점: 메모리 예산부터 계산한다

글쓴이의 스펙은 소박(?)하다. RTX 5070Ti (16GB), 시스템 RAM DDR5 16GB, 라이젠 7 9700X, 윈도우 11. 모델은 Unsloth에서 나온 UD-IQ4_XS GGUF다.
여기서 27B Q4 모델을 무작정 올리면 VRAM이 1바이트도 안 남는다. 그래서 글쓴이는 가계부 쓰듯이 VRAM을 메가바이트 단위로 쪼개며 다이어트를 시작했다.

첫 번째 치트키는 ‘임베딩 테이블 프루닝(Pruning)’이었다.
Qwen 3.8은 다국어를 지원하지만, 글쓴이의 작업은 오직 ‘영어’와 ‘코드 작성’뿐이었다. 그렇다면 아랍어나 키릴 문자 같은 비-ASCII 토큰들의 임베딩 가중치를 들고 있을 이유가 전혀 없다. 토큰 임베딩 테이블과 LM Head에서 쓸데없는 비-ASCII 영역을 칼로 도려내듯 싹둑 잘라내 버렸다. 이것만으로 자그마치 700MB의 VRAM을 단숨에 확보했다(모델을 깎아버리는 발상이 대단하다).

두 번째는 ‘임베딩 테이블의 CPU 오프로드’다.
프루닝하고 남은 임베딩 테이블마저 VRAM이 아니라 시스템 램(CPU)으로 밀어내서 270MB를 추가로 쥐어짰다. 여기에 VRAM을 야금야금 갉아먹는 MTP(Multi-Token Prediction) 헤드까지 꺼버리니, 오직 컨텍스트 윈도우와 KV 캐시만을 위한 여유 공간이 무려 3.6GB나 확보됐다. 이것만 해도 약 84K 토큰까지는 너끈히 버틴다. 하지만 목표는 200K였다.

진짜 승부수: adaptive-KV 스트리밍

84K에서 200K로 점프하기 위한 진짜 승부수는 바로 llama.cpp의 adaptive-kv-streaming 커스텀 포크였다.
원래 KV 캐시는 VRAM에 통째로 얹어둬야 하지만, 이 포크는 캐시를 페이지 단위로 쪼개서 호스트 시스템 RAM에 박아두고 필요할 때만 VRAM으로 번개처럼 스트리밍해 온다. 컨텍스트가 깊어질 때 미세한 레이턴시를 내주는 대신, VRAM 폭발을 완벽하게 방어하는 기술이다.

여기에 캐시 양자화(Cache Quantization)를 덧댔다. K 캐시는 Q8_0, V 캐시는 Q4_0으로 압축해서 밀어 넣었다. 그렇게 완성된 최종 실행 커맨드가 바로 이거다.

-ngl 99 -fa on -ctk q8_0 -ctv q4_0 -np 1 -ub 128 -b 512 \
  -ot "token_embd.weight=CPU" --jinja

플래시 어텐션(Flash Attention) 켜고, 배치 사이즈 조절하고, 토큰 임베딩은 CPU로 던지는 옵션의 총집합이다. 옵션 하나하나는 아는 내용일지 몰라도, 이렇게 VRAM 예산을 1MB 단위로 계산해서 테트리스 하듯 쌓아 올린 실행력은 진짜 경이롭다. 196,608 토큰을 꽉 채우고도 초당 50토큰(50 t/s)이 나온다니, 이 정도면 실무 코딩에 써도 전혀 답답함이 없는 수준이다.

이 글이 주목받는 이유

이 글이 레딧에서 폭발적인 반응을 얻은 건 수천만 원짜리 H100이나 Mac Studio 192GB를 쓴 게 아니기 때문이다. 동네 조립 PC 매장에서도 흔히 파는 평범한 16GB 중급 그래픽카드로 이뤄낸 쾌거다. 게다가 자기가 직접 프루닝한 모델 가중치와 llama.cpp 포크 빌드까지 허깅페이스와 깃허브에 아낌없이 오픈소스로 공개했다(압도적 감사…).

요즘 클라우드 AI 서비스들은 하루가 멀다 하고 구독료를 올리고, 토큰 쿼터를 쥐어짜며 사용자들을 옥죄고 있다. 반면 로컬 LLM 씬에서는 이런 변태 같은 최적화 덕분에 “어? 내 컴퓨터에서도 27B 모델이 20만 토큰으로 도네?” 하는 기적이 일어나고 있다. 거대 테크 기업의 인프라 독점에 맞서는 해커 정신의 정수다.

정리

정리해 보면 마법 같은 건 없었다.

  1. 모델은 Q4 극단 양자화로 줄이고,
  2. 안 쓰는 언어의 임베딩은 가차 없이 칼질(프루닝)하고,
  3. 남은 임베딩은 CPU로 던져버리고,
  4. KV 캐시는 양자화해서 시스템 램으로 스트리밍한다.

최신 GPU를 사달라고 회사에 조르거나 통장 깰 생각만 하던 내 자신이 살짝 부끄러워진다. 로컬 LLM의 한계는 VRAM 용량이 아니라, 내 엔지니어링 집념의 한계였던 건 아닐까(반성 중이다…). 16GB 카드를 품고 있는 개발자라면 당장 깃허브 열고 따라 해보자.