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 Flash Next와 DeepSeek V4.1 Flash를 각자 가장 잘 나오는 구성으로 돌려 입력 길이별로 비교했습니다.

통합 메모리가 128GB인 기계 두 대에서 같은 모델 두 개를 돌렸습니다. 한 대는 Mac Studio(Apple M4 Max), 다른 한 대는 GMKtec EVO-X2(AMD Ryzen AI Max+ 395)입니다. 모델은 Qwen3.8 Flash Next와 DeepSeek V4.1 Flash입니다.

두 기계의 설정을 똑같이 맞추지는 않았습니다. 기계마다 잘 돌아가는 엔진과 옵션이 다르기 때문에, 각자 가장 좋았던 구성으로 돌리고 무엇이 달랐는지를 표에 적었습니다. 알고 싶었던 것은 "같은 128GB라면 어느 쪽이 어떤 입력 길이에서 실제로 쓸 만한가"였습니다.

결과만 먼저 말하면, 두 모델 모두 생성 속도는 M4 Max가 빨랐고 차이는 긴 입력일수록 커졌습니다. 입력을 읽어 들이는 속도(prefill)는 Qwen에서 M4 Max가 조금 빨랐고, DeepSeek V4.1은 측정 방식이 달라 직접 비교하지 않았습니다.

두 기계

Mac Studio (M4 Max) EVO-X2 (Ryzen AI Max+ 395)
메모리 통합 메모리 128GiB 통합 메모리 128GB (OS에서 122GiB)
메모리 대역폭 (공칭) 546GB/s 256GB/s
GPU 스택 Metal ROCm 10 / HIP (gfx1151)
저장장치 내장 512GB + USB4 외장 2TB 내장 NVMe

메모리 대역폭은 제조사 공칭값입니다. 생성 단계는 토큰 하나를 만들 때마다 가중치를 메모리에서 읽어야 해서 대역폭의 영향을 크게 받습니다. 아래에서 보는 생성 속도 차이의 상당 부분이 여기서 온다고 보지만, 따로 분리해서 재지는 않았습니다.

Qwen3.8 Flash Next

양쪽 모두 Unsloth UD-Q4_K_XL 가중치를 llama.cpp로 돌렸습니다. 차이는 아래와 같습니다.

M4 Max Ryzen AI Max+ 395
llama.cpp qwen4exp/mtp 6fcaa16, Metal 7ceed873, HIP
MTP (speculative) 켬, CPU draft 2토큰 (Q8_0 MTP head) 끔
KV 64K까지 F16, 96K부터 Q8_0 Q8_0
측정 소설·코드 각 2회, 요청마다 전체 prefill, 256토큰 생성 표식 찾기 2회, 256토큰 고정 생성

EVO-X2에서 MTP를 끈 것은 이전 측정에서 코드는 54% 빨라졌지만 한국어 소설은 37% 느려졌기 때문입니다. M4 Max에서는 CPU draft 방식으로 켰을 때 8K 기준 평균 39.40 tok/s로 끈 상태(31.87~32.09)보다 빨랐고, 소설도 38.29 tok/s로 느려지지 않았습니다. 같은 MTP라도 기계와 draft 방식에 따라 결과가 달랐습니다.

입력 길이별 결과

EVO-X2의 "첫 출력까지"는 해당 길이 입력을 처음 처리하는 데 걸린 시간입니다. 128K 행은 약 129K토큰을 한 번 넣은 단일 사례로, 첫 출력까지는 처리량 209.04 tok/s에서 계산했고 생성 7.25 tok/s는 출력 길이가 다른 참고값입니다.

입력 M4 Max 첫 출력까지 395 첫 출력까지 M4 Max 생성 395 생성
8K 16.10초 38.96 tok/s
32K 77.52초 92.52초 30.31 tok/s 16.52 tok/s
64K 209.53초 230.51초 15.14 tok/s 11.04 tok/s
96K 360.34초 411.88초 19.79 tok/s 8.59 tok/s
128K 560.80초 약 617초 17.63 tok/s 7.25 tok/s

생성은 M4 Max가 32K에서 1.8배, 96K에서 2.3배, 128K에서 2.4배 빨랐습니다. 첫 출력까지의 시간은 M4 Max가 9~16% 짧았습니다. 짧은 입력의 prefill만 보면 EVO-X2도 뒤지지 않습니다. native bench 기준 pp4096 465.52 tok/s로, M4 Max의 8K prefill 511.69 tok/s와 비슷한 수준입니다.

