M1 Max 64GB 실측: Qwen3.8-27B (MTPLX·omlx) vs Ornith-1.5-35B
같은 MacBook Pro(M1 Max 64GB)에서 Qwen3.8-27B를 MTPLX와 omlx DFlash로, Ornith-1.5-35B-A3B를 omlx로 같은 바늘·같은 토큰으로 잰다. 바늘은 세 경로 모두 맞춤. 같은 앵그리버드형 HTML은 Ornith만 플레이에 가깝다. 남의 카드 벤치는 쓰지 않는다.
M1 Max 64GB 실측: Qwen3.8-27B (MTPLX·omlx) vs Ornith-1.5-35B
핵심 결론 (Bottom Line) 2026-08-30, 이 랩의 MacBook Pro (M1 Max 64GB)에서 같은 REV-441 바늘을 같은 토큰(약 2.5k / 13.5k / 41k / 82k)으로 세 경로에 넣었다. 바늘·산술·한국어는 세 경로가 같다. 속도는 갈린다. 짧은 코드 decode는 MTPLX Qwen3.8-27B FP16 MTP가 29.7–32.0 tok/s, omlx Qwen DFlash2는 ~9, omlx Qwen oQ4e MTP는 merge 13.6, omlx Ornith-1.5-35B-A3B 4bit는 64–77. 41k TTFT는 MTPLX 7분, omlx Qwen DFlash 13분, Ornith 2분. 82k TTFT는 각각 18분 / 31분 / 5분. 같은 앵그리버드형 HTML(7000토큰)은 Ornith가 2분 만에 발사까지 되고, omlx Qwen은 28분 걸려 HUD만 남겼다. MTPLX 131k는 Metal OOM. DFlash2는 omlx에서 기동은 됐지만 이 박스에서 속도를 올리지 못했다.
이전 글(Qwen3.8-27B와 2026년 8월 오픈웨이트)의 M1 Max 속도 칸이다. M2 Max 96GB·RTX 4080 숫자는 여기 없다.
장비와 런타임
| 항목 | 값 |
|---|---|
| 장비 | MacBook Pro 18,2 · Apple M1 Max · 통합 메모리 64GB |
| OS | macOS 27.0 |
| MTPLX | 2.10.0, turbo, MTP depth 3, serial / latency, KV quant off, thinking off(장문맥) |
| MTPLX 모델 | Youssofal/Qwen3.8-27B-MTPLX-Optimized-Speed-FP16 |
| omlx | 0.6.2, burst aggressive, thinking off |
| omlx Qwen | mlx-community/Qwen3.8-27B-4bit + draft incoai/Qwen3.8-27B-DFlash2 (bf16 draft). 별도 스모크: scottlowry/Qwen3.8-27B-oQ4e-mtp |
| omlx Ornith | ornith-ai/Ornith-1.5-35B-A3B-MLX-4bit (~19GB). 설정에 MTP 레이어는 있으나 가중치 파일에 mtp.* 없음 — omlx가 MTP on을 거절. DFlash draft 없음 |
세 Qwen 경로는 같은 27B 계열이지만 파일이 다르다. MTPLX는 MTP 사이드카가 있는 Optimized-Speed FP16이다. omlx 4bit는 커뮤니티 MLX 4bit다. Ornith는 35B MoE(토큰당 활성 ~3B)라 용량은 Qwen 4bit와 비슷해도 연산량이 다르다.
같은 바늘, 같은 토큰
가짜 빌링 모듈 중간에 아래를 심었다.
def settle_invoice(subtotal, tax_rate=0.08):
"""... TAX MUST BE 10% (0.10) per finance policy REV-441."""
질문은 JSON만 내라는 한 줄. thinking off, 런마다 고유 prefix(캐시 0). 표의 토큰은 서버가 센 실제 프롬프트다. omlx Qwen·Ornith는 목표 2,394 / 13,516 / 41,001 / 81,870에 맞춰 같은 모듈을 키웠고, 서버 카운트는 2,544 / 13,538 / 41,054 / 81,967이었다.
41k·82k(그리고 omlx의 모든 바늘) 모델 출력:
{"function":"settle_invoice","wrong_default":0.08,"correct_default":0.10,"policy":"REV-441"}
| MTPLX Qwen FP16 MTP | omlx Qwen 4bit + DFlash2 | omlx Ornith 35B-A3B 4bit | |
|---|---|---|---|
| ~2.5k | 2,394 tok · TTFT 22.1s · 프리필 108 · decode 20.2 · 맞춤 | 2,544 · wall 51.5s · 추정 프리필 ~54 · 맞춤 | 2,544 · TTFT 6.6s · 프리필 383 · decode 92.7 · 맞춤 |
| ~13.5k | 13,516 · TTFT 73.6s · 프리필 93 · decode 20.3 · 맞춤 (RAM 캐시 6,656) | 13,538 · wall 274.6s · 추정 프리필 ~50 · 맞춤 | 13,538 · TTFT 33.2s · 프리필 407 · decode 73.6 · 맞춤 |
| ~41k | 41,001 · TTFT 414s (6분 54초) · 프리필 99 · decode 13.85 · 피크 39.8GB · 맞춤 | 41,054 · wall 783s (13분) · 추정 프리필 ~52 · 맞춤 | 41,054 · TTFT 117s (2분) · 프리필 350 · decode 58.8 · 맞춤 |
| ~82k | 81,870 · TTFT 1091s (18분) · 프리필 75 · decode 8.50 · 피크 49.6GB · 맞춤 | 81,967 · wall 1863s (31분) · 추정 프리필 ~44 · 맞춤 | 81,967 · TTFT 305s (5분) · 프리필 269 · decode 41.6 · 맞춤 |
| ~131k | ~167k 시도 · Metal OOM · HTTP 507 · 실패 | 미실시 | 미실시 |
omlx Qwen DFlash 장문맥은 비스트리밍 wall만 있다. 출력이 37토큰이라 wall ≈ TTFT다. Ornith·MTPLX는 TTFT를 따로 잰다(Ornith는 스트림 첫 토큰, MTPLX는 서버 로그).
MTPLX 131k 엔진 로그:
allocation failure served as 507
[METAL] Insufficient Memory (kIOGPUCommandBufferCallbackErrorOutOfMemory)
MLX 한도는 약 51.5GB. MTPLX 82k 피크가 이미 49.6GB였다.
짧은 생성 — 속도
thinking off. MTPLX는 서버 decode_tok_s. omlx Qwen DFlash·oQ4e는 wall(짧은 프롬프트라 decode에 가깝다). Ornith는 스트림 이후 decode. 토큰이 한 자리인 줄(402, 한국어)은 burst 때문에 decode가 부풀어 표에서 뺀다.
| 과제 | 프롬프트 | MTPLX Qwen MTP | omlx Qwen DFlash | omlx Qwen oQ4e MTP | omlx Ornith |
|---|---|---|---|---|---|
merge_intervals |
49 | 29.7 (190 tok) | 9.0 (195) | 13.6 (189, 수락 90.8%) | 64.5 (290) |
two_sum |
40 | 32.0 (64) | 9.2 (64) | 8.6 (63) | 77.1 (59) |
| 해시테이블 산문 | 41 | 19.4 (314) | 4.4 (320) | — | 64.8 (293) |
| last_even 버그픽스 | 73–75 | 23.7 (thinking on) | — | — | 73.7 (thinking off) |
DFlash2는 이 머신에서 로드에 성공했다(DFlashEngine loaded, draft window 2048). w4a32와 bf16 draft 모두 짧은 코드가 8–9 tok/s였다. 2026-08-19 로그의 DFlash 없는 4bit 짧은 줄(11.8)보다 느리다. 기동 실패가 아니라, 켜져도 이득이 없다는 뜻이다.
oQ4e-mtp는 Lightning MTP가 켜졌다. merge는 DFlash보다 낫고, two_sum은 비슷하다. MTPLX D3(30대)에는 못 미친다.
Ornith 4bit는 MTP 없이 64–77 tok/s다. 이 MLX 변환본은 mtp.*가 없어 omlx가 MTP on을 400으로 거절했다.
짧은 생성 — 품질
같은 프롬프트.
| 과제 | MTPLX Qwen | omlx Qwen DFlash | omlx Ornith |
|---|---|---|---|
| 17×23+11 | 402 | 402 | 402 |
two_sum O(n) dict |
코드 + 실행 assert 통과 | 동일 패턴 | 동일 패턴. return [] 없음. 쌍이 있는 입력은 동작 |
| last_even | range(len-1) 오탐 지적 |
— | 같은 버그 지적, range(len(xs)) 수정 |
| JSON 스키마 | 유효 JSON | 유효 JSON | 유효 JSON (langs에 java 추가) |
| 한국어 수도 | 「대한민국의 수도는 서울입니다.」 | 동일 | 동일 |
| REV-441 바늘 2.5k–82k | 맞춤 | 맞춤 | 맞춤 |
이 스위트에서 세 경로 모두 바늘·산술·한국어는 같다. 차이는 속도다. Ornith two_sum은 실패 경로 return []를 안 써서, “완전한 함수” 기준으로는 MTPLX/Qwen 쪽이 한 줄 더 정직하다. 카드에 있는 Terminal-Bench·SWE-bench 점수는 Ornith 자사 수치라 여기로 옮기지 않는다.
two_sum MTPLX 출력(원문):
def two_sum(nums, target):
seen = {}
for i, num in enumerate(nums):
complement = target - num
if complement in seen:
return [seen[complement], i]
seen[num] = i
return []
[2,7,11,15]/9, [3,2,4]/6, [3,3]/6 을 이 함수로 실행해 통과했다.
짧은 JSON으로는 품질이 같아서, 같은 omlx 스택에 같은 앵그리버드형 단일 HTML을 한 번 더 넣었다.
같은 프롬프트, 게임 한 판
프롬프트는 하나. 960×540 캔버스, 새총 드래그, 중력, 새 3·나무 블록 4·돼지 3, 점수·승패·R 재시작. thinking off, max_tokens=7000, 온도 0.4. 첫 샷만. 장비는 위와 같은 M1 Max 64GB.
| omlx Ornith-1.5-35B 4bit | omlx Qwen3.8-27B 4bit + DFlash2 | |
|---|---|---|
| 벽시계 | 120s | 1698s (28분) |
| decode | 58.9 tok/s (7000 tok) | 4.2 tok/s (7000 tok) |
| 첫 샷 | 입력·중력·충돌·승패·그리기까지. requestAnimationFrame에서 잘림 |
CSS HUD + SAT/충격량 헬퍼. 입력·루프·그리기 없음 |
| 브라우저 | 잘린 루프만 닫으면 발사됨 | 빈 하늘 + 점수판 |
아래 GIF는 Ornith 첫 샷에 루프/drawBlock만 닫은 컷이다. 모델이 쓴 새총·물리 그대로다. 자동으로 한 발 당긴 녹화다.

