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에 있습니다.