5년 된 M1 Max에서 126B MoE가 44 tok/s — ds4 포크는 아직 여유가 남았다
2021년에 산 M1 Max 맥북을 아직도 붙들고 있는 내게 가슴 뛰는 소식이 들려왔다.
로컬 LLM을 돌려본 맥 유저라면 누구나 겪어본 슬픈 패턴이 있다. 처음 한두 마디 주고받을 땐 빠릿빠릿하다가, 컨텍스트가 차곡차곡 쌓이고 긴 에이전트 세션으로 넘어가면 모델이 헉헉대며 뻗어버리는 현상이다. 그런데 어제 r/LocalLLM에 이 상식을 통째로 뒤흔드는 글이 올라왔다. 출시된 지 5년이나 지난 2021년형 64GB M1 Max 맥북에서 무려 126B 파라미터짜리 거대 MoE 모델이 4K 컨텍스트에서 초당 44토큰(tok/s), 398K라는 초장문 컨텍스트에서도 35.4 tok/s를 칼같이 유지한다는 것이다. NVIDIA의 전용 AI 워크스테이션인 DGX Spark 뺨을 때리는 미친 수치다.
지난주 Splash 엔진을 M1에 포팅했던 실력자 u/Erp4759가 또다시 등판했다. 이번엔 자기 자체 엔진 대신 antirez(Redis 창시자)가 만든 경량 엔진 ds4(DwarfStar)를 포크해서 튜닝했다. Qwen3.8-Flash-Next의 복잡한 구조를 맨땅에서 구현하려면 세월아 네월아 걸릴 테니, 이미 잘 돌아가는 ds4를 가져다가 Apple Silicon에 맞춰 극한으로 최적화하는 데 모든 화력을 쏟아부었다.
무엇을 어떻게 깎아냈나
출발점은 생각보다 험난했다. ISTA-DASLab의 GSQ-RCO 혼합 정밀도 GGUF 파일은 순정 ds4에서는 열리지도 않았고, 패치를 간신히 먹여서 첫 실행에 성공했을 때 나온 속도는 21~23 tok/s에 불과했다. 작성자는 여기서 Metal 커널을 뜯어고치며 속도를 두 배 넘게 끌어올렸다.
핵심 튜닝 포인트를 요약하면 이렇다:
- ISTA 퀀트의 모든 정밀도 조합을 지원하는 전용 Metal 디코더를 새로 짰다. CPU 연산 결과와 비트 단위까지 일치하는지 일일이 검증을 거쳤다.
- BF16 기준 95GiB에 달하는 방대한 n-gram 테이블을 메모리에 무식하게 다 올리지 않는다. 초고속 SSD의 28.8GB 샤드 파일에서 현재 토큰 생성에 필요한 16개 행만 핀포인트로 읽어온다.
- 원본 릴리스에서 누락되어 있던 MTP(Multi-Token Prediction) 헤드를 별도의 1.5GB GGUF에서 정밀하게 이식했다.
디코드 속도를 가르는 핵심은 현란한 흑마법이 아니라 반복되는 행렬-벡터 곱셈(matvec)의 최적화였다. 토큰을 하나 생성할 때마다 약 4GB의 가중치를 메모리에서 읽어와야 하니, 여기서 1%의 병목만 줄여도 곧바로 1%의 속도 향상으로 이어진다. Q2_0용 half2 트릭, 타입드 블록 포인터 적용(5~15% 성능 향상), 그리고 MTP 검증 전체를 가중치 1회 로드로 처리하는 2~3토큰 변주 기법까지 집어넣었다. 코드 생성 작업에서 MTP를 활성화하자 속도가 24 tok/s에서 45 tok/s로 거의 수직 상승했다.
컨텍스트가 길어져도 속도가 꺾이지 않는 비결도 흥미롭다. Flash-Next의 어텐션은 인덱서가 점찍은 블록만 훑는 구조라 이론상 가벼운데, M1 환경에서는 그 인덱서의 스칼라 연산기가 128K 컨텍스트에서 토큰당 42.5ms 중 10.7ms나 처먹고 있었다. 이를 모든 Apple GPU에서 비트 단위로 동일하게 작동하는 벡터 스코어러로 전면 재작성하고, top-k 선택을 정렬하며, 어텐션 루프가 한 번에 키 4개를 동시에 읽도록 뜯어고쳤다. 그 결과 128K에서 23.8 tok/s이던 속도가 33.8 tok/s로, 262K에서는 17.7 tok/s에서 29.7 tok/s로 껑충 뛰었다. 출력되는 텍스트 바이트는 원본과 100% 동일하다.
장기 에이전트 세션을 지켜내는 뚝심
단순히 짧은 벤치마크 숫자만 잘 나오는 게 아니다. 이 포크가 진짜 노린 타깃은 로컬 모델들이 흔히 뻗어버리는 ‘장시간 에이전트 코딩 세션’이다. 5분 동안 지속적으로 풀 부하를 걸어 테스트해도 시작 속도 43.2 tok/s, 종료 속도 43.1 tok/s로 유지력이 경이롭다. GPU 온도는 73~75도 수준에서 안정적으로 방어되고, 쓰로틀링 따위는 없었으며, 토큰당 전력 소모는 0.70J에 불과했다(M1 Max 오너들 소리 질러).
여기에 감탄이 절로 나오는 디테일이 하나 더 있다. 모델의 레이어 4개 중 3개가 순환(recurrent) 구조라 시간을 되돌릴 수 없어서, 에이전트가 실패한 턴을 다시 시도할 때마다 그동안의 프리필을 맨 처음부터 무식하게 다시 계산해야 했다. 작성자는 서버가 마지막 턴 마커의 내부 상태를 메모리에 보존하도록 수정했다. 그 결과 31K 토큰짜리 프롬프트의 재프리필 시간이 109초에서 단 0.3초로 줄어들었다. 밥 먹듯이 재시도를 반복하는 AI 에이전트 워크플로우에서는 이런 최적화야말로 체감 속도를 천국으로 바꿔놓는 요소다.
실제 OpenCode 실전 코딩 세션에서도 검증을 마쳤다. 162번의 요청을 처리하는 동안 컨텍스트는 최대 371K까지 치솟았지만, 디코드 속도는 64K 미만에서 44 tok/s, 128~256K 구간에서도 38 tok/s를 방어했다.
컨텍스트 Q2_0 디코드 프리필 IQ3_XXS 디코드
4K 44.0 tok/s 328 tok/s 35.2 tok/s
128K 43.0 320 34.2
256K 38.8 313 31.7 (259K)
398K 35.4 292 —
IQ3_XXS(44GiB) 양자화는 답변 퀄리티가 우수하면서도 35.2 tok/s를 찍어줬다. Q2_0(35GiB)이 속도 몰빵이라면, IQ3_XXS는 지능과 속도의 균형점이다. 댓글에서는 “2비트 양자화 모델로 코딩하면 빌드 에러나 안 나냐”, “Q2는 너무 처참하다”는 회의론도 나왔다. 작성자 역시 2비트 모델이 4비트 27B 모델만큼 똑똑하다고 억지 부릴 생각은 없다고 선을 그었다. 하지만 30K 분량의 방대한 툴 실행 결과가 128K 컨텍스트로 쏟아져 들어올 때, 같은 맥북에서 27B가 10분 넘게 끙끙 앓는 작업을 이쪽은 단 90초 만에 쳐낸다는 메리트는 결코 무시할 수 없다.
왜 여기에 주목해야 할까
전용 머신과 비교해 보면 체감이 확 온다. 수천만 원을 호가하는 NVIDIA DGX Spark에 vLLM NVFP4+MTP 레시피를 물렸을 때 코드 생성 속도가 45.8 tok/s다. 그런데 내가 들고 다니는 5년 된 M1 Max 맥북에서 44~45 tok/s가 나온다. 물론 Spark가 프롬프트 프리필 속도는 5배나 빠르고 4비트 원본 가중치를 쓰니 종합 성능에서는 앞서지만, 5년 된 중고 랩톱이 전용 AI 서버 박스와 토큰 속도로 맞짱을 뜬다는 사실 자체가 충격적이다.
더 흥미로운 점은 아직도 칩의 여유가 남아있다는 사실이다. 35.5 tok/s를 뽑아내는 동안 M1 Max의 400GB/s 메모리 대역폭 중 실제로 쓰인 건 약 150GB/s에 불과하다. 프리필 327 tok/s 역시 하드웨어 FP16 피크치의 절반도 못 쓴 상태다. 나머지는 토큰당 천 번씩 발생하는 자잘한 디스패치 오버헤드로 새어 나가고 있다는 뜻이다. 즉, 현재 속도조차 M1 실리콘의 한계가 아니라는 의미이며, M3 Max나 M4 Max, M5 맥북에서는 어떤 괴물 같은 숫자가 찍힐지 상상만 해도 손이 떨린다.
정리
설치는 dstar 원라인 런처 스크립트 하나로 끝난다. macOS 15 이상이면 복잡한 빌드 과정 없이 바로 돌아간다.
curl -fsSL https://raw.githubusercontent.com/paperniuk/ds4/m1-flash-next/install.sh | bash
dstar doctor # 내 맥의 VRAM과 호환성 체크
dstar pull # Qwen3.8-Flash-Next Q2_0 + MTP + vision (약 67GB) 다운로드
dstar serve # OpenAI/Anthropic 호환 로컬 엔드포인트 구동 (http://127.0.0.1:8010/v1)
통합 메모리 64GB 이상의 맥북이 권장되며, 262K 이상의 초장문 컨텍스트를 다루려면 iogpu.wired_limit_mb 값을 튜닝해 주는 게 좋다(재부팅하면 초기화된다).
코드 지능을 원하면 IQ3_XXS, 미친 토큰 속도를 원하면 Q2_0을 고르면 된다. 안티레즈의 가벼운 C 엔진에 집념 어린 엔지니어링 최적화가 더해지니 구형 맥북이 괴물 AI 머신으로 부활했다. 이런 오픈소스 실험들이 쌓이는 걸 보면, 고사양 로컬 LLM이 소수 매니아의 취미를 넘어 일반 개발자들의 필수 장비로 자리 잡을 날도 머지않았다.