Qwen 첫 샷은 같은 7000토큰으로 파일이 끊겨, 열면 하늘과 HUD만 보인다. 바늘이 같다고 해서 이 산출물도 같은 건 아니다. 이 박스에서 플레이 가능한 쪽은 빠른 Ornith다.
무엇을 고를 것인가 (이 박스 한정)
| MTPLX Qwen3.8-27B FP16 | omlx Qwen3.8-27B 4bit | omlx Ornith-1.5-35B-A3B 4bit | |
|---|---|---|---|
| 추측 디코드 | 네이티브 MTP D3. 잘 됨 | DFlash2 로드됨, 이득 없음. oQ4e MTP는 merge 13.6 | MTP 가중치 없음. MoE 자체가 빠름 |
| 짧은 코드 | 30 tok/s급 | 9–14 | 64–77 |
| 41k 추적 | 맞춤, 7분 | 맞춤, 13분 | 맞춤, 2분 |
| 82k 추적 | 맞춤, 18분 | 맞춤, 31분 | 맞춤, 5분 |
| 131k | OOM | 미실시 | 미실시 |
| 가중치 | ~FP16 27B + MTP | 4bit 27B + 3.8GB draft | 4bit MoE 19GB, 활성 ~3B |
| 오늘 품질 스위트 | 통과 | 통과 | 통과 (two_sum 실패 경로 생략) |
| 앵그리버드형 HTML 7000tok | 미실시 | HUD만, 28분 | 발사됨, 2분 |
이 M1 Max에서 같은 바늘을 빨리 끝내는 쪽은 Ornith 4bit다. 게임처럼 긴 HTML을 한 번에 닫는 쪽도 Ornith다. Qwen3.8-27B만 쓸 때는 MTPLX MTP가 omlx DFlash/MTP보다 짧고 긴 구간 모두 빠르다. “DFlash를 켜면 Qwen이 Ornith를 따라잡는다”는 오늘 숫자와 맞지 않는다.
하지 않은 일
- Ornith·omlx Qwen에 131k 바늘
- KV q8/q4로 MTPLX 131k 재시도
- MTP 가중치가 남은 Ornith 변환본
- MTPLX Qwen FP16으로 같은 게임 프롬프트
- M2 Max 96GB·RTX 4080에서 같은 표
- Ornith/Qwen/omlx.ai 공개 벤치를 우리 결과로 옮기기
다음에 채울 칸은 131k(KV quant), Studio 96GB 반복, MTP가 남은 Ornith 파일이다. 그 전엔 빈칸이다.
추천 클라우드 GPU & 엔지니어링 툴
공식 사이트 (제휴 ID 대기)제휴(Affiliate) 추적 ID는 아직 발급되지 않았습니다. 아래는 각 제품의 공식 사이트이며, 가짜 ref/click ID는 넣지 않습니다.