Apple Silicon Mac에서 로컬 LLM을 실행하기 위한
오픈 소스 추론/서빙 엔진인 "ax-engine"을 개발하고 있습니다.
이 글에서는 ax-engine을 만들게 된 배경, 설계 방침, MTP를 통한 고속화,
mlx-lm과의 비교, 그리고 현재까지의 과제에 대해 정리했습니다.
본 글은 직접 만든 OSS의 기술적인 개발 기록입니다.
실제 벤치마크 결과와 다른 Apple Silicon 환경에서의 피드백을
공유받는 것을 목적으로 하고 있습니다.
ax-engine은 Apple Silicon Mac용 LLM 추론/모델 서빙 엔진입니다.
채팅 UI나 클라우드 API 서비스가 아니라, 로컬에서 모델을 실행하고
다른 애플리케이션에서 이용할 수 있는 추론 런타임을 목표로 합니다.
주요 특징은 다음과 같습니다:
- Apple Silicon용 로컬 추론
- OpenAI 호환 API
- 하나의 프로세스에서 여러 모델 서빙
- 지원 모델에서의 MTP (Multi-Token Prediction)
- Prefix reuse
- 로컬 환경에서의 추론
- 기존의 OpenAI API 대응 툴과의 연결
GitHub 리포지토리는 여기입니다.
Apple Silicon Mac은 GPU와 CPU가 메모리를 공유하는 Unified Memory Architecture를 채택하고 있습니다.
따라서, 로컬 LLM을 실행할 때는 계산 능력뿐만 아니라,
모델을 읽어오거나 KV cache 처리에 필요한 메모리 대역폭이
병목 현상이 되는 경우가 있습니다.
실제로 로컬 모델을 사용하다 보면, 모델을 불러왔음에도 불구하고,
토큰 생성 속도가 기대보다 느리게 느껴질 때가 있습니다.
이에 Apple Silicon 상에서의 모델 실행과 서빙에 초점을 맞춰서,
추론 속도, 메모리 사용량, 여러 모델 관리 방법을 검증하고 있습니다.
ax-engine에서는 지원 모델에 대해
MTP (Multi-Token Prediction)을 이용한 디코딩을 시도하고 있습니다.
일반적인 자기회귀형(autoregressive) 디코딩에서는 한 번의 스텝으로 다음 토큰을 하나씩 예측합니다.
MTP에서는 보조적인 예측 헤드(auxiliary prediction head)를 이용하여,
여러 개의 토큰 후보를 먼저 예측하고, 그 후보들을 메인 모델로 검증합니다.
다만, MTP의 효과는 항상 같지 않습니다.
다음 요소에 따라 결과가 달라집니다:
- 모델의 아키텍처
- MTP 대응 여부
- 양자화 형식
- 프롬프트 길이
- 컨텍스트 길이
- 생성할 토큰 수
- Apple Silicon 세대
- Unified Memory 용량
따라서, 단순한 모델 크기만으로 속도를 비교하는 것이 아니라,
같은 모델, 같은 양자화, 같은 프롬프트를 사용해서 측정해야 합니다.
이번 측정에서는 다음과 같은 환경을 사용했습니다:
| 항목 | 내용 |
|---|
| 칩 | M4 Pro / M5 Max |
| ... | |
| 특정 모델과 설정에서는 다음과 같은 결과가 나왔습니다: | |
| Engine | Model | Quantization | Hardware | Decode |
|---|
| ax-engine | Qwen XX | XX | M4 Pro | XX tok/s |
| ... | | | | |
| M5 Max의 특정 구성에서는 76 tok/s 이상을 측정했습니다. | | | | |
또한, 조건에 따라 mlx-lm과 비교하여 약 2.4~2.7배의
디코딩 속도를 얻었습니다.
다만, 이는 모든 모델이나 환경에서 재현되는 고정값은 아닙니다.
모델, 양자화, 컨텍스트 길이, 프롬프트, MTP 설정에 따라
결과는 크게 달라질 수 있습니다.
ax-engine은 OpenAI 호환 API를 제공합니다.
따라서, OpenAI 호환의 Base URL을 지정할 수 있는 애플리케이션이라면,
클라우드 API 대신 로컬의 ax-engine에 연결할 수 있습니다.
curl http://localhost:XXXX/v1/chat/completions \
-H
다음 환경에서 테스트한 결과가 있다면 공유해 주시면 감사하겠습니다.
- M1 / M2 / M3 / M4 / M5
- 16 GB / 24 GB / 32 GB / 48 GB / 64 GB 이상
- Qwen과 같은 로컬 모델
- 다양한 양자화 형식
- mlx-lm이나 llama.cpp와의 비교
결과를 공유하실 경우, 다음 정보가 포함되면 비교하기 용이합니다.
- Mac 칩 및 Unified Memory 용량
- macOS 버전
- ax-engine 버전
- 모델명
- 양자화 형식
- 컨텍스트 길이
- Decode tok/s
- Prefill tok/s
- 메모리 사용량
- 오류 또는 호환성 문제
아직 개선이 필요한 부분도 있습니다.
- 모델에 따라 지원 상황이 다릅니다.
- MTP의 효과는 모델과 설정에 따라 달라집니다.
- Apple Silicon 세대에 따라 결과가 다릅니다.
- 설치나 모델 변환 과정에서 문제가 발생할 수 있습니다.
- 모든 OpenAI 호환 클라이언트와의 호환성을 보장할 수는 없습니다.
특히, 벤치마크 결과의 경우,
동일한 조건으로 재현 가능한지를 중요하게 생각합니다.
ax-engine은 Apple Silicon Mac에서의 로컬 LLM 추론 및 모델 서빙에 초점을 맞춘 오픈 소스 프로젝트입니다.
MTP, Prefix reuse, 다중 모델 서빙, OpenAI 호환 API 등을 통해,
로컬 LLM을 더욱 실용적으로 활용할 수 있는 환경을 목표로 합니다.
아직 개발 중인 부분이 많기 때문에, Apple Silicon 환경에서 테스트한 결과나 개선점, 버그, 벤치마크 결과를 공유해 주시면 큰 도움이 됩니다.
GitHub:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46