M3 Ultra에서 60tps / 550tps를 달성한 GLM 5.3 Flash Q4
GLM 5.3 Flash Q4 @ 60tps / 550tps on M3 Ultra
핵심 요약
M3 Ultra 환경에서 커널 최적화와 병렬 처리 개선을 통해 GLM 5.3 Flash 모델의 추론 및 프리필 속도를 대폭 향상함.
- 성능 최적화 — Metal 커널 융합과 병렬 스캔 도입으로 추론 속도 및 대역폭 효율 극대화함.
- 프리필 가속 — 데이터 배치 처리와 가중치 재사용으로 프리필 속도를 50% 개선함.
- 품질 유지 — 양자화 전략을 통해 속도 향상에도 불구하고 원본 모델과 동일한 출력 품질을 보장함.
- 하드웨어 종속성 — M3 Ultra의 메모리 및 GPU 아키텍처에 특화된 최적화로 설계됨.
나 dwarfstar 팬이라 glm 5.3 flash 꽤 좋아했는데, 실사용하려면 속도가 훨씬 더 빨라야겠더라고. 스크린샷 보면 claude code harness 써서 200k 깊이에서 툴 콜 존나게 날리면서 평균 38tps 뽑아내는 거 보이지? 제목에 60tps라고 적어놓은 거 맞고, SQL 짜달라고 하면 그 정도 속도 바로 나온다.
https://github.com/IngeniousIdiocy/ds4/blob/glm53-m3ultra/README.md#glm53_m3ultra
기존 ds4는 M3 Ultra 메모리 대역폭의 59% 정도 수준으로 GLM-5.3-Flash를 단일 스트림 직렬 디코딩했거든. 우린 이걸 80%까지 끌어올리는 걸 목표로 잡았어. 큰 가중치 스트리밍 커널들은 이미 효율적이었는데, 그 사이에 낀 자잘한 커널 수십 개가 문제였음. GPU는 놀고 있는데 커널마다 레이턴시 잡아먹고 있었거든. 그래서 이 작업들을 더 큰 디스패치로 합쳐버리고 파이프라인 대기 시간 만드는 불필요한 패스들을 다 날려버렸다. 결과는? 짧은 컨텍스트에서 29 → 40 t/s, 62k에서 24 → 38 t/s로 올랐고, 토큰당 Metal 커널 수도 줄어서 측정된 대역폭 한계치의 81%까지 뽑아냄.
그다음엔 컨텍스트 길어질 때 생기는 병목 현상을 조졌지. 이 모델의 비싼 어텐션 연산은 62k든 300k든 대략 2,048개의 선택된 위치에서 돌아가. 문제는 히스토리가 길어질수록 그 위치를 찾는 작업이 늘어난다는 거지. 기존 방식은 후보 리스트가 커질수록 정렬하고 병합하는 단계에서 GPU를 거의 안 썼거든. 이걸 병렬 스캔 방식으로 바꿔서 후보군을 미리 좁혀놓고, 남은 소수의 리스트만 정렬하게 만들었어. 애매한 케이스는 원래 알고리즘이 처리하게 뒀고. 이렇게 하니까 생성 토큰당 1ms 정도를 벌었네. 선택된 위치도, 순서도, 결과물도 다 똑같음. 300k에서 테스트해보니 순정은 21.6 t/s인데 우린 37.4 t/s 찍더라. 컨텍스트가 깊어지면 검색 비용은 늘어나지만, 비싼 어텐션 연산 자체가 곱절로 늘어나진 않게 된 거지.
Prefill은 62k에서 366 t/s 정도로 시작했어. 큰 행렬 커널들은 이미 효율적이었는데, 가중치를 계속 다시 언패킹하고 데이터를 쪼개서 가져오고 커널끼리 중간 결과물 주고받느라 시간을 다 버리고 있었음. 그래서 작업을 더 묶고, 준비된 가중치 재사용하고, 로드 폭 넓히고, 같은 데이터에 대한 패스들을 합쳐버렸다. 결과는 366 → 550 t/s. 같은 가중치로 50% 성능 향상을 이뤄냈고, 전체 파이프라인을 칩의 측정된 matmul 한계치의 51%에서 72%까지 끌어올림. 62k 처리할 때 걸리던 170초가 113초로 줄었다. 에이전트가 컨텍스트 압축하고 다시 읽을 때마다 기다려야 했던 그 시간 말이야.
서버는 —dflash로 drafter 파일을 넘기지 않으면 기본적으로 직렬로 돌아가. drafter 빌드 레시피는 레포에 있고. drafter에는 직렬 처리 속도랑 비교해서 비용이 더 들면 알아서 빠지는 윈도우 컨트롤러 기반의 승인 정책이 들어있어. 추론 토큰은 직렬로 디코딩하고. 32개 요청 들어오는 에이전트 세션에서는 직렬 대비 4% 정도 빠르고, SQL이나 JSON 같은 구조화된 출력에서는 20~50%까지 빨라짐. 일반 문장 쓸 때는 그냥 꺼져서 1% 정도 비용만 추가되고. 모든 테스트 케이스에서 직렬 디코딩이랑 결과물 바이트 단위까지 똑같음.
정확도? ds4 릴리즈 QA용 100개 프롬프트 레퍼런스 세트로 돌려봤는데, 순정은 FP8 레퍼런스 대비 평균 NLL 0.300804 나왔거든. 이번 브랜치는 0.300766 나왔고 첫 토큰 일치율도 90/100으로 똑같아. 속도 올린다고 품질 깎아먹은 거 하나도 없다는 소리임.
이 브랜치는 M3 Ultra 전용이야. 최적화가 이 칩의 특수한 동작 방식에 맞춰져 있거든. 듀얼 다이 메모리 동작, 시스템 레벨 캐시, 코어별 점유율이랑 대역폭, 그리고 Metal이 80개 GPU 코어에 디스패치랑 스레드그룹을 어떻게 스케줄링하는지까지 다 고려했으니까. 특정 머신에서 특정 모델의 실제 실행을 최적화했고, 특정 가중치(Q4) 세트로 커널 최적화가 전체 디코딩이나 프리필에서도 제대로 먹히는지 다 확인했어.


