M4 24GB 메모리에서 로컬 모델 실행하기

3 hours ago 2
  • M4 MacBook Pro 24GB에서도 기본 작업·조사·계획용 로컬 모델 구성이 가능함
  • Qwen 3.5-9B Q4는 약 40토큰/초, 사고 모드, 도구 사용, 128K 컨텍스트를 만족함
  • 최고 수준 모델처럼 복잡한 문제를 오래 독립 해결하진 못해 단계별 지시가 필요함
  • Elixir Credo 경고는 고쳤지만, rebase 충돌 해결은 파일 수정 없이 실패함
  • 로컬 모델은 오프라인·구독 불필요가 장점이지만, 성능과 설정에 트레이드오프가 큼

로컬 모델 실행 환경과 선택 기준

  • M4 MacBook Pro 24GB 메모리 환경에서 로컬 모델 실행 설정을 실험했고, 최고 수준 모델(SOTA) 출력과는 다르지만 기본 작업, 조사, 계획을 인터넷 연결 없이 처리할 수 있는 구성이 가능했음
  • 로컬 실행 도구로는 Ollama, llama.cpp, LM Studio가 있으며, 각각 제약과 제공 모델이 다름
  • 모델 선택에서는 메모리에 들어가면서도 일반적인 Electron 앱을 함께 실행할 여유가 있어야 했고, 최소 64K, 이상적으로는 128K 이상의 컨텍스트 창이 필요했음
  • 최근 시도한 Qwen 3.6 Q3, GPT-OSS 20B, Devstral Small 24B는 메모리에는 들어갔지만 실제 사용은 어려웠고, Gemma 4B는 잘 실행됐지만 도구 사용에서 어려움을 보임
  • 설정 항목은 temperature처럼 잘 알려진 값부터 K Cache Quantization Type 같은 특수 옵션까지 다양하며, 사고(thinking) 활성화 여부에 따라 적절한 값이 달라질 수 있음

Qwen 3.5-9B 4비트 양자화 구성

  • qwen3.5-9b@q4_k_s는 LM Studio에서 실행했을 때 약 40토큰/초, 사고 활성화, 성공적인 도구 사용, 128K 컨텍스트 창을 함께 만족한 가장 나은 모델이었음
  • 최고 수준 모델보다 쉽게 산만해지고, 가끔 루프에 빠지며, 요청을 잘못 해석하기도 하지만 24GB MacBook Pro에서 다른 작업 공간을 남기고 실행되는 모델로는 상당히 괜찮았음
  • 사고 모드와 코딩 작업을 위한 권장 설정은 다음과 같았음
temperature=0.6, top_p=0.95, top_k=20, min_p=0.0, presence_penalty=0.0, repetition_penalty=1.0
  • 사고를 활성화하려면 LM Studio에서 모델을 선택한 뒤 configuration으로 이동하고, Inference 탭 하단의 Prompt Template에 다음 값을 추가해야 함
{%- set enable_thinking = true %}
  • 이 모델은 piOpenCode 양쪽에서 사용됐으며, pi는 더 빠릿하게 느껴졌지만 하네스(harness)를 직접 구축하고 커스터마이즈할 수 있다는 장점과 별개로 합리적인 기본값이 부족했음
  • pi 설정을 맞추는 데 실제 프로젝트보다 더 많은 시간을 쓰게 될 수 있었음

pi 설정

  • ~/.pi/agent/models.json에는 LM Studio의 OpenAI 호환 엔드포인트와 qwen3.5-9b@q4_k_s 모델을 등록함
{ "providers": { "lmstudio": { "baseUrl": "http://localhost:1234/v1";, "api": "openai-completions", "apiKey": "lm-studio", "models": [ { "id": "qwen3.5-9b@q4_k_s", "reasoning": true, "compat": { "thinkingFormat": "qwen-chat-template" } } ] } } }
  • 산만한 사고 블록을 숨기려면 ~/.pi/agent/settings.json에 "hideThinkingBlock": true를 추가함

