레이블이 오픈소스인 게시물을 표시합니다. 모든 게시물 표시
레이블이 오픈소스인 게시물을 표시합니다. 모든 게시물 표시

2026/06/03

oMLX — 맥에서 로컬 LLM을 제대로 쓰기 위한 추론 서버

맥에서 LLM을 로컬로 돌려본 사람이라면 한 번쯤 Ollama를 설치했을 거다. 설치는 쉽고, 모델도 잘 받아지고 — 근데 조금 쓰다 보면 뭔가 아쉽다. 동시에 여러 요청을 보내면 버벅이고, 한 번 세션이 끊기면 컨텍스트를 처음부터 다시 읽어야 하고, 모델 여러 개를 관리하려면 터미널을 뒤적여야 한다. 맥이 이 정도 하드웨어인데, 좀 더 잘 쓸 방법이 없나 싶었다.

oMLX가 그 답에 가장 가까운 도구다. GitHub 스타 15,700개. Apple Silicon 전용 추론 서버인데, 단순히 빠른 것 이상의 것들을 해준다. 직접 설치해서 쓰면서 정리해봤다.


oMLX가 뭔가

oMLX는 Apple의 MLX 프레임워크 위에 올라가는 LLM 추론 서버다. 코어 추론 엔진은 Apple이 공식으로 관리하는 mlx-lm을 쓰고, 그 위에 프로덕션 서빙에 필요한 것들을 다 쌓아올렸다. 멀티 모델 관리, 티어드 KV 캐시, 연속 배칭, macOS 메뉴바 앱까지.

만든 사람의 말을 그대로 인용하면:

"Every LLM server I tried made me choose between convenience and control. I wanted to pin everyday models in memory, auto-swap heavier ones on demand, set context limits - and manage it all from a menu bar."

그래서 직접 만들었다는 거다. 요구사항이 명확하고 아키텍처가 그걸 실제로 구현하고 있다.

왜 MLX 기반이 빠른가 — 유니파이드 메모리 이야기

llama.cpp나 Ollama가 느리다는 게 아니다. 그쪽도 Apple Silicon에서 Metal 백엔드를 쓴다. 근데 MLX는 한 단계 더 간다.

Apple Silicon의 핵심은 CPU와 GPU가 메모리를 공유한다는 거다. MLX는 이걸 적극 활용해서 배열 연산 결과를 CPU→GPU, GPU→CPU로 복사하지 않는다. 제로 카피(zero-copy). LLM 추론은 메모리 대역폭에 병목이 걸리는 작업인데, 불필요한 복사가 없으면 그만큼 유리하다.

실제 커뮤니티 경험으로는 같은 모델, 같은 하드웨어에서 MLX 기반이 llama.cpp/Ollama 대비 생성 속도(TG)가 10~30% 빠른 경우가 많다고 한다. 컨텍스트 처리(PP)도 대용량에서 더 유리하다.

벤치마크 수치들

oMLX 공식 사이트에 커뮤니티 벤치마크 25,000개 이상이 모여 있다. 실측치들을 보면:

M3 Ultra 512GB · Qwen3.5-122B-A10B 4bit · 32k 컨텍스트

→ 프롬프트 처리 765 tok/s, 생성 42.4 tok/s

M2 Max 64GB · Qwen3.6-35B-A3B 4bit · 16k 컨텍스트

→ 프롬프트 처리 728 tok/s, 생성 66.8 tok/s

M4 Max 64GB · Qwopus3.6-27B 8bit · 4k 컨텍스트

→ 프롬프트 처리 241.8 tok/s, 생성 16.4 tok/s

연속 배칭(Continuous Batching) 효과도 인상적이다. 동시 요청 수에 따라 처리량이 선형 이상으로 오른다:

동시 1개: 56.6 tok/s → 동시 2개: 92.1 tok/s → 동시 4개: 135.1 tok/s → 동시 8개: 190.2 tok/s (3.36배)

에이전트 루프나 여러 도구가 동시에 LLM을 호출하는 상황에서 이게 의미 있는 차이다.

설치 방법

요구 사항: macOS 15 (Sequoia) 이상, Apple Silicon (M1 이상), Python 3.10+

방법 1 — macOS 앱 (GUI 선호하는 경우)

GitHub Releases 페이지에서 .dmg 파일을 받아서 Applications에 드래그하면 끝. 단, 이 방법은 터미널에서 쓰는 omlx CLI 명령이 설치되지 않는다.

방법 2 — Homebrew (CLI + 서비스 관리)

brew tap jundot/omlx https://github.com/jundot/omlx

brew install omlx

업그레이드:

brew update && brew upgrade omlx

백그라운드 서비스로 등록 (크래시 시 자동 재시작):

brew services start omlx

방법 3 — 소스 직접 설치

git clone https://github.com/jundot/omlx.git && cd omlx

