128GB 두 대 비교, M4 Max와 Ryzen AI Max+ 395에서 Qwen3.8과 DeepSeek V4.1
통합 메모리 128GB인 Mac Studio(M4 Max)와 EVO-X2(Ryzen AI Max+ 395)에서 같은 Qwen3.8 가중치를 각 하드웨어 담당자가 고른 대표 설정으로 같은 작업에 돌렸습니다. M4 Max가 prefill 1.9~3.0배, 생성 2.0~3.3배 빨랐습니다.
2026-10-16 갱신: M4 Max 담당이 더 빠른 설정을 찾아 대표 결과를 새로 지정했습니다(llama.cpp b11617, ubatch 2048). 측정 오류를 고친 것이 아니라 M4 Max 쪽 대표가 바뀐 것이고, EVO-X2 대표는 9월 30일 결과 그대로입니다. 그래서 차이가 prefill 1.6~2.0배, 생성 1.6~1.7배에서 prefill 1.9~3.0배, 생성 2.0~3.3배로 커졌습니다.
2026-10-04 수정: 처음 올린 글은 측정 방식과 설정이 서로 다른 기록을 섞어 Qwen 생성 속도 차이를 1.8~2.4배로 적었습니다. 공통 벤치마크 명세에 따라 각 하드웨어 담당자가 대표로 지정한 결과로 바꿨습니다.
통합 메모리가 128GB인 Mac Studio(Apple M4 Max)와 GMKtec EVO-X2(AMD Ryzen AI Max+ 395)에서 같은 Qwen3.8 Flash Next 가중치를 돌렸습니다. 두 기계 모두 같은 작업을 했고, 설정은 각 하드웨어를 맡은 쪽이 그 기계에서 가장 잘 나오는 값으로 골랐습니다. 이기종 하드웨어는 최적 설정이 서로 다르기 때문에 설정을 억지로 맞추지 않았고, 대신 무엇을 썼는지 아래에 함께 적었습니다. 같은 작업에 M5 Ultra 256GB를 더한 결과는 세 기계 비교 글에 있습니다.
결과는 M4 Max가 prefill에서 1.9~3.0배, 생성에서 2.0~3.3배 빨랐습니다. 두 값 모두 문맥이 깊어질수록 차이가 커졌습니다. M4 Max는 128K까지 가도 생성 속도가 조금밖에 떨어지지 않았고, EVO-X2는 32K 대비 절반 안팎으로 떨어졌습니다.
작업
두 기계가 똑같이 한 일입니다.
- 가중치: Unsloth
UD-Q4_K_XL, 분할 파일 4개의 SHA256이 양쪽에서 일치 - 입력: 이탈리아어 소설 원문과 C++ 코드, 같은 파일
- 방식: 한 세션에서 원문을 32K토큰씩 이어 붙여 32K, 64K, 96K, 128K까지 채우고, 단계마다 새로 넣은 32K의 prefill 속도와 이어서 256토큰을 생성하는 속도를 잼. 앞 문맥은 캐시에 남긴 채 입력이 더해지는 실제 대화나 agent 작업과 같은 모양
- 생성: greedy, seed 42, reasoning off
- 반복: 소설과 코드 각각 새 프로세스로 3회
각 기계가 고른 설정
| M4 Max | Ryzen AI Max+ 395 | |
|---|---|---|
| 엔진 | llama.cpp b11617 14310190 (공식 배포) |
upstream llama.cpp e613ef2 |
| backend | Metal | Vulkan/RADV |
| KV / batch / ubatch | Q8_0 / 2048 / 2048 | Q8_0 / 2048 / 512 |
| MTP | off | off |
| 모델 로딩 | mmap, PLE lazy on, 외장 SSD | mmap, lazy off, 내장 NVMe |
| context | 135,168, 슬롯 1 | 135,168, 슬롯 1 |
| 측정일 | 10월 15~16일 (코드 3회가 이틀에 걸침) | 9월 30일 |
ubatch처럼 두 기계의 설정이 다른 항목이 있습니다. 명세가 설정을 맞추라고 하지 않고, 각자 고른 설정을 함께 밝히라고 하기 때문입니다. 대표 결과의 측정일도 2주 넘게 차이가 납니다.
EVO-X2는 원래 운영하던 HIP(ROCm) 빌드도 같은 작업으로 쟀는데, Vulkan보다 크게 느렸습니다. 128K 생성이 HIP 4.42~4.52 tok/s, Vulkan 8.81~9.19 tok/s였습니다. 그래서 담당 쪽은 Vulkan을 대표로 골랐습니다.
추가 prefill
| 누적 문맥 | M4 Max 소설 | 395 소설 | M4 Max 코드 | 395 코드 |
|---|---|---|---|---|
| 32K | 560.31 | 297.12 | 553.78 | 262.44 |
| 64K | 543.53 | 258.04 | 537.40 | 216.96 |
| 96K | 532.50 | 211.12 | 526.04 | 217.55 |
| 128K | 520.47 | 173.56 | 515.19 | 187.42 |
단위는 tok/s, 3회 평균입니다. M4 Max가 1.89~3.00배 빨랐습니다. M4 Max는 32K에서 128K로 가는 동안 prefill이 7% 정도만 줄었고, EVO-X2는 소설에서 40% 넘게 줄어 128K 소설에서는 3배 차이가 됐습니다. 128K 지점에서 32K를 더 넣는 데 M4 Max는 약 63~64초, EVO-X2는 약 175~189초가 걸렸습니다.
생성
| 누적 문맥 | M4 Max 소설 | 395 소설 | M4 Max 코드 | 395 코드 |
|---|---|---|---|---|
| 32K | 32.94 | 16.44 | 32.51 | 16.56 |
| 64K | 31.62 | 13.31 | 31.81 | 12.89 |
| 96K | 30.23 | 10.73 | 30.07 | 10.73 |
| 128K | 29.15 | 8.81 | 29.24 | 9.19 |
M4 Max가 1.96~3.31배 빨랐습니다. M4 Max의 생성 속도는 32K에서 128K까지 10~12% 줄었고, EVO-X2는 같은 구간에서 45% 안팎 줄었습니다. M4 Max의 표준편차는 생성 0.07~0.41, prefill 0.64~3.27 tok/s로 작았습니다.
M4 Max 수치가 바뀌어 온 과정
이 글의 M4 Max 값은 두 번 바뀌었습니다.
- 9월 27일: 같은 작업이었지만 다른 작업이 메모리를 잡고 있어서, 소설 1회차가 2·3회차의 절반 정도로 흔들렸습니다. 32K 생성이 16.96 tok/s(편차 ±7.85)였습니다.
- 9월 30일: 큰 상주 앱을 정리하고 qwen4exp/mtp 포크
6fcaa16, ubatch 512로 다시 쟀습니다. 128K 생성이 소설 15.25, 코드 15.51 tok/s였고, 10월 16일까지 이 글의 대표값이었습니다. - 10월 15~16일: 담당이 공식 배포 llama.cpp b11617로 옮기고 ubatch를 2048로 올린 구성으로 대표를 바꿨습니다. mmap과 lazy 로딩은 9월 30일과 같습니다. 128K 생성이 29.15/29.24 tok/s로 9월 30일의 약 1.9배입니다.
마지막 변화는 엔진, ubatch, 측정일이 한꺼번에 바뀐 결과입니다. 위키도 이 중 무엇이 얼마나 기여했는지는 가려 내지 않았습니다. 같은 가중치와 같은 작업에서 엔진과 설정을 바꾼 것만으로 이만큼 차이가 났다는 점이, 이기종 비교에서 설정을 함께 밝혀야 하는 이유이기도 합니다.
같은 기계에서 확인된 더 빠른 구성
위 비교는 같은 가중치 파일끼리라서 공정하지만, 각 기계가 낼 수 있는 최고치는 아닙니다. 다른 모델 파일이나 런타임에서 더 빠른 결과가 나왔는데, 가중치가 달라 위 표에는 넣지 않았습니다.
| 128K 생성 | 소설 | 코드 |
|---|---|---|
M4 Max, oMLX 0.7.0 + MLX oQ4e 가중치, MTP off (3회) |
55.66 tok/s | 56.96 tok/s |
EVO-X2, Vulkan + Uncensored IQ4_XS 가중치 (3회) |
23.08 tok/s | 23.15 tok/s |
M4 Max의 oMLX 측정은 별도 글에 정리했습니다. 두 구성은 가중치와 양자화가 서로 달라서 이 둘끼리의 배율도 하드웨어 차이로 읽지 않습니다. EVO-X2의 IQ4_XS 파일은 희소 어텐션(QSA) 설정 값이 모두 0이라 llama.cpp에서 QSA 없이 돕니다. 짧은 문맥에서는 빠르지만 문맥이 길수록 prefill이 크게 느려지는 파일입니다(세 기계 비교 글 참고).
DeepSeek V4.1 Flash: 이전 측정 (참고)
DeepSeek V4.1은 지금 공통 작업으로 잴 수가 없습니다. upstream llama.cpp에는 이 모델의 구조(deepseek41)가 아직 없고, 두 기계가 쓰는 ds4 서버에는 토큰 ID 배열을 그대로 받는 API가 없어 이 작업의 요청 방식을 지킬 수 없습니다. 10월 25일 M4 Max는 서버를 거치지 않고 엔진의 C API를 직접 불러, 새 1017 가중치로 같은 누적 작업을 3회씩 쟀습니다(별도 글). 측정 경계가 다르고 EVO-X2 쪽 결과도 아직 없어서 비교에는 넣지 않았습니다. 아래는 두 기계가 서로 다른 방식으로 잰 이전 기록이고, 생성 속도만 대략 비교합니다.
| M4 Max | Ryzen AI Max+ 395 | |
|---|---|---|
| 엔진 | ds4 main bd66c40 + 분리 배치 패치, Metal |
ds4 ROCm PR #1036 (미병합) |
| 배치 | 가중치 152GiB는 내장 SSD, Engram 189GiB는 외장 SSD | 전부 내장 NVMe에서 스트리밍 |
| 측정 | 한 세션에서 32K씩 늘려 가며 128토큰 생성, 1회 | 길이마다 새 프로세스로 전체 prefill, 256토큰 생성, 3회 |
| 문맥 | M4 Max 생성 | 395 생성 |
|---|---|---|
| 32K | 11.22~11.81 tok/s | 7.90 tok/s |
| 64K | 10.79 tok/s | 8.16 tok/s |
| 96K | 11.09 tok/s | 8.04 tok/s |
| 128K | 10.77 tok/s | 6.20 tok/s |
M4 Max의 32K 값은 짧은 인사로 워밍업한 뒤 잰 값이고, 워밍업 없이 처음 잰 값은 1.47 tok/s였습니다. EVO-X2의 128K 평균 6.20은 7.91, 2.77, 7.91의 평균입니다. prefill은 측정 방식이 달라 비교하지 않았습니다.
정리하면
같은 가중치, 같은 작업에서 M4 Max가 prefill 1.9~3.0배, 생성 2.0~3.3배 빨랐습니다. 긴 문맥에 입력을 계속 더하는 작업일수록 차이가 커집니다. 두 대표 결과는 측정일과 일부 설정이 다르고, 그 내용은 위 설정 표에 적었습니다. 모델 파일과 런타임까지 각자 고를 수 있다면 두 기계 모두 위 표보다 빨라지고, 그 경우의 차이는 별도 측정으로 봐야 합니다.
전력은 같은 조건으로 재지 않았고, 출력 품질도 비교하지 않았습니다. greedy에 seed를 고정해도 양쪽 모두 회차마다 출력 토큰이 조금씩 달랐습니다.
각 기계의 다른 측정은 Qwen3.8 upstream 재측정, DeepSeek V4.1 EVO-X2, DeepSeek V4.1 M4 Max에 있습니다.