M1 Max 64GB vs M4 Mac mini 24GB, 로컬 LLM 직접 돌려봤다 — MLX 실측 결과
프로그래밍 이야기/Mac에서 로컬 AI 또는 LLM 활용하기 2026. 10. 27. 15:24LOCAL AI ON MAC · 실측편
결론부터 말하면 5년 된 M1 Max 64GB가 모든 테스트에서 M4 Mac mini 24GB보다 빨랐다. 생성 속도는 2.0~2.35배, Prompt 처리 속도는 1.3~1.5배였다.
그리고 예상하지 못한 결과도 하나 나왔다. 24GB 맥미니에서 30B 모델이 기본 설정으로는 아예 실행되지 않았고, 설정을 바꾸자 8B 모델보다 2배 빠르게 돌았다.
216번 글에서 남긴 질문
이전 글에서 공식 사양과 공개 벤치마크로 M1 Max, M4, M6, M5 Pro를 비교했다. 그때 남긴 질문은 하나였다.
최신 CPU의 M4와 400GB/s 대역폭의 M1 Max, 로컬 LLM에서는 누가 빠를까?
이번에는 내가 가진 두 Mac에서 같은 MLX 모델을 같은 조건으로 직접 돌려봤다.
테스트 환경
MLX와 mlx-lm 버전은 두 장비 모두 같게 맞췄다. macOS는 버전이 다르다.
| 항목 | M4 Mac mini | M1 Max MacBook Pro |
|---|---|---|
| 출시 | 2024 | 2021 |
| CPU / GPU | 10코어 / 10코어 | 10코어 / 32코어 |
| 통합 메모리 | 24GB | 64GB |
| 메모리 대역폭 | 120GB/s | 400GB/s |
| macOS | 15.6.1 (24G90) | 26.6.2 (25G83) |
| MLX | 0.32.4 | 0.32.4 |
| mlx-lm | 0.32.2 | 0.32.2 |
GPU 코어 수는 system_profiler SPDisplaysDataType | grep Cores로 확인했다. M1 Max는 24코어 GPU 모델도 있으니, Prompt 처리 결과는 32코어 기준이라는 점을 감안해야 한다.
테스트 방법
측정은 mlx-lm에 들어 있는 벤치마크 명령 하나로 통일했다.
mlx_lm.benchmark --model <모델> -p 2048 -g 128
- 2,048토큰 길이의 프롬프트를 처리하고 128토큰을 생성한다.
- 워밍업 1회 후 5회 측정해 평균을 낸다.
- 결과로 Prompt 처리 속도(prompt_tps), 생성 속도(generation_tps), 최대 메모리 사용량(peak_memory)이 나온다.
mlx-lm은 uv tool install mlx-lm으로 두 Mac에 똑같이 설치했다. 모델은 크기와 구조가 다른 세 가지를 골랐다. 모두 4bit 양자화 모델이다.
| 모델 | 구조 | 고른 이유 |
|---|---|---|
| Qwen3-8B | Dense | 두 장비 모두 여유 있는 크기 |
| Qwen3-14B | Dense | 내가 맥미니에서 실제로 쓰는 크기 |
| Qwen3-30B-A3B-Instruct-2507 | MoE (활성 약 3B) | 24GB에서 한계에 걸리는 크기 |
맥북프로는 전원을 연결했고, 측정 중에는 다른 앱을 모두 종료했다.
결과
세 모델 모두 M1 Max가 빨랐다. 단위는 초당 토큰 수(tok/s)이고, 5회 측정 평균이다.
| 모델 | 장비 | Prompt 처리 (tok/s) | 생성 (tok/s) | 최대 메모리 |
|---|---|---|---|---|
| Qwen3-8B | M4 24GB | 232.9 | 21.5 | 5.5GB |
| Qwen3-8B | M1 Max 64GB | 335.6 | 50.4 | 5.6GB |
| Qwen3-14B | M4 24GB | 123.8 | 12.4 | 9.3GB |
| Qwen3-14B | M1 Max 64GB | 160.9 | 25.0 | 9.3GB |
| Qwen3-30B-A3B | M4 24GB (기본 설정) | 실행 실패 | 실행 실패 | - |
| Qwen3-30B-A3B | M4 24GB (GPU 한도 20GB) | 464.7 | 42.4 | 18.0GB |
| Qwen3-30B-A3B | M1 Max 64GB (기본 설정) | 695.8 | 64.6 | 18.1GB |
| 모델 | 생성 속도 차이 | Prompt 처리 속도 차이 |
|---|---|---|
| Qwen3-8B | M1 Max가 2.35배 | M1 Max가 1.44배 |
| Qwen3-14B | M1 Max가 2.02배 | M1 Max가 1.30배 |
| Qwen3-30B-A3B | M1 Max가 1.52배 | M1 Max가 1.50배 |
30B는 M4의 GPU 한도를 올린 결과와 비교했다.
생성 속도: M1 Max가 2배, 하지만 대역폭 차이만큼은 아니다
Dense 모델의 생성 속도는 M1 Max가 2.0~2.35배 빨랐다. 216번 글에서 예상한 대로 메모리 대역폭이 생성 속도를 좌우한다는 점이 실측으로 확인됐다.
토큰을 하나 만들 때마다 모델 가중치를 메모리에서 한 번씩 읽어야 한다. 그래서 단순하게 계산하면 생성 속도의 상한은 대역폭 ÷ 모델 크기가 된다.
| 모델 (파일 크기) | 장비 | 이론상 상한 | 실측 | 대역폭 활용률 |
|---|---|---|---|---|
| Qwen3-8B (4.6GB) | M4 (120GB/s) | 약 26 tok/s | 21.5 tok/s | 약 82% |
| Qwen3-8B (4.6GB) | M1 Max (400GB/s) | 약 87 tok/s | 50.4 tok/s | 약 58% |
| Qwen3-14B (8.3GB) | M4 (120GB/s) | 약 14 tok/s | 12.4 tok/s | 약 86% |
| Qwen3-14B (8.3GB) | M1 Max (400GB/s) | 약 48 tok/s | 25.0 tok/s | 약 52% |
대역폭은 3.3배 차이인데 실제 속도 차이는 2배 정도였다. M4는 대역폭을 80% 이상 쓰는 반면, M1 Max는 50~60%만 활용했다. 실측에서는 이론적인 대역폭 비율만큼 차이가 나지 않았다. GPU 아키텍처뿐 아니라 MLX 커널 효율, 양자화 연산 및 기타 오버헤드가 함께 영향을 줬을 가능성이 있다.
그래도 체감 차이는 크다. 14B 기준으로 M4는 초당 12토큰, M1 Max는 초당 25토큰이다. 읽는 속도보다 약간 빠른 정도에서, 확실히 기다림이 없는 정도로 달라진다.
※ 이 계산은 가중치를 매번 전부 읽는다고 가정한 단순 계산이다. 실제로는 KV 캐시 읽기 등이 더해지므로 대략적인 비교용으로만 보는 것이 좋다.
Prompt 처리: 코어 수는 M1 Max, 코어당 효율은 M4
Prompt 처리 속도도 M1 Max가 1.3~1.5배 빨랐다. 하지만 GPU 코어 수를 생각하면 해석이 달라진다.
Prompt 처리는 대역폭보다 GPU 연산량이 중요한 작업이다. M1 Max의 GPU 코어는 32개로 M4(10개)의 3.2배다. 그런데 속도 차이는 1.3~1.5배에 그쳤다. GPU 코어 하나당 처리량으로 계산하면 M4가 약 2.1~2.5배 효율적이다. 4년 사이 GPU 아키텍처가 그만큼 발전했다는 뜻이다.
이 차이는 실사용에서도 체감된다. 14B 모델로 2,048토큰 입력을 처리하는 데 M4는 약 16.5초, M1 Max는 약 12.7초가 걸렸다. Claude Code에 로컬 모델을 연결해서 쓰는 경우처럼 매번 수만 토큰을 입력하는 작업에서는 이 차이가 몇 분 단위로 벌어질 수 있다. (Claude Code에 로컬 LLM 연결하기 참고)
참고로 M6는 Apple이 M4 대비 최대 4.8배 높은 Prompt 처리 성능을 제시하고 있다. 그 수치가 실제로 나온다면 Prompt 처리에서는 M6가 M1 Max를 앞설 가능성이 높다. 다만 M6는 직접 측정하지 못했다.
가장 흥미로웠던 결과: 24GB에서 30B는 실패, 설정을 바꾸자 8B보다 빨랐다
기본 설정에서는 실행 자체가 안 됐다
맥미니에서 Qwen3-30B-A3B를 실행하자 다음 경고가 나온 뒤 GPU 메모리 부족 에러로 중단됐다.
[WARNING] Generating with a model that requires 16384 MB which is close to
the maximum recommended size of 16384 MB.
RuntimeError: [METAL] Command buffer execution failed: Insufficient Memory
24GB Mac이라도 macOS는 기본적으로 GPU가 쓸 수 있는 메모리를 약 16GB로 제한한다. 나머지는 macOS와 다른 앱을 위해 남겨두는 것이다. 217번 글에서는 24GB에서 30B급을 "경계선"이라고 했는데, 실제로는 기본 설정으로 아예 실행되지 않았다.
GPU 메모리 한도를 올리는 방법
macOS 15 이상에서는 iogpu.wired_limit_mb 값으로 이 한도를 바꿀 수 있다. 값은 모델 크기보다 크고 실제 메모리보다는 작아야 한다. 24GB 맥미니에서는 macOS용으로 4GB를 남기고 20GB로 설정했다.
sysctl iogpu.wired_limit_mb # 현재 값 확인 (0 = macOS 기본값)
sudo sysctl iogpu.wired_limit_mb=20480 # 20GB로 상향
sudo sysctl iogpu.wired_limit_mb=0 # 기본값으로 복원
- 이 설정은 재부팅하면 원래대로 돌아간다.
- macOS에 남는 메모리가 줄어드니 실행 전에 다른 앱은 모두 닫는 것이 좋다.
한도를 올리자 8B보다 2배 빨랐다
같은 맥미니에서 30B-A3B의 생성 속도는 초당 42.4토큰이었다. 8B 모델(21.5토큰)의 약 2배다.
이유는 MoE 구조에 있다. 30B-A3B는 전체 파라미터가 약 30B지만, 토큰 하나를 만들 때 실제로 쓰는 파라미터는 약 3B뿐이다.
- 메모리는 30B만큼 차지한다. 최대 메모리 사용량이 18GB라서 기본 한도 16GB를 넘었다.
- 속도는 3B급으로 나온다. 토큰마다 읽는 가중치가 적어서 8B Dense 모델보다 빠르다.
217번 글에서 설명한 "활성 파라미터는 적지만 메모리는 전체를 올려야 한다"는 MoE의 특성이 그대로 드러난 결과다.
64GB에서는 아무 설정 없이 돌아갔다
M1 Max는 기본 설정 그대로 30B-A3B를 실행했고, 생성 속도는 초당 64.6토큰이었다. 64GB의 가치는 속도보다 "설정을 신경 쓰지 않고 큰 모델을 올릴 수 있다"는 데 있다는 것을 확인했다.
단, 대화가 길어지면 24GB가 한계다
이번 테스트의 입력은 2,048토큰이었다. 하지만 실제 대화에서는 이전 대화가 매번 입력에 함께 들어간다. 질문이 짧아도 대화가 길어질수록 입력은 계속 길어진다.
모델은 입력을 처리하면서 읽은 내용을 KV 캐시로 메모리에 쌓아둔다. 그래서 입력이 길어질수록 메모리 사용량은 늘고 속도는 떨어진다. 맥미니에서 입력 길이를 늘려가며 다시 측정했다. "첫 글자까지"는 입력 길이를 Prompt 처리 속도로 나눈 값이다.
Qwen3-14B (기본 설정, GPU 한도 16GB)
| 입력 길이 | Prompt 처리 (tok/s) | 생성 (tok/s) | 최대 메모리 | 첫 글자까지 |
|---|---|---|---|---|
| 2,048 | 123.8 | 12.4 | 9.3GB | 약 17초 |
| 8,192 | 107.3 | 10.7 | 10.2GB | 약 1분 16초 |
| 16,384 | 94.7 | 9.4 | 11.5GB | 약 2분 53초 |
| 32,768 | 79.0 | 7.7 | 14.3GB | 약 6분 55초 |
Qwen3-30B-A3B (GPU 한도 20GB로 상향)
| 입력 길이 | Prompt 처리 (tok/s) | 생성 (tok/s) | 최대 메모리 | 첫 글자까지 |
|---|---|---|---|---|
| 2,048 | 464.7 | 42.4 | 18.0GB | 약 4초 |
| 8,192 | 333.7 | 34.7 | 18.7GB | 약 25초 |
| 16,384 | 244.7 | 27.1 | 19.4GB | 약 1분 7초 |
| 24,576 | 194.2 | 21.2 | 20.2GB | 약 2분 7초 |
측정에서 확인한 것
- 14B는 속도가 먼저 막힌다. 3만 2천 토큰에서도 메모리는 14.3GB로 한도 안에 있었다. 하지만 첫 글자가 나오기까지 7분 가까이 걸렸다. 입력 1천 토큰당 메모리는 약 0.165GB씩 늘었다.
- 30B는 2만 4천 토큰까지 문제없이 돌았다. 처음에는 2만 토큰 근처에서 메모리가 찰 거라고 예상했는데 빗나갔다. 입력 1천 토큰당 메모리는 약 0.093GB씩 늘었다.
- 30B는 모든 길이에서 14B보다 빨랐다. 2만 4천 토큰을 넣어도 첫 글자까지 약 2분인데, 14B는 1만 6천 토큰에서 이미 3분 가까이 걸렸다.
- 입력이 길어지면 생성 속도도 떨어진다. 14B는 12.4에서 7.7 tok/s로, 30B는 42.4에서 21.2 tok/s로 느려졌다.
20GB 설정인데 20.2GB가 들어간 이유
설정값과 측정값의 단위가 다르기 때문으로 보인다. iogpu.wired_limit_mb=20480은 1024 단위라서 1000 단위로 바꾸면 약 21.5GB다. 같은 계산으로 기본 한도 16,384MB는 약 17.2GB인데, 30B가 2,048토큰에서 18.0GB가 필요해서 기본 설정에서 실패한 것과도 맞아떨어진다.
이 기울기대로라면 20GB 설정에서 30B는 이론상 3만 8천 토큰 안팎까지 들어간다(추정). 다만 그만큼 macOS에 남는 메모리가 줄어들고, 첫 글자까지 기다리는 시간도 3분을 넘게 된다.
정리
24GB 맥미니에서 짧게 주고받는 대화(텔레그램 봇, 간단한 질문)는 30B로 빠르게 처리할 수 있다. 하지만 긴 문서를 넣거나 대화가 길게 이어지는 작업에서는 14B는 속도가, 30B는 메모리와 속도가 함께 한계에 가까워진다. 그 영역은 64GB가 맡는 것이 맞다.
덤으로 보인 것: 노트북은 반복할수록 조금씩 느려졌다
맥미니는 5회 측정값이 거의 일정했다(편차 0.5% 이내). 반면 M1 Max는 측정을 반복할수록 Prompt 처리 속도가 떨어졌다.
| 모델 | 1회차 | 5회차 | 감소폭 |
|---|---|---|---|
| Qwen3-8B | 352.3 tok/s | 325.6 tok/s | 약 8% |
| Qwen3-14B | 168.0 tok/s | 156.5 tok/s | 약 7% |
| Qwen3-30B-A3B | 746.8 tok/s | 661.1 tok/s | 약 11% |
생성 속도는 감소폭이 5% 이내로 비교적 일정했다. 노트북의 발열 관리 차이로 보인다. M1 Max는 세 모델을 쉬지 않고 연속으로 측정했다는 점도 감안해야 한다. 장시간 로컬 LLM 서버로 쓴다면 이 차이가 더 커질 수 있다.
결론
216번 글의 질문에 대한 답은 이렇다. 로컬 LLM에서는 5년 된 M1 Max 64GB가 최신 M4 24GB보다 빠르다.
- 생성 속도는 M1 Max가 약 2배 빠르다. 대역폭이 생성 속도를 좌우하지만, 오래된 GPU라 대역폭 차이(3.3배)를 다 살리지는 못한다.
- Prompt 처리도 M1 Max가 빠르다. 다만 코어 수 덕분이고, 코어당 효율은 M4가 2배 이상 좋다.
- 24GB의 실제 GPU 메모리는 기본 16GB다. 30B급 MoE 모델은 설정을 바꿔야 돌아가고, 바꾸면 8B보다 빠르다. 다만 입력이 길어질수록 느려진다. 2만 4천 토큰 입력에서는 첫 글자까지 약 2분이 걸렸다.
- 64GB의 진짜 가치는 여유다. 큰 모델을 설정 변경 없이 올릴 수 있다.
그래서 지금 내 두 Mac의 역할은 216번 글에서 예상한 그대로다. M4 맥미니는 항상 켜두는 일상 개발 머신, M1 Max는 큰 모델을 돌리는 로컬 AI 머신. 5년 전 영상 작업용으로 고른 64GB가 지금은 로컬 LLM 머신으로 제 몫을 하고 있다.
다음 글
이번에는 MLX-LM 하나로만 측정했다. 다음에는 같은 모델을 MLX vs Ollama vs LM Studio와 oMLX에서 각각 돌려서, 런타임에 따라 속도와 메모리가 얼마나 달라지는지 비교해 볼 생각이다.
주의사항과 참고자료
- 이번 테스트는 속도만 측정했다. 모델별 답변 품질은 비교하지 않았다.
- 결과 표는 입력 2,048토큰 조건이다. 입력 길이에 따른 변화는 맥미니에서만 측정했다(14B, 30B).
- 두 장비의 macOS 버전이 다르다(15.6.1 / 26.6.2). MLX 버전은 같다.
- M1 Max는 32코어 GPU 모델 기준이다. 24코어 모델은 Prompt 처리가 더 느릴 수 있다.
참고자료
- mlx-lm (PyPI) — 설치 방법과 대형 모델의
iogpu.wired_limit_mb설정 - MLX LM Benchmarks (MLX 개발자 gist) —
mlx_lm.benchmark측정 방법 - mlx-community/Qwen3-8B-4bit
- mlx-community/Qwen3-14B-4bit
- mlx-community/Qwen3-30B-A3B-Instruct-2507-4bit
이전 글