pip install -e ".[all]"

MCP(Model Context Protocol) 지원이 필요하다면:

/opt/homebrew/opt/omlx/libexec/bin/pip install mcp

기본 사용법

서버 시작

omlx serve --model-dir ~/models

서버가 뜨면 http://localhost:8000/v1 에 OpenAI 호환 API가 열린다. 어드민 패널은 http://localhost:8000/admin.

모델 디렉토리 구조

~/models/ 아래에 MLX 포맷 모델 폴더를 그냥 넣으면 된다. HuggingFace에서 mlx-community 그룹 모델을 받거나, mlx-lm 툴로 직접 변환/양자화할 수 있다.

~/models/

├── Qwen3-27B-4bit/

├── Qwen3.6-35B-A3B-4bit/

└── bge-m3/

주요 옵션들

# SSD KV 캐시 활성화 (서버 재시작 후에도 캐시 유지)

omlx serve --model-dir ~/models --paged-ssd-cache-dir ~/.omlx/cache

# 메모리 한도 설정

omlx serve --model-dir ~/models --memory-guard-gb 48

# 동시 요청 수 늘리기

omlx serve --model-dir ~/models --max-concurrent-requests 16

# MCP 연동

omlx serve --model-dir ~/models --mcp-config mcp.json

티어드 KV 캐시 — 실제로 왜 중요한가

oMLX에서 가장 특이한 부분이 이거다. KV 캐시를 두 계층으로 나눈다.

핫 캐시 (RAM) — 자주 쓰이는 블록은 메모리에 상주한다.

콜드 캐시 (SSD) — 메모리가 부족해지면 safetensors 형식으로 SSD에 오프로드된다. 다음 요청에서 같은 프리픽스가 오면 복구해서 쓴다.

그리고 이 캐시가 서버 재시작 후에도 살아있다. Ollama는 서버를 껐다 켜면 기존 컨텍스트를 처음부터 다시 읽어야 하는데, oMLX는 이전 세션의 KV 블록이 SSD에 있으면 그냥 가져다 쓴다.

Claude Code 같은 코딩 에이전트로 큰 코드베이스 작업을 할 때 첫 번째 턴(TTFT, time-to-first-token)이 30~90초 걸리던 게 5초 이하로 줄어든다. 이건 실제로 써봐야 체감이 된다.

어떤 모델을 쓸 수 있나

mlx-lm이 지원하는 텍스트 LLM은 다 된다. Llama, Qwen, Mistral, Gemma, DeepSeek, GLM, Phi 계열이 포함된다.

VLM — Qwen3.5 시리즈, GLM-4V, Pixtral, mlx-vlm 지원 모델

OCR 모델 — DeepSeek-OCR, DOTS-OCR, GLM-OCR

임베딩 — BERT, BGE-M3, ModernBERT

리랭커 — ModernBERT, XLM-RoBERTa

툴 콜링은 주요 포맷을 전부 파싱한다. JSON, Qwen XML, Gemma, GLM, MiniMax, Mistral, Kimi K2, Longcat 포맷 모두 지원.

내 맥에서 어떤 모델 크기를 돌릴 수 있나

8GB (M1/M2 Base): 7B 4비트 모델. 느리지만 동작은 한다.

16GB: 7B 8비트 or 13B 4비트. 가벼운 작업에 무난.

32GB: 27B 4비트, 혹은 35B MoE 4비트 (Qwen3.6-35B-A3B 같은 MoE는 스파스 활성화라 메모리를 덜 먹는다). 코딩 작업에 실용적인 구간.

64GB: 70B 4비트, 35B 8비트. M3 Max나 M4 Max 영역. 대부분의 작업에서 GPT-4급 체감.

96GB+: M2/M3/M4 Ultra. 70B 8비트, 122B MoE 4비트. 가성비 좋은 로컬 추론의 최상단.

Claude Code, Codex 등 AI 에이전트와 연동

oMLX는 OpenAI 호환 API(/v1/chat/completions)와 Anthropic API(/v1/messages)를 둘 다 지원한다. Claude Code, OpenClaw, Cursor, Codex, Hermes Agent 등 대부분의 AI 코딩 도구를 그냥 endpoint만 바꿔서 쓸 수 있다.

에이전트 세션에서 컨텍스트 스케일링도 지원해서 Claude Code의 자동 컴팩트가 올바르게 트리거되도록 토큰 카운트를 조정해준다. 긴 prefill 동안 SSE keep-alive로 읽기 타임아웃도 막는다.

MCP 서버로도 사용 가능하다. omlx serve에 --mcp-config로 설정 파일을 넘기면 된다.

써볼 만한가