M4 Max의 64K 생성(15.14)이 96K(19.79)보다 낮은 것은 설정이 바뀐 탓입니다. 96K부터는 F16 KV로 메모리가 모자라 Q8_0 KV와 ubatch 512로 바꿨고, 이 설정에서 생성이 더 빨랐습니다. 문맥이 길어져서 빨라진 것이 아닙니다.

M4 Max에서도 메모리는 빠듯했습니다. GPU에 MTP draft를 올리거나 132K 문맥을 F16 KV로 한꺼번에 잡으면 Metal 메모리 부족으로 실패했고, 입력 길이에 1024를 더한 만큼만 할당하는 방식으로 끝까지 잴 수 있었습니다.

DeepSeek V4.1 Flash

340.6GiB짜리 Q2 모델이라 두 기계 모두 메모리에 다 들어가지 않고, SSD에서 필요한 부분을 읽어 오며 돌립니다. 그 방식이 기계마다 다릅니다.

M4 Max Ryzen AI Max+ 395
엔진 ds4 main bd66c40 + 분리 배치 패치, Metal ds4 ROCm PR #1036 (미병합)
배치 가중치 152GiB는 내장 SSD, Engram 189GiB는 외장 SSD 전부 내장 NVMe에서 스트리밍
expert 메모리 expert cache 68.50GiB expert budget 80GiB
측정 한 세션에서 32K씩 늘려 가며 128토큰 생성 길이마다 새 프로세스로 전체 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 값은 짧은 인사로 워밍업한 뒤 새 프로세스에서 잰 두 번의 결과입니다. 같은 세션에서 처음 32K를 쟀을 때는 1.47 tok/s가 나왔는데, 워밍업이 안 된 첫 실행으로 보고 이 비교에서는 워밍업 뒤 값을 썼습니다.

생성은 M4 Max가 1.3~1.7배 빨랐습니다. M4 Max는 긴 문맥에서도 11 tok/s 근처를 유지한 반면, EVO-X2는 128K에서 평균 6.20 tok/s로 떨어졌습니다. 이 평균에는 7.91, 2.77, 7.91 세 번의 값이 들어 있고, 2.77이 나온 회차에는 NVMe 읽기 처리량도 함께 떨어져 있었습니다.

prefill은 비교하지 않았습니다. M4 Max 값은 이미 쌓인 KV에 32K를 더 넣을 때의 처리량이고(128K 지점 286.41 tok/s), EVO-X2 값은 매번 처음부터 전체를 넣은 평균(128K 273.93 tok/s, 약 478초)이라 같은 것을 잰 숫자가 아닙니다.

M4 Max에서는 upstream의 Engram 병렬 읽기를 옮겨 와 8K 생성이 약 5.7% 더 빨라진 것도 확인했습니다(13.73~13.76에서 14.52~14.54 tok/s). 운영 빌드에는 아직 넣지 않았습니다.

어느 쪽을 어디에 쓰나

두 모델 모두, 특히 긴 문맥에서 답을 받아 보는 속도는 M4 Max가 확실히 앞섭니다. Qwen을 32K 안쪽에서 쓰면 M4 Max는 초당 30토큰, EVO-X2는 16토큰 정도라 대화나 코딩 보조에서 체감 차이가 큽니다.

EVO-X2는 짧은 입력의 prefill이 M4 Max와 비슷해서, 긴 출력보다 입력을 많이 읽고 짧게 답하는 작업에서는 격차가 줄어듭니다. 두 기계 모두 DeepSeek V4.1 같은 300GiB급 모델을 SSD 스트리밍으로 돌릴 수 있다는 점도 확인했습니다. 다만 EVO-X2 쪽은 아직 병합되지 않은 PR에 기대고 있습니다.

측정하지 않은 것도 적어 둡니다. 두 기계의 전력은 같은 조건으로 재지 않았고, 모델 출력의 품질도 비교하지 않았습니다. Qwen은 양쪽 모두 같은 가중치를 썼지만 KV 정밀도와 MTP 설정이 달라서, 출력이 완전히 같다고 보지 않습니다.

각 기계의 개별 측정은 Qwen3.8 upstream 재측정, DeepSeek V4.1 EVO-X2, DeepSeek V4.1 M4 Max에 있습니다.