OpenCode 설정

  • ~/.config/opencode/opencode.json에는 LM Studio를 로컬 OpenAI 호환 provider로 등록하고, 도구 사용과 131072 컨텍스트 길이, 32768 최대 토큰을 설정함
{ "$schema": "https://opencode.ai/config.json";, "provider": { "lmstudio": { "npm": "@ai-sdk/openai-compatible", "name": "LM Studio (local)", "options": { "baseURL": "http://127.0.0.1:1234/v1"; }, "models": { "qwen3.5-9b@q4_k_s": { "name": "Qwen 3.5 9B Q4_K_S", "tools": true, "context_length": 131072, "max_tokens": 32768 } } } }, "model": "lmstudio/qwen3.5-9b@q4_k_s" }

최고 수준 모델과의 차이

  • Qwen 3.5 9B Q4 같은 모델은 최고 수준 모델처럼 긴 시간 동안 복잡한 문제를 독립적으로 해결할 수 있는 수준은 아니었음
  • 전체 앱을 한 번에 만들라고 요청하는 방식은 적합하지 않았고, 결과 없이 노트북만 뜨거워질 수 있음
  • 더 잘 맞는 방식은 단계별로 명확히 소통하고, 많은 지침을 주는 상호작용형 워크플로였음
  • 로컬 모델을 쓸 때는 사용자가 더 많은 사고와 계획을 직접 맡고 더 구체적으로 지시해야 하지만, 조사 보조자, 러버덕, 프로그래밍 언어 세부사항과 명령줄 호출을 즉시 떠올리는 보조자로는 쓸모가 있었음
  • 대형 AI 회사들이 홍보하는 10배 생산성 향상은 아니지만, 의미 있는 도움과 흥미로운 사용감을 줌

작동한 작업과 실패한 작업

  • Elixir Credo 경고 수정

    • Elixir linter credo를 최신 버전으로 올린 뒤 코드에서 경고가 발생했고, Qwen에게 mix credo --strict를 실행해 해결 방법을 제안하되 편집하지 말라고 요청함
    • Qwen은 테스트 파일 4곳에서 리스트가 비어 있지 않은지 확인하기 위해 length/1을 쓰는 문제를 찾아냈고, length(list) > 0 대신 list != []를 쓰라고 제안함
    • 이후 편집을 요청하자 Qwen은 4개의 병렬 편집을 깔끔하게 수행함
    • 이 작업은 터미널과 에디터를 오가며 직접 할 수도 있는 단순 작업이었지만, 편리한 보조 역할을 해줌
  • Dependabot PR의 rebase 충돌 처리

    • 의존성 업데이트 뒤 Dependabot PR에 git 충돌이 있었고, Dependabot이 rebase를 거부해 직접 내려받아 rebase한 뒤 Qwen에게 확인을 요청함
    • 충돌은 각 의존성의 더 최신 버전을 선택하면 되는 단순한 형태였고, Qwen은 sentry는 13.0.1, tailwind는 0.4.1을 유지하는 선택지를 권장함
    • 하지만 실제 변경을 요청하자 Qwen은 파일을 수정하지 않은 채 충돌 마커가 남아 있는 상태로 git add mix.lock && git rebase --continue를 실행하려 했음
    • git rebase --continue가 에디터를 여는 동작도 인식하지 못했고, OpenCode가 멈췄으며 이 현상은 일회성일 가능성도 있었음

로컬 모델의 장점과 한계

  • 로컬 모델에는 큰 트레이드오프가 있지만, 인터넷 연결 없이 비행기에서도 작업할 수 있다는 장점이 있음
  • 컴퓨터를 어차피 구매한다고 가정하면 비용은 사용 전력으로 제한되고, 구독이 필요하지 않음
  • 모델 학습에는 여전히 큰 환경 비용이 있지만, 오픈 모델 회사들은 환경 영향 상위권과는 거리가 있고, 개인 하드웨어를 쓰면 데이터센터 의존이 줄어듦
  • 직접 조정하고 실험하는 재미가 있음
  • LLM은 이미 큰 영향을 미쳤고 부정적인 면도 많지만 계속 남을 기술로 보이며, 로컬 모델 실험은 이 기술과 더 지속 가능하고 긍정적으로 상호작용하는 방식처럼 느껴졌음
Read Entire Article