같은 Qwen3.8 Flash Next를 M5 Ultra·M4 Max·Ryzen AI Max+ 395에서, 128K 생성 41·29·9 tok/s
같은 Qwen3.8 Flash Next UD-Q4_K_XL 파일과 같은 누적 작업으로 M5 Ultra 256GB를 쟀습니다. M4 Max보다 생성 1.4배·prefill 3배, Ryzen AI Max+ 395보다 생성 2.8~4.7배였습니다.
M4 Max와 Ryzen AI Max+ 395 비교 글과 같은 작업을 Mac Studio M5 Ultra(GPU 80코어, 통합 메모리 256GB)에서 쟀습니다. 모델은 세 기계 모두 Unsloth UD-Q4_K_XL 같은 파일이고, 분할 파일 4개의 SHA256이 모두 일치합니다. 설정은 이번에도 각 기계를 맡은 쪽이 그 기계에서 가장 잘 나오는 값으로 골랐고, 아래에 함께 적었습니다.
작업과 설정
작업은 비교 글과 같습니다. 이탈리아어 소설과 C++ 코드 원문을 한 세션에서 32K토큰씩 이어 붙여 128K까지 채우고, 단계마다 새로 넣은 32K의 prefill과 이어지는 256토큰 생성 속도를 HTTP 스트리밍으로 쟀습니다. greedy, seed 42, 원문마다 새 서버 프로세스로 3회입니다. M5 Ultra는 48단계가 모두 실패나 재측정 없이 유효했습니다.
| M5 Ultra | M4 Max | Ryzen AI Max+ 395 | |
|---|---|---|---|
| 엔진 | llama.cpp b11921 7a2e5ab |
llama.cpp b11617 1431019 |
llama.cpp e613ef2 |
| backend | Metal | Metal | Vulkan/RADV |
| KV / batch / ubatch | f16 / 2048 / 2048 | Q8_0 / 2048 / 2048 | Q8_0 / 2048 / 512 |
| PLE 로딩 | 메모리 상주 (lazy off) | lazy on | lazy off |
| MTP | off | off | off |
| 측정일 | 10월 27일 | 10월 15~16일 | 9월 30일 |
세 기계의 엔진 빌드와 측정일이 모두 다릅니다. 공통 벤치마크 명세는 설정을 맞추라고 하지 않고, 각 기계의 대표 결과를 쓰되 설정을 함께 밝히라고 합니다.
추가 prefill (tok/s)
| 누적 문맥 | M5 Ultra 소설 | M4 Max 소설 | 395 소설 | M5 Ultra 코드 | M4 Max 코드 | 395 코드 |
|---|---|---|---|---|---|---|
| 32K | 1863.41 | 560.31 | 297.12 | 1856.33 | 553.78 | 262.44 |
| 64K | 1712.63 | 543.53 | 258.04 | 1732.45 | 537.40 | 216.96 |
| 96K | 1618.76 | 532.50 | 211.12 | 1629.57 | 526.04 | 217.55 |
| 128K | 1520.95 | 520.47 | 173.56 | 1540.06 | 515.19 | 187.42 |
M5 Ultra는 M4 Max의 2.92~3.35배, Ryzen AI Max+ 395의 6.27~8.76배였습니다. 128K 지점에서 32K를 더 넣는 데 M5 Ultra는 약 21초, M4 Max는 약 63초, Ryzen AI Max+ 395는 약 175~189초가 걸립니다.
생성 (tok/s)
| 누적 문맥 | M5 Ultra 소설 | M4 Max 소설 | 395 소설 | M5 Ultra 코드 | M4 Max 코드 | 395 코드 |
|---|---|---|---|---|---|---|
| 32K | 46.11 | 32.94 | 16.44 | 45.90 | 32.51 | 16.56 |
| 64K | 44.96 | 31.62 | 13.31 | 44.72 | 31.81 | 12.89 |
| 96K | 41.41 | 30.23 | 10.73 | 41.17 | 30.07 | 10.73 |
| 128K | 41.47 | 29.15 | 8.81 | 41.74 | 29.24 | 9.19 |
M5 Ultra는 M4 Max의 1.37~1.43배였고, 이 배율은 문맥 깊이와 상관없이 거의 일정했습니다. Ryzen AI Max+ 395와는 32K에서 2.8배, 128K에서 4.5~4.7배로 깊어질수록 차이가 커졌습니다. 두 Mac은 32K에서 128K까지 생성이 10% 안팎 줄었고, Ryzen AI Max+ 395는 절반 가까이 줄었기 때문입니다.
설정 차이가 배율에 얼마나 들어 있나
M5 Ultra 쪽은 대표 설정을 고르려고 소설로 한 번씩 몇 가지 조합을 재 봤습니다. 그중 M4 Max와 똑같이 KV Q8_0에 PLE lazy on으로 두었을 때도 128K에서 prefill 1462.96, 생성 41.40 tok/s가 나왔습니다. 대표 설정(1520.95 / 41.47)과 큰 차이가 없으니, M4 Max와의 차이 대부분은 KV나 PLE 설정에서 오지 않습니다. 다만 엔진 버전(b11921과 b11617) 차이는 따로 가려 보지 않았습니다.
M5 Ultra 결과에서 본 것
- 같은 설정, 같은 입력, greedy인데 회차마다 출력이 달랐습니다. 소설은 32K 첫 단계부터, 코드는 64K부터 출력 토큰의 해시가 회차마다 다릅니다. 같은 날 같은 설정으로 잰 아래 IQ4_XS 파일은 모든 단계에서 회차 간 출력이 같았습니다. 원인은 확인하지 못했습니다.
- 서버 로그를 보면 이 모델의 희소 어텐션(QSA) 층에서 top-k 마스크 연산이 Metal에 없어 CPU에서 돕니다. 이것이 속도에 얼마나 영향을 주는지는 재지 않았습니다.
- 32K를 더 넣을 때마다 처리 시간이 약 1.3초씩만 늘었습니다(32K 단계 17.6초, 128K 단계 21.6초). QSA가 긴 문맥의 attention 비용을 줄여 주는 덕분으로 보입니다.
- 측정하는 동안 같은 SSD에 다른 모델 다운로드가 초당 약 13MB씩 쓰고 있었고, 화면 공유가 켜져 있었습니다. swap은 측정 내내 변하지 않았습니다.
QSA가 꺼진 채로 도는 IQ4_XS 파일
M5 Ultra에서 같은 설정으로 Uncensored IQ4_XS 파일도 쟀습니다. 이 파일은 희소 어텐션 설정 값(compress_ratios)이 48층 모두 0입니다. Unsloth UD-Q4_K_XL은 4층마다 4가 들어 있습니다. llama.cpp는 이 값이 0보다 큰 층이 있을 때만 QSA를 만들기 때문에, 이 파일은 모든 층이 전체 문맥에 일반 attention을 합니다.
| IQ4_XS 소설 | UD-Q4_K_XL 소설 | IQ4_XS 코드 | UD-Q4_K_XL 코드 | |
|---|---|---|---|---|
| 32K prefill | 1969.32 | 1863.41 | 1967.76 | 1856.33 |
| 32K 생성 | 51.70 | 46.11 | 51.35 | 45.90 |
| 128K prefill | 806.20 | 1520.95 | 802.86 | 1540.06 |
| 128K 생성 | 38.49 | 41.47 | 38.48 | 41.74 |
32K에서는 IQ4_XS가 prefill 1.06배, 생성 1.12배로 더 빠르지만, 128K에서는 prefill이 0.52~0.53배, 생성이 0.92~0.93배로 뒤집힙니다. 32K를 더 넣을 때마다 처리 시간이 약 8초씩(16.6, 24.5, 32.5, 40.7초) 늘었기 때문입니다. UD-Q4_K_XL의 1.3초와 대조적입니다.
원래 Qwen3.8 Flash Next의 설정에는 이 값이 4로 들어 있습니다. 이 IQ4_XS 파일에서 왜 0이 됐는지는 확인하지 못했습니다(원본 uncensored 저장소에 접근할 수 없었습니다). 같은 파일을 쓴 Strata 엔진 글에서 llama.cpp와 Strata가 attention을 다르게 계산했을 수 있다고 적은 것도 이 값 때문입니다. QSA가 꺼진 것이 출력 품질에 어떤 영향을 주는지는 재지 않았습니다.
범위
출력 품질은 비교하지 않았습니다. 세 기계의 결과는 같은 파일과 같은 작업으로 잰 각 기계의 대표 결과이지만, 엔진 빌드와 측정일이 다르고 그 차이가 배율에 들어 있습니다. 전력은 같은 조건으로 재지 않았습니다.