JustFit은 24GiB 맥북에서 27B 256K 윈도우를 적시 상태 관리한다.

JustFit: 200K-Token LLM Serving on a 24 GiB Laptop with Just-in-Time State Management

arXiv2609.17475v1

Yuhua Chen2026-09-15조회 4

무엇인가

이 논문은 24 GiB 통합 메모리를 가진 M4 Pro 맥북에서 27B급 모델을 로컬 에이전트용으로 서빙할 때, 모델 실행 메모리와 작업 이력 메모리가 같은 예산을 두고 경쟁한다는 문제를 다룬다. Qwen3.8-27B MXFP4의 비전 타워를 제외한 타깃 텐서가 13.31 GiB를 차지하고, Qwen의 네이티브 256K 윈도우에서 FP16 KV 캐시는 16 GiB를 더 요구한다. 실행이 시작되기도 전에 둘을 합치면 24 GiB를 넘는다. Apple M 시리즈는 CPU와 GPU가 같은 MLX 배열을 공유해 배치 장벽은 없애지만, 그렇다고 동시 할당 경쟁이 사라지는 것은 아니다. 저자는 메모리 사용량을 M(t) = W(t) + K(t) + S(t) + X(t) + H(t)로 개념적으로 나누고, 가중치 W뿐 아니라 압축 KV K, 순환·추측 상태 S, 임시 버퍼 X의 겹침을 줄이는 것을 목표로 삼는다.

어떻게 동작하나

핵심 구성 요소는 세 가지다. 먼저 KVExec은 4비트 KV 캐시 TQ4를 실행하는 경로를 담당한다. TQ4는 TurboQuant의 정규화·회전 MSE 정식화를 쓰며, 벡터를 노름과 방향으로 분리하고 랜덤 부호 Hadamard 변환으로 큰 좌표를 퍼뜨린 뒤 16개 공유 centroid를 고르는 비균일 스칼라 양자화를 적용한다. 256개 원소 벡터당 128바이트에 2바이트 노름을 더해, 토큰 위치당 16,640바이트다. 256K 이력이 4,160 MiB, 320K가 5,200 MiB로 FP16 KV 페이로드의 25.4%에 해당한다. 저장은 256토큰 페이지 풀로 관리하고 PagedAttention식 페이지 테이블로 요청 순서를 매핑한다. 저장 포맷과 실행 포맷이 다르다는 점이 문제인데, 프리필은 MLX의 최적화된 SDPA를 쓰므로 부동소수점 K/V 오퍼랜드가 필요하다. JustFit은 페이지 조회, Q4 언패킹, centroid 조회, 역회전, 노름 복원을 하나로 합친 Metal 커널로 최종 부동소수점 오퍼랜드만 쓰게 하고, 4개 KV 헤드를 2개씩 그룹으로 재구성한 뒤 mx.eval로 경계를 끊어 임시 의존성이 쌓이지 않게 한다.

무엇과 다른가

PhaseSwap은 컴포넌트마다 수명이 다르다는 점을 이용한다. 출력 헤드 644.14 MiB는 중간 프리필에 필요 없고, MTP predictor 215.21 MiB는 단일 요청 추측에만 쓰이며, BF16 비전 타워 878.77 MiB는 이미지 특징 추출 동안만 필요하다. 실행 소유자 집합 O_c(t)가 비어 있지 않으면 컴포넌트를 붙여 두는 lease 규칙으로, A의 디코드가 진행 중이면 B의 프리필 청크 중에도 헤드를 유지한다. 이미지 요청은 텍스트 이력이 자라기 전에 먼저 인코딩하고 타워를 놓아준다. StateTrans는 실행 모드 전환과 요청 추가를 담당한다. 단일 요청에는 MTP를, 2개 이상에는 자기회귀 배칭을 쓰는데, 배치 MTP가 2요청에서 1.7~1.9%, 3~4요청에서 12.1~20.4% 느리고 피크도 높기 때문이다. 모드를 바꿔도 타깃 KV와 순환 상태는 복사하거나 재계산하지 않고 그대로 이어 간다. 활성 디코더가 있으면 배치 AR 포워드 4회마다 프리필 64토큰까지만 허용하는 N4/PF64 리듬을 쓰고, 디코더가 없으면 청크당 256토큰까지 처리한다. 출력 공간도 예약한다. 페이지 크기 256, 프롬프트 길이 p_i, 요청 출력 o_i, 보장 g_out = 8,192에 대해 R_i = ceil((p_i + min(o_i, g_out))/256) 페이지를 잡고, 4레인 정책에서 16,384 출력 토큰까지 허용한다. 이미지는 500ms 이상 기다리면 입장 후보가 되고, 활성 유지 토큰 합이 198,656 위치 비전 게이트를 통과해야 들어간다.

어떻게 쓰나

