같은 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이 모두 일치합니다. 설정은 이번에도 각 기계를 맡은 쪽이 그 기계에서 가장 잘 나오는 값으로 골랐고, 아래에 함께 적었습니다.

41.47~41.74 tok/sM5 Ultra 128K 위치 생성
1.4배M4 Max 대비 생성
약 3배M4 Max 대비 추가 prefill
약 21초128K 지점에서 32K 추가 처리 (M4 Max 약 63초)

작업과 설정

작업은 비교 글과 같습니다. 이탈리아어 소설과 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가 꺼진 것이 출력 품질에 어떤 영향을 주는지는 재지 않았습니다.

범위

출력 품질은 비교하지 않았습니다. 세 기계의 결과는 같은 파일과 같은 작업으로 잰 각 기계의 대표 결과이지만, 엔진 빌드와 측정일이 다르고 그 차이가 배율에 들어 있습니다. 전력은 같은 조건으로 재지 않았습니다.