최근 로컬 LLM에 관심이 많아지면서 MacBook에서도 어느 정도 수준의 AI 모델을 직접 실행할 수 있는지 테스트하고 있다. 특히 코딩과 디버깅 용도로 사용할 수 있는 모델을 찾고 있었는데, 최근 공개된 Alibaba Qwen 시리즈의 Qwen3.8이 상당히 흥미로웠다.
사용하는 MacBook Pro는 M3 Max, 30-core GPU, Unified Memory 36GB 사양이다. 이 환경에서 Qwen3.8 27B 모델을 Ollama로 실행해 보고, 일반 버전과 MLX 버전의 속도를 직접 비교했다.
테스트 결과 요약
Qwen3.8 27B 일반 버전
9.74 tokens/sec
Qwen3.8 27B MLX 버전
33.26 tokens/sec
약 3.41배 빠른 생성 속도
동일한 프롬프트, 동일한 Context, 동일한 출력 토큰 수를 기준으로 측정한 결과이다.
단순히 모델을 실행해 본 수준이 아니라 실제 API를 이용해 테스트했고, 사용한 명령어와 원본 결과도 함께 정리했다. MacBook에서 로컬 LLM을 사용하려는 분들에게 참고가 되었으면 한다.
1. 테스트 환경: MacBook M3 Max 36GB
먼저 이번 테스트에 사용한 하드웨어와 소프트웨어 환경이다.
| 항목 | 사양 |
|---|---|
| 기기 | MacBook Pro |
| CPU / GPU | Apple M3 Max |
| GPU Core | 30-core GPU |
| Unified Memory | 36GB |
| 모델 | Qwen3.8 27B |
| 실행 환경 | Ollama |
| Context Length | 32,768 tokens |
| 테스트 방식 | Ollama Generate API |
MacBook의 Unified Memory는 CPU와 GPU가 공유하는 메모리다. 일반적인 PC처럼 GPU 전용 VRAM이 별도로 있는 구조가 아니기 때문에, 로컬 LLM을 실행할 때 모델 크기와 Context 설정이 상당히 중요하다.
36GB 메모리 환경에서는 27B 모델을 실행할 수 있지만, 메모리를 무조건 크게 사용하는 것보다는 모델 양자화와 Context 설정을 적절하게 조절하는 것이 중요하다.
2. Qwen3.8 27B란 무엇인가?
Qwen은 중국 Alibaba의 Qwen 팀에서 개발하는 대규모 언어 모델(LLM) 시리즈이다. 오픈 웨이트 모델을 제공하기 때문에 사용자가 직접 모델을 다운로드해 자신의 컴퓨터나 서버에서 실행할 수 있다는 특징이 있다.
Qwen3.8은 Qwen3.5를 기반으로 발전한 모델 계열이며, 코딩, 전문적인 업무, 연구, 장시간에 걸친 에이전트 작업 등의 개선을 목표로 한다. 이번에 테스트한 Qwen3.8 27B는 이름에서 알 수 있듯이 약 270억 개의 파라미터를 가진 Dense 모델이다.
27B 모델이라는 의미
LLM에서 B는 Billion의 약자이다. 따라서 27B는 약 270억 개의 파라미터를 의미한다. 파라미터는 쉽게 이야기하면 AI 모델이 학습 과정에서 얻은 지식과 패턴을 표현하는 수많은 숫자라고 생각하면 된다. 일반적으로 파라미터 수가 커지면 더 많은 표현 능력을 확보할 수 있지만, 모델 크기만으로 실제 성능을 판단할 수는 없다. 실제 성능은 모델 구조, 학습 데이터, 학습 방법, 추론 방식, 양자화 수준 등에 영향을 받는다.
Qwen3.8 27B의 주요 특징
- 27B Dense 모델: 약 270억 개 파라미터를 사용하는 모델
- 코딩 능력: 코드 생성 및 소프트웨어 개발 관련 작업 지원
- Thinking 기능: 복잡한 문제를 단계적으로 추론하는 기능
- 멀티모달: 텍스트뿐 아니라 이미지 입력도 지원하는 모델 구성
- 긴 Context: 공식 모델 정보 기준 약 262K 토큰의 네이티브 Context 지원
- 에이전트 작업: 여러 단계로 이루어진 작업의 계획 및 실행 개선
공식 모델 정보는 Qwen3.8-27B 공식 GitHub와 Ollama Qwen3.8 모델 페이지에서 확인할 수 있다. 개인적으로는 일반적인 질문에 답변하는 것보다는 실제 개발 환경에서 코드를 분석하고, 오류의 원인을 찾고, 여러 파일을 수정하는 작업에서 얼마나 잘 동작하는지가 더 중요하다. 그래서 이번 테스트도 C++ 코드를 생성하는 작업으로 진행했다.
3. MLX란 무엇인가? 일반 Ollama와 차이점
이번 테스트에서 가장 중요한 부분이다. 모델 이름 뒤에 붙은 -mlx는 무엇을 의미할까?
MLX는 Apple이 개발한 머신러닝 프레임워크이다. Apple Silicon의 CPU, GPU, Unified Memory 구조를 활용하도록 설계되었다.
쉽게 설명하면 AI 모델 자체가 바뀌었다기보다는 모델을 실행하는 기술과 가중치 저장 형식이 달라지는 것이다.
일반 Ollama와 MLX 실행 구조
일반 Ollama 모델
↓
↓
MLX 모델
↓
↓
여기서 오해하면 안 되는 부분이 있다. 일반 Ollama 모델도 Apple GPU를 사용할 수 있다. MLX가 GPU를 사용하고 일반 Ollama가 CPU만 사용하는 것은 아니다. 차이는 모델을 실행하는 백엔드와 메모리 처리, 하드웨어 최적화 방식에 있다.
기존에는 Ollama와 MLX를 별도의 실행 환경으로 생각하는 경우가 많았다. 하지만 Ollama는 Apple Silicon에서 MLX 실행 엔진을 지원하고 있다. 따라서 별도의 MLX 서버를 구축하지 않고도 Ollama API를 통해 MLX 모델을 사용할 수 있다.
이번 테스트에서 사용한 명령은 다음과 같다.
ollama run qwen3.8:27b
ollama run qwen3.8:27b-mlx
두 모델 모두 동일한 Ollama API를 사용했기 때문에 기존에 Ollama를 사용하던 개발 환경을 크게 변경할 필요가 없었다. Ollama의 MLX 엔진에 대한 자세한 내용은 Ollama 공식 MLX 소개를 참고하면 된다.
4. 테스트 방법 및 스크립트
처음에는 동일한 C++17 LRU Cache 구현 요청을 두 모델에 전달했다. 그런데 모델마다 생성한 토큰 수가 달랐기 때문에 정확한 속도 비교를 위해서는 출력 토큰 수를 동일하게 맞출 필요가 있었다.
그래서 두 번째 테스트에서는 다음 조건을 사용했다.
- 동일한 모델 계열: Qwen3.8 27B
- 동일한 프롬프트
- 동일한 Context: 32,768
- 동일한 출력 제한: 1,000 tokens
- 동일한 Temperature: 0
- 동일한 API: Ollama Generate API
사용한 프롬프트는 다음과 같다.
Generate a detailed C++17 LRU cache implementation
and explain its design.
실제 테스트 스크립트
아래 스크립트는 두 모델을 순서대로 실행하고, 생성 토큰 수와 생성 시간, 초당 토큰 수를 출력한다.
for model in qwen3.8:27b qwen3.8:27b-mlx; do
echo "Testing $model"
curl -s http://localhost:11434/api/generate \
-d "{
\"model\": \"$model\",
\"prompt\": \"Generate a detailed C++17 LRU cache implementation and explain its design.\",
\"stream\": false,
\"options\": {
\"num_ctx\": 32768,
\"num_predict\": 1000,
\"temperature\": 0
}
}" | jq '{
eval_count,
eval_duration_sec: (.eval_duration / 1e9),
tok_per_sec: (.eval_count / .eval_duration * 1e9)
}'
done
여기서 중요한 값은 eval_count와 eval_duration이다.
- eval_count: 모델이 생성한 토큰 수
- eval_duration: 토큰 생성에 걸린 시간 (나노초)
- tok_per_sec: 초당 생성 토큰 수
토큰 생성 속도는 다음 공식으로 계산한다.
Tokens/sec = eval_count ÷ (eval_duration / 1,000,000,000)
참고로 이번 테스트는 생성 속도(Decode)를 비교한 것이다. 긴 코드베이스를 입력했을 때의 프롬프트 처리 속도(Prefill)는 별도로 측정하지 않았다.
5. 실제 테스트 결과: 일반 Ollama vs MLX
먼저 첫 번째 테스트 결과다. 동일한 프롬프트를 입력했지만 출력 토큰 수에는 제한을 두지 않았다.
첫 번째 테스트: 자유 생성
일반 Ollama 결과
{
"eval_tokens": 3556,
"eval_time_sec": 411.13194,
"tok_per_sec": 8.649291514543968,
"prompt_tokens": 36,
"total_time_sec": 411.536250334
}
MLX 결과
{
"eval_tokens": 3930,
"eval_time_sec": 115.213656958,
"tok_per_sec": 34.11053952946431,
"prompt_tokens": 36,
"total_time_sec": 123.378063291
}
첫 번째 테스트부터 상당한 차이가 발생했다. 일반 버전은 약 8.65 tokens/sec, MLX 버전은 약 34.11 tokens/sec였다. MLX가 약 3.94배 빠른 결과이다. 다만 생성 토큰 수가 달랐기 때문에 이것만으로 최종 결론을 내리지는 않았다.
두 번째 테스트: 출력 토큰 1,000개로 통일
보다 공정한 비교를 위해 num_predict: 1000으로 설정했다.
일반 Ollama 결과
{
"eval_count": 1000,
"eval_duration_sec": 102.646633,
"tok_per_sec": 9.742160758453714
}
MLX 결과
{
"eval_count": 1000,
"eval_duration_sec": 30.065879708,
"tok_per_sec": 33.26029405133014
}
최종 비교표
| 항목 | 일반 Ollama | Ollama MLX |
|---|---|---|
| 모델 | Qwen3.8 27B | Qwen3.8 27B MLX |
| 출력 토큰 | 1,000 | 1,000 |
| Context | 32K | 32K |
| Temperature | 0 | 0 |
| 생성 시간 | 102.65초 | 30.07초 |
| 생성 속도 | 9.74 tok/s | 33.26 tok/s |
| 전체 시간 | 102.65초 이상 | 30.07초 이상 |
MLX 성능 개선 결과
약 3.41배
33.26 ÷ 9.74 = 약 3.41
동일한 1,000개 토큰을 생성하는 데 걸린 시간은 약 102.65초에서 30.07초로 줄었다. 약 72.9%의 생성 시간 감소다.
이 결과가 흥미로운 이유는 단순히 모델 크기를 줄인 것이 아니라, 같은 Qwen3.8 27B 계열을 서로 다른 실행 방식으로 구동했을 때 큰 속도 차이가 발생했다는 점이다.
다만 두 배포본의 내부 가중치 및 양자화 설정까지 완전히 동일하다고 검증한 것은 아니다. 따라서 이번 결과는 사용한 Ollama 배포 태그와 M3 Max 환경에서의 실측 비교로 이해하는 것이 정확하다.
6. 왜 MLX가 이렇게 빠를까?
이번 결과를 보고 가장 궁금했던 부분은 왜 이렇게 차이가 크게 발생했는가였다. 가장 큰 차이는 실행 엔진과 Apple Silicon에 대한 최적화 방식에서 찾을 수 있다.
Apple Silicon은 CPU와 GPU가 메모리를 공유하는 Unified Memory 구조를 사용한다. MLX는 이러한 구조를 고려해 설계된 프레임워크이다. 일반적인 GPU 서버 환경과 달리 Mac에서는 GPU 전용 VRAM을 따로 확보하는 것이 아니라 시스템 메모리를 함께 사용한다. 따라서 메모리 접근과 연산을 효율적으로 처리하는 것이 중요하다.
Ollama의 MLX 엔진은 이러한 Apple Silicon 환경을 활용하는 실행 경로를 제공한다. 물론 MLX가 모든 모델과 모든 작업에서 항상 3배 이상 빠르다는 의미는 아니다. 모델 구조, 양자화 방식, Context 길이, Ollama 버전, 하드웨어에 따라 결과는 달라질 수 있다. 이번 결과는 어디까지나 Qwen3.8 27B, M3 Max 36GB, 32K Context, 1,000 출력 토큰이라는 특정 조건에서 측정한 결과이다.
7. MacBook 36GB 메모리에서 27B 모델은 사용할 만할까?
결론적으로 이번 테스트에서는 충분히 실용적인 속도를 확인했다. 27B 모델은 36GB Unified Memory 환경에서 실행할 때 모델 가중치뿐 아니라 Context를 처리하기 위한 메모리도 필요하다. 운영체제와 다른 개발 도구가 사용하는 메모리도 고려해야 한다.
Ollama 모델 라이브러리 기준 Qwen3.8 27B의 일반 배포본과 MLX 배포본은 각각 약 18GB로 표시된다. 하지만 이 숫자가 실제 실행 중 전체 메모리 사용량을 의미하는 것은 아니다.
또한 모델이 지원하는 최대 Context가 256K라고 해서 36GB Mac에서 256K를 항상 여유롭게 사용할 수 있다는 뜻도 아니다. 우선 32K Context를 기준으로 테스트했다. 실제 코딩 작업에서 Context가 부족하다면 48K 또는 64K로 늘려보는 방식이 현실적이라고 생각한다.
Q4, Q5, Q8 양자화는 어떻게 선택할까?
모델을 로컬에서 실행할 때 양자화(Quantization)도 중요한 요소이다. 쉽게 설명하면 모델이 사용하는 숫자의 정밀도를 낮춰 메모리 사용량을 줄이는 기술이다. 예를 들어 8-bit보다 4-bit 양자화 모델이 일반적으로 더 적은 메모리를 사용한다.
| 양자화 | 특징 | 36GB 환경 |
|---|---|---|
| Q4 | 메모리 효율과 성능의 균형 | 우선 추천 |
| Q5 | 일반적으로 Q4보다 높은 정밀도 | 실제 파일 크기 확인 필요 |
| Q8 | 높은 정밀도, 더 많은 메모리 필요 | 메모리 부담 큼 |
이번 테스트는 Q4와 Q8의 품질 비교가 아니라 Ollama에 배포된 일반 버전과 MLX 버전의 실행 속도 비교이다. 두 버전의 양자화 설정이 완전히 동일하다고 확인한 것은 아니므로, 결과를 순수한 엔진 성능 차이로만 해석해서는 안된다.
36GB 환경에서 코딩용 모델을 사용한다면 무조건 Q8을 선택하기보다는 Context와 실제 메모리 여유까지 함께 고려하는 편이 좋다.
8. 실제 코딩과 디버깅에 얼마나 도움이 될까?
이번 테스트는 C++17 LRU Cache 구현 요청을 이용했다. 하지만 토큰 생성 속도가 빠르다고 해서 반드시 코딩 능력도 더 좋다는 의미는 아니다.
실제 개발 환경에서 중요한 것은 다음과 같은 항목이다.
- 기존 코드의 구조와 의존성을 이해하는 능력
- 컴파일 오류의 근본 원인을 찾는 능력
- 여러 파일에 걸친 변경 사항을 정확하게 처리하는 능력
- 존재하지 않는 API나 설정을 만들어내지 않는 능력
- 수정 후 테스트를 통해 결과를 검증하는 능력
특히 Yocto, Embedded Linux, Android Automotive, QNX처럼 복잡한 시스템을 다루는 경우에는 단순한 코드 생성보다 기존 환경을 이해하고 문제의 원인을 좁혀가는 능력이 더 중요하다.
앞으로는 동일한 버그를 포함한 프로젝트를 두 모델에 제공하고, 실제 수정 성공률과 분석 정확도까지 비교해 볼 생각이다. 개인적으로는 33 tokens/sec라는 결과 자체도 만족스럽지만, 로컬 모델을 코딩 에이전트와 연결했을 때 어느 정도까지 활용할 수 있는지가 더 궁금하다.
9. 테스트 결과의 한계
이번 테스트는 실제 MacBook에서 측정한 결과이지만, 모든 환경에서 동일한 수치가 나온다고 보장할 수는 없다. 정확한 재현을 위해서는 다음 사항을 함께 고려해야 한다.
- Ollama 버전과 MLX 실행 엔진 버전
- 각 모델의 실제 양자화 방식과 가중치 파일
- 모델을 처음 로드하는 시간과 이미 로드된 상태의 생성 시간
- 메모리 압력 및 Swap 사용량
- Context 길이와 프롬프트 길이
- 동일한 조건에서 여러 번 반복 측정한 평균값
이번 측정은 각각의 모델을 실행한 실측값이며, 통계적인 반복 실험을 수행한 결과는 아니다. 또한 생성 속도에 초점을 맞췄기 때문에 긴 프롬프트를 처리하는 Prefill 성능이나 코딩 정답률까지 비교한 것은 아니다. 따라서 이번 결과는 M3 Max에서 Qwen3.8을 사용할 때 MLX 배포본이 훨씬 빠른 생성 속도를 보여줬다는 실제 사용 사례로 보는 것이 적절하다.
10. 결론: M3 Max에서는 Qwen3.8 MLX를 추천
이번 테스트를 통해 확인한 가장 큰 사실은 생각보다 간단하다. MacBook M3 Max 36GB에서 Qwen3.8 27B를 로컬로 실행할 때, 일반 Ollama 버전은 약 9.74 tokens/sec였지만 MLX 버전은 약 33.26 tokens/sec를 기록했다. 동일한 1,000개 토큰을 생성하는 데 걸린 시간도 약 102.65초에서 30.07초로 줄었다.
물론 속도만으로 모델의 전체 품질을 판단할 수는 없다. 하지만 코딩과 디버깅처럼 여러 번 질문하고 수정하는 작업에서는 응답 속도도 중요한 요소이다.
현재 제 추천 설정
- Hardware: MacBook M3 Max 36GB
- Model: Qwen3.8 27B MLX
- Runtime: Ollama
- Context: 32K부터 시작
- Generation Speed: 약 33.26 tokens/sec (실측)
별도의 복잡한 실행 환경을 구성하지 않고 기존 Ollama API를 그대로 사용할 수 있다는 점도 마음에 들었다.
Mac에서 로컬 LLM을 사용하고 있다면 일반 모델만 설치하기보다는 MLX 배포본도 함께 비교해 보시길 추천한다. 특히 Apple Silicon에서는 실행 엔진과 모델 포맷에 따라 실제 사용 경험이 상당히 달라질 수 있다.
다음에는 Qwen3.8 MLX를 실제 개발 프로젝트에 연결해 복잡한 코드 분석과 디버깅 작업을 얼마나 잘 수행하는지 테스트해 볼 예정이다.
참고 자료
※ 본문에 기재된 성능은 작성자가 MacBook M3 Max 36GB 환경에서 직접 측정한 값이다. 다른 Mac 모델, Ollama 버전, 모델 배포본 및 실행 환경에서는 결과가 달라질 수 있다.