결과는 24 GiB M4 Pro에서 측정했다. JustFit은 두 요청에 걸쳐 327,680 위치를 동시에 유지해, 평가된 mlx-vlm 베이스라인의 단일 요청 기록 30,720 위치의 10.67배를 달성했다. 단일 요청은 Qwen의 262,144 위치 네이티브 윈도우를 완주하며 중앙값 5.986 tokens/s를 냈고, 세 번의 시행 범위는 5.936~5.987로 중앙값의 0.86% 안에 들었다. 320K B2 시행은 두 요청 모두 전체 출력을 생성하고 같은 풀 최고 수위에 도달했으며 중앙값 합산 9.735 tokens/s(9.732~9.738)를 기록했다. 완전히 콜드인 128K+16K 쌍은 294,912 위치를 10.341 tokens/s로 완료했다.

전제와 한계

고정 32K+6K 워크로드에서는 베이스라인이 가드에 걸려 멈추는 반면, 처음 완주한 TQ4+MTP 구성이 18,225 MiB에서 5.975 tokens/s, 최종 시스템이 15,626 MiB에서 18.284 tokens/s를 냈다. 디코드가 3.06배 빨라지고 중앙값 피크가 2,599 MiB 낮아진 것이다. 프리필 속도는 110.82에서 114.37 tokens/s로 변했다. 컨텍스트에 따른 피크 증가 기울기는 8~24K 구간에서 베이스라인이 1K 입력당 169.9 MiB였는데 JustFit은 8~64K 구간에서 12.5 MiB였다. 192K 이력에서 2헤드 재구성은 단일 레이어 증분 MLX 피크를 3,123.8에서 1,589.3 MiB로 낮추고 지연을 271.220에서 280.897ms로 3.6% 늘렸다. 224K 프리픽스에서는 연속 복사 대신 페이지 런 뷰를 빌려 스냅샷 피크를 3,640에서 227.5 MiB로 줄였고, 쓰기 바이트는 7.63에서 3.82 GB, 저장 시간 중앙값은 2.976에서 1.507초로 줄었다. 이미지 경로는 196,608 입력 텍스트 요청이 생성 중일 때 이미지를 21.636초에 끝냈고, 프로세스 피크 20,852 MiB로 21,000 MiB 가드 아래에 머물렀다. 텍스트 스트림 최대 공백은 1.177초였다. 별도 AIME 2026 평가에서 페이지드 TQ4는 30문제 중 29개를 맞히고 696,834 토큰을 15.04 token-weighted tokens/s로 생성했으며 최대 풋프린트는 19,043 MiB였다. 균일 INT8은 28/30, 14.64 tokens/s였다.

실무적으로 이 논문은 Apple Silicon에서 MLX로 로컬 에이전트를 돌리는 팀에게 직접 쓸모가 있다. 병목이 가중치가 아니라 KV 이력과 단계별 컴포넌트 상주 메모리라는 진단, 그리고 무엇을 언제 내리고 언제 다시 붙일지에 대한 구체적인 정책을 수치와 함께 제시한다. 다만 결과를 읽을 때 전제를 확인해야 한다. 비교 대상인 베이스라인은 최신 upstream 릴리스나 이상적인 FP16 참조 구현이 아니라 역사적인 mlx-vlm 실행 스냅샷이며, 그 실행 매니페스트는 페이지드 KV, 분할 배치 KV, 융합 TQ 재구성을 모두 비활성화한 상태다. 릴리스된 재현 환경은 호스트 제어 iogpu.wired_limit_mb를 22,016 MiB로 설정하고, 용량 실험은 21,000 MiB 샘플링 풋프린트 가드에서 멈추는 fail-closed 정책을 쓴다. 용량 입력이 단어를 반복하고 EOS를 억제하는 그리디 선택으로 요청 출력 길이를 채우는 워크로드라는 점도 감안해야 한다.

저자가 밝힌 한계는 분명하다. 240K 콜드 빌드에 67.7분, 이어지는 16K 생성에 46.0분이 걸려 지연이 실질적 제약으로 남는다. 가장 큰 B2 시행은 샘플링 여유가 47 MiB밖에 없었고, 단일 플랫폼 실행과 250ms 워치독으로는 지속 서비스 신뢰성을 입증하지 못한다. 이미지 실험은 텍스트 요청 하나 옆에 이미지 하나, 출력 512/64로 제한되며 비디오, 다중 이미지, B4 이상과 비전의 조합은 측정 범위 밖이다. 200,704 입력 경계는 여유가 20 MiB뿐이다. 네이티브 윈도우를 넘는 단일 요청 서빙은 모델 구성 변경과 별도 평가가 필요하다. 품질 면에서 TQ4는 원본 KV의 무손실 복원이 아니고, AIME 결과는 확장 추론을 확인할 뿐 전체 윈도우 이해나 저장소 수준 작업 성공, 압축 빈도를 검증하지 않는다. 개발 단계별 비교는 여러 메커니즘과 APC 프로토콜 변경이 섞여 있어 개별 기여를 분리해 귀속시킬 수 없다는 점도 저자가 명시한다.

관련 논문