맥에서 LLM 쓰는 방법이 Ollama/LM Studio만 있는 게 아니다라는 걸 보여주는 프로젝트다. 단순히 빠르기만 한 게 아니라, 프로덕션 서빙을 고려한 설계 — 배칭, 티어드 캐시, 멀티모델 관리, 에이전트 최적화 — 가 다 들어가 있다.

현재 버전 v0.4.0, 커밋 1,400개 이상, 최근 커밋이 몇 시간 전. 오픈 이슈 372개는 많이 쓰인다는 신호다. Apache 2.0 라이선스.

M2 Max 이상 맥을 쓰고 있고, 로컬 LLM을 실제 워크플로우에 붙이고 싶다면 oMLX가 현재 가장 완성도 높은 선택이다. Homebrew 한 줄로 설치되고, 어드민 패널에서 모델 다운로드부터 관리까지 다 된다.

GitHub (⭐15.7k) | 벤치마크 대시보드 | mlx-lm (공식 Apple 추론 라이브러리) | omlx.ai

headroom — AI 에이전트 토큰을 90% 줄여주는 컨텍스트 압축 레이어

AI 에이전트를 실제로 써본 사람이라면 한 번쯤 이런 경험을 했을 거다. Claude Code나 Codex로 코드베이스 분석을 시키는데, 툴 출력 결과 하나에만 토큰이 수천 개 쏟아지고 — 조금 지나면 컨텍스트가 꽉 차서 에이전트가 이상한 소리를 하기 시작한다. 결국 세션을 다시 시작하거나, 직접 프롬프트를 잘라내거나. 왜 이렇게 됐냐고 물어보면 대부분 "컨텍스트 윈도우가 작아서"라고 하는데, 진짜 문제는 따로 있다. LLM한테 필요도 없는 정보를 너무 많이 먹이고 있다는 거다.

headroom은 이 문제에 정면으로 달려드는 프로젝트다. GitHub 스타 6,300개, 포크 445개. 몇 주 전에 알게 됐는데 생각보다 훨씬 잘 만들어져 있어서 정리해봤다.


headroom이 하는 일

한 줄 요약하면 — 에이전트가 LLM한테 보내는 걸 압축해주는 미들웨어다. 툴 출력, 로그, RAG 청크, 파일 내용, 대화 히스토리 전부.

실제 벤치마크 수치를 보면 이게 마케팅이 아니라는 걸 알 수 있다:

코드 검색 결과 100개: 17,765 → 1,408 토큰 (92% 절감)

SRE 인시던트 디버깅: 65,694 → 5,118 토큰 (92% 절감)

GitHub 이슈 트리아지: 54,174 → 14,761 토큰 (73% 절감)

정확도도 같이 확인했다. GSM8K(수학) 기준 압축 전후 정확도 차이가 ±0.000이고, BFCL(툴 콜링) 기준 32% 압축에서 97% 정확도. 이게 가능한 이유가 있다. 단순히 토큰을 자르는 게 아니라, 실제로 LLM이 필요한 정보를 식별해서 나머지를 버리는 방식이기 때문이다.

내부 구조가 꽤 흥미롭다

headroom이 단순 텍스트 트리밍 도구가 아닌 이유는 컨텐츠 타입을 구분해서 각각 다른 압축기를 쓴다는 데 있다.

ContentRouter — 들어오는 내용이 JSON인지, 코드인지, 일반 텍스트인지 판단하고 적절한 압축기로 라우팅한다.

SmartCrusher — JSON과 구조화된 데이터 전용. 중첩 객체, 배열, 혼합 타입을 다 처리한다.

CodeCompressor — AST(추상 구문 트리) 기반. Python, JS, Go, Rust, Java, C++ 지원. 코드의 의미 구조를 이해하고 압축하기 때문에 단순 텍스트 압축보다 훨씬 안전하다.

Kompress-base — 일반 텍스트용 커스텀 HuggingFace 모델. 에이전트 트레이스 데이터로 학습됐다. LLMLingua처럼 별도의 로컬 LLM이 필요하지 않다.

CacheAligner — 프롬프트 프리픽스를 안정화해서 LLM 프로바이더의 KV 캐시 히트율을 높인다. 같은 컨텍스트를 반복 사용하는 에이전트 루프에서 실질적인 비용 절감이 된다.

CCR (Compressed-Context Retrieval) — 원본을 로컬에 저장해두고, LLM이 필요하면 headroom_retrieve 툴로 다시 가져올 수 있다. 압축이 되돌릴 수 없는 정보 손실이 아니라는 게 핵심이다.

설치와 사용 — 진입 장벽이 낮다

여러 배포 방식을 지원하는데, 가장 빠른 건 에이전트 래핑이다:

pip install "headroom-ai[all]"

headroom wrap claude  # Claude Code 바로 연결

headroom wrap codex  # Codex도 동일

기존 코드를 건드리기 싫으면 프록시 모드가 있다:

headroom proxy --port 8787  # OpenAI 호환 프록시, 코드 변경 없음

