Mac Studio 96GB에서 Qwen3.5-122B 구동하기: 긴 컨텍스트 추론을 가능하게 만든 3가지 버그 수정
Running Qwen3.5-122B on Mac Studio 96GB: Fixed 3 bugs that made long-context inference usable
핵심 요약
Mac Studio에서 Qwen3.5-122B 사용 시 발생하던 긴 컨텍스트 추론 지연 문제를 서빙 스택 버그 수정을 통해 해결함.
- 추론 지연 해결 — 캐시 무효화 버그를 수정하여 프리필 시간을 분 단위에서 초 단위로 단축함.
- qMLX 포크 공개 — Qwen 아키텍처에 최적화된 하이브리드 어텐션 지원을 위해 별도 포크를 제작함.
- 컨텍스트 관리 — SSD 복원 기능을 통해 대규모 컨텍스트에서도 효율적인 추론이 가능하도록 개선함.
- 성능 벤치마크 — 프리필 및 디코드 메트릭을 분리하여 측정할 수 있는 벤치마크 스크립트를 제공함.
다들 안녕,
최근에 M3 Ultra Mac Studio에서 긴 문맥을 다루는 에이전트 코딩을 하려고 DS4 Flash에서 Qwen3.5-122B로 갈아탔거든. 모델 자체는 잘 돌아가는데, 문맥이 이미 '웜(warm)' 상태인데도 후속 메시지 생성 시작까지 3~5분씩 걸리는 '콜드 필(cold fills)' 문제 때문에 아주 골치가 아팠어.
알고 보니 모델 문제가 아니라 내 서빙 스택(rapid-mlx의 qMLX 포크 버전)에 있는 세 가지 버그 때문이더라:
- 프롬프트 불안정: 시스템 프롬프트에 고유 메시지 ID가 들어가 있어서 바이트 단위로 정확히 일치해야 하는 KV 캐시 매칭이 깨졌고, 그 바람에 매 턴마다 전체를 다시 계산하고 있었음.
- 인터럽트 경로: 생성 도중에 끊기면 스트리밍 응답이 제대로 저장되지 않아서 히스토리가 꼬여버림.
- 체크포인트 오염: 백그라운드 라이터가 유효한 체크포인트를 밀어내는 이상한 체크포인트를 생성해서, 시스템이 강제로 데이터를 비우게 만듦.
이거 다 고치니까 프리필(prefill) 시간이 몇 분에서 1초 미만으로 확 줄었어(예를 들어 53k 토큰 캐싱된 상태에서 33개만 프리필함).
이 변경 사항들을 PR로 올리지 않고 포크를 뜬 이유는, 하이브리드 어텐션 최적화가 Qwen에만 특화된 거라 일반적인 업스트림 스택에는 안 맞을 것 같아서야. 앞으로 이 아키텍처에 맞춰서 최적화할수록 qMLX는 계속 독자 노선을 걷게 될 거야.
포크 버전이랑 프리필/디코드 지표를 따로 보여주는 벤치마크 스크립트(bench_qmlx.py)는 오픈소스로 풀었어. 혹시 하이브리드 어텐션 캐싱 쓰면서 비슷한 문제 겪고 있거나, 더 최적화할 아이디어 있는 사람 있으면 공유 좀 해줘.
- 상세 분석: https://mrzk.io/posts/qmlx-maximising-ai-psychosis-minmaxing-mac-studio/
- GitHub (qMLX): https://github.com/marzukia/qMLX
수정: 확실히 해둘 게 있는데, 복구 기능을 쓴다고 해서 딥 컨텍스트 턴이 공짜가 되는 건 아니야. 콜드 프리필 절벽 현상만 없애주는 거지. 아래는 내 딥 컨텍스트 세션 중 하나에서 가져온 예시야:
| Prompt tokens | Restored from SSD | Delta prefilled | Time to first token |
|---|---|---|---|
| 168,440 | 168,373 | 67 | 2.6s |
| 167,859 | 167,727 | 132 | 2.6s |
| 163,140 | 162,764 | 376 | 4.4s |
| 168,332 | 167,912 | 420 | 4.8s |
| 167,478 | 166,667 | 811 | 8.2s |
| 164,400 | 163,206 |

