Mac Mini M4에서 ollama를 200% 활용하는 최적화 아키텍처

Mac Mini M4에서 ollama를 200% 활용하는 최적화 아키텍처

네이티브 API 연동부터 프록시 컨텍스트 제어, 영구 상주(Warm-up) 설정까지


핵심 요약

  • ollama 네이티브 API(/api/chat)를 사용해야 안정적이다 — OpenAI 호환 API는 불안정했다
  • 프록시 서버(11435)를 두어 think: falsenum_ctx 상한을 강제 주입하고, OOM을 방지한다
  • OLLAMA_KEEP_ALIVE=-1로 모델을 VRAM에 영구 상주시키면 응답 지연이 1초 이내로 단축된다

배경

Mac Mini M4 32GB를 구매한 가장 큰 이유는 AI 에이전트의 LLM을 로컬에서 24시간 비용 없이 구동하기 위해서였다. 하지만 단순 설치만으로는 끝나지 않았다. API 방식 선택, 컨텍스트 창 매핑, VRAM 관리 프록시, 모델 상주 설정 등 튜닝할 요소가 산더미였다.

ollama 프로바이더 기본 설정

본문

ollama 프로바이더 기본 설정

{
  "models": {
    "providers": {
      "ollama": {
        "baseUrl": "http://127.0.0.1:11435",
        "apiKey": "ollama-local",
        "api": "ollama",
        "models": [{
          "id": "qwen3.5:9b",
          "contextWindow": 131072,
          "maxTokens": 4096,
          "reasoning": false
        }]
      }
    }
  }
}

설계 포인트: - api: "ollama": 네이티브 API 사용 필수. OpenAI 호환 API는 파라미터 무시 및 스트리밍 끊김 불안정성이 있었다 - baseUrl 포트 11435: 기본 11434가 아닌 이유는 커스텀 프록시를 거치기 때문 - contextWindow 수동 명시: 생략하면 보수적 기본값이 적용되어 모델 잠재력이 제한된다 - reasoning: false: Thinking 모드는 응답 시간을 2~3배 지연시킨다

커스텀 프록시(ollama-proxy.py)

Gateway (:18789) → ollama-proxy.py (:11435) → ollama (:11434)
  1. think: false 강제 주입: 모든 요청을 가로채 불필요한 연산 지연 원천 차단
  2. num_ctx 상한 제어: 32GB 환경에서 128k 컨텍스트를 꽉 채우면 OOM으로 시스템이 멈춘다. 안전 임계값 초과 시 강제로 값을 낮춘다

영구 상주와 환경 변수 튜닝

OLLAMA_KEEP_ALIVE=-1       # VRAM 영구 상주 (기본값 5분 언로드 방지)
OLLAMA_FLASH_ATTENTION=1   # Apple Silicon 가속 (10~15% 향상)
OLLAMA_KV_CACHE_TYPE=q8_0  # KV 캐시 8비트 양자화 (메모리 절약)

KEEP_ALIVE=-1이 핵심이다. 기본값은 5분 단위 언로드이므로, 30분마다 도는 Heartbeat 시 매번 15~30초 로딩 지연이 발생한다.

시행착오 / 주의사항

부팅 시 자동 Warm-up

#!/bin/bash
sleep 30  # OS 안정화 대기
curl -s -X POST http://localhost:11434/api/generate \
  -d '{"model": "qwen3.5:9b", "prompt": "hi", "stream": false}' > /dev/null
curl -s -X POST http://localhost:11434/api/embeddings \
  -d '{"model": "nomic-embed-text", "prompt": "warmup"}' > /dev/null
echo "ollama warmup complete: $(date)"

Mac이 켜지면 30초 뒤에 LLM과 임베딩 모델이 VRAM에 자리 잡고 즉각 명령을 대기한다.

시행착오 / 주의사항

초기에 qwen3.5:35b-a3b(MoE, 26.3GB)를 사용했으나 32GB 램에서 여유 메모리가 6GB 미만으로 떨어지자, Gateway와 프록시 등 필수 프로세스가 OOM Kill되었다. 안정성을 위해 qwen3.5:9b(Dense, 9.2GB)로 마이그레이션했다.

항목 35B (MoE) 9B (Dense)
정확도 100% (15/15) 87% (13/15)
VRAM 점유 26.3GB 9.2GB
토큰 속도 18.3 tok/s 13.5 tok/s

9B의 복잡한 분기 처리 약점은 '1 프롬프트 = 1 동작' 원칙을 엄격히 적용하여 시스템적으로 보완했다.

마무리

이 모든 최적화의 이유는 비용이다. Heartbeat 월 1,080회, 매일 Reflect, 수시 임베딩, 24시간 모니터링 — 클라우드 API로 처리했다면 매월 수십만 원이었을 것이다. 96만 원 Mac Mini M4의 하드웨어 투자는 5~6개월 만에 100% 회수되었다. 클라우드의 지능과 로컬의 무한한 체력을 결합하는 것이 가장 이상적인 하이브리드 AI 에이전트 시스템이다.

댓글

이 블로그의 인기 게시물

"LLM 핵심 학습 (1/6) — 기본: 토큰화·임베딩·어텐션·위치 인코딩"

"LLM 핵심 학습 (2/6) — 파인튜닝: LoRA·QLoRA·증류·Adapter"

"ML 기초 학습 (1/9) — 머신러닝과 sklearn: 학습의 좌표계"