Python 코드에 직접 붙이는 것도 간단하다:

from headroom import compress

compress(messages, model=...)

LangChain, LiteLLM, Vercel AI SDK, Agno 등 주요 프레임워크 통합도 다 있다. Python 3.10+, 라이선스는 Apache 2.0.

MCP 서버로도 쓸 수 있다

headroom은 MCP 서버 모드를 지원한다. headroom_compress, headroom_retrieve, headroom_stats 세 가지 툴을 제공해서, Claude나 Cursor 같은 MCP 클라이언트가 직접 호출할 수 있다.

headroom mcp install  # 끝

MCP 생태계에서 메모리/컨텍스트 관련 서버들을 비교해보면:

공식 MCP Memory Server (Anthropic) — 엔티티-릴레이션 기반 지식 그래프 메모리. 정보를 '저장하고 검색'하는 구조라서 headroom의 '압축'과는 다른 문제를 푼다. modelcontextprotocol/servers 레포(⭐86.6k)에 포함.

mem0 MCP Server — 대화에서 사실을 추출해 벡터/그래프 DB에 저장, 세션 간 메모리 유지. headroom과 상호 보완적으로 같이 쓸 수 있다.

압축을 해주는 MCP 서버는 현재 headroom이 유일하다고 봐도 된다.

비슷한 도구들이랑 뭐가 다른가

가장 자주 비교되는 건 Microsoft의 LLMLingua다. 둘 다 토큰 압축을 목표로 하지만 접근이 다르다. LLMLingua는 소형 LLM(Llama-2-7B)을 써서 토큰 퍼플렉시티를 계산하고 중요도 낮은 토큰을 제거한다. 학술 논문 기반(EMNLP 2023, ACL 2024)으로 잘 연구된 방식인데, 압축기 자체가 로컬 LLM을 필요로 한다는 게 실용적인 허들이다. 에이전트 래핑이나 프록시 모드, MCP 서버도 없다.

Letta(구 MemGPT)나 LangChain Memory 같은 메모리 프레임워크들은 사실 다른 문제를 푼다. 이쪽은 '세션 간 기억을 어떻게 유지할 것인가'가 핵심인데, headroom은 '지금 이 턴에 LLM한테 보내는 내용을 어떻게 줄일 것인가'에 집중한다. 상충하는 게 아니라 보완적이다.

headroom의 실질적인 차별점은 세 가지다. 첫째, 컨텐츠 타입별 압축기 — JSON을 텍스트처럼, 코드를 텍스트처럼 압축하지 않는다. 둘째, CCR 가역 압축 — 원본이 로컬에 살아있어서 필요하면 되찾을 수 있다. 셋째, 크로스 에이전트 공유 메모리 — Claude, Codex, Gemini가 같은 메모리 스토어를 쓸 수 있다.

headroom learn — 실패에서 배우는 기능

개인적으로 재밌다고 생각한 기능이 headroom learn이다. 에이전트 세션에서 실패한 케이스들을 자동으로 마이닝해서 CLAUDE.md, AGENTS.md, GEMINI.md 같은 지침 파일에 수정사항을 기록해준다. 다음 세션에서 같은 실수를 반복하지 않도록 에이전트 자체를 점진적으로 개선하는 구조다. 아직 실험적인 기능이겠지만 방향성이 맞다.

써볼 만한가

현재 버전 0.22.3, 커밋 1,389개, 브랜치 163개. 리포 상태를 보면 상당히 활발하게 개발되고 있다. 오픈 이슈 75개, PR 55개는 사용자가 많다는 신호이기도 하다.

Claude Code나 Codex로 큰 코드베이스 작업을 자주 하는 사람이라면 headroom wrap으로 감싸는 것만으로 토큰 비용이 꽤 줄어들 수 있다. 라이브 데모에서 10,144 → 1,260 토큰으로 줄어든 채로 동일한 버그를 찾아냈다는 수치가 허황된 느낌이 아니다.

단, Kompress-base ML 모델 없이 쓰려면 headroom-ai[proxy] 같은 세부 패키지를 쓰면 된다. 모든 기능이 다 필요한 게 아니라면 [all] 대신 필요한 것만 설치하는 게 낫다.

📎 참고 링크: headroom GitHub | headroom 문서 | LLMLingua (Microsoft) | Letta (MemGPT) | 공식 MCP Memory Server | mem0

SK하이닉스 ADR 상장 이후 한국 증시 급락의 원인 분석

분류: 증시분석 SK하이닉스 ADR 상장 이후 한국 증시 급락의 원인 분석 지난 7월 10일, SK하이닉스가 미국 나스닥에 미국주식예탁증서(ADR)를 상장했다. 공모가 149달러로 상장한 하이닉스 ADR은 첫 거래일인 13일 기준 약 168달...