AI·로컬 LLM

맥미니 AI 워크로드: 통합 메모리 32GB 자원 경합 관리

홈랩지기 2026. 8. 26. 10:40

개발 파이프라인을 맥미니에서 굴린 지 반년째다. 로컬에서 무검열로 자료를 조사하고 수집하는 파이프라인, 소위 '리서치 스택'을 24시간 돌리는 게 목표였다.

SearXNGLM Studio 위에 relay-bot, 자동요약, 그리고 65K 컨텍스트를 소화하는 Qwen 35B 같은 로컬 LLM을 얹어 쓰는 구조다.

내 맥미니 M1은 기본 32GB 통합 메모리 모델이다. 공식 가이드나 커뮤니티에서는 "시스템 RAM 8GB 정도 여유만 있으면 된다"는 식의 이야기를 자주 봤다.

통합 메모리의 효율성 덕분에 VRAM 부족 문제는 덜할 거라 나름 자신했다.

 

처음엔 괜찮았는데, 왜 망가졌을까? 🤕

처음엔 잘 돌아가는 듯했다. Qwen 35B 모델을 LM Studio에 띄워두고 우리 research-collector-stack!질문이나 !확장조사 명령을 처리했다.

한 번 추론에 10~15초 정도 걸렸는데, 이 정도면 감수할 만했다.

문제는 여기에 LADA 영상 복원 작업이 끼어들면서 시작됐다. 낡은 영상들을 복원하는 개인 프로젝트인데, 얘도 GPU와 메모리를 엄청나게 잡아먹는 친구다.

"두 개 다 돌려도 괜찮겠지" 싶어 동시에 실행했다.

 

결과는 처참했다. Qwen 추론 속도가 40~50초로 널뛰기 시작했다. 때론 아예 응답이 없기도 했다.

LADA는 더 심했다. 4K 영상을 복원하다가 2~3프레임 만에 뻗어버리거나, 시스템 전체가 몇 분씩 멈추는 일이 비일비재했다.

활동 모니터를 켜보면 메모리 압력이 항상 95%를 넘어가고 빨간불이 들어왔다. 이렇게 날린 시간이 주말 저녁 이틀, 대략 10시간은 될 거다. 📉

 

맥미니 통합 메모리의 진짜 한계는 이것!

처음엔 통합 메모리 아키텍처가 뭔데 이럴까 싶었다. 애플 실리콘의 통합 메모리가 호스트 RAM과 VRAM 사이의 데이터 이동 오버헤드를 최소화한다는 건 익히 들었다.

하지만 문제는 통합 메모리가 하나의 메모리 풀이라는 점이었다.

Qwen 35B 모델, 그것도 Q4_K_M 양자화 버전은 활성화되면 모델 가중치, KV 캐시, 그리고 중간 활성화 값까지 합쳐서 20GB 이상의 메모리를 꿀꺽한다.

여기에 LADA가 4K 영상 프레임 하나당 수 GB씩 메모리를 요구하면, 32GB 통합 메모리로는 감당이 안 되는 거였다.

마치 한 집에 살면서 두 사람이 동시에 샤워하려는데 물탱크는 하나뿐인 격이다. 누군가는 물이 약해지거나 아예 끊기는 상황.

"시스템 8GB 여유"는 사무용 애플리케이션이나 캐주얼한 작업 기준이었을 뿐, 이런 헤비급 AI 워크로드에는 전혀 통하지 않는 이야기였다. 메모리 부족은 전통적인 VRAM 부족과 다를 바 없었다.

MoE 모델에서 VRAM이 부족해지면 KV 캐시Expert 간 메모리 트레이딩이 필요하다는 FreeToken 아키텍처 문서를 읽으며, 이 문제가 비단 분리된 GPU만의 문제가 아니라는 걸 깨달았다.

 

그래서 어떻게 해결했냐면: 똑똑한 자원 스케줄링 ✨

원인을 파악하고 나니 해결책이 보였다. 우선, Qwen 모델의 메모리 점유율을 낮춰야 했다.

LM Studio에서 직접 max_memory_usage 같은 옵션을 조절하기 어려워, Q4_K_M에서 Q3_K_M 양자화 버전으로 낮췄다. 체감상 약 4GB 정도 메모리 절약 효과가 있었다.

정확도는 조금 떨어졌지만, 안정적인 실행이 훨씬 중요했다. 그리고 FreeToken의 대역폭 적응 실행 개념에서 힌트를 얻어, LADA와 Qwen의 리소스 경합을 최소화하는 방안을 강구했다.

 

가장 효과적이었던 방법은 watchdog 스크립트를 확장하는 거였다. 우리 research-stack에는 원래 2시간 타임아웃과 watchdog이 있어서 LLM의 무한 루프를 막았다.

이걸 확장해서 Qwen이 활성화되어 추론 중일 때는 LADA 프로세스를 일시 중지시키고, Qwen의 메모리 사용량이 특정 임계값(예: 20GB 이하)으로 내려가면 LADA를 다시 시작하게 했다.

예를 들어 pgrep -f "qwen"으로 Qwen 프로세스 활성 상태를 확인하고, kill -STOP [LADA_PID]kill -CONT [LADA_PID] 명령으로 LADA를 제어하는 식이었다.

수동으로 LADA를 시작할 때도 Qwen이 활동 중이면 알림을 띄우게 했다.

이젠 시카마치 미루 근황 조사가 86분 걸려 519KB의 풍부한 리포트를 뽑아내는 동안에도, LADA가 뒤에서 조용히 대기하며 리소스를 양보했다.

 

통합 메모리, 이렇게 써야 제대로다

결과적으로, 맥미니의 통합 메모리 아키텍처는 분명 효율적이지만, 그 한계는 명확했다.

물리적인 메모리 총량은 여전히 중요하다. 벤치마크 가이드라인은 일반적인 기준일 뿐, 동시에 돌리는 헤비급 AI 워크로드의 실제 메모리 점유율을 정확히 파악하고 동적으로 관리해야 한다.

리소스 경합을 피하는 영리한 스케줄링이 필요하다.

※ 이 글은 직접 겪은 작업 경험을 바탕으로 AI의 도움을 받아 작성했습니다.