TuBrief
Subscribed Channels
Videos
Community

8GB 노트북에서 로컬 AI 띄우다 멈출 때 고치는 방법

TuBrief Editorial
September 12, 2026
0
컴퓨터/소프트웨어

Written with AI assistance from the source video. The video is the authority.

한국어EnglishEspañol中文العربيةहिन्दीDeutschFrançaisPortuguêsBahasa Indonesia日本語Русский

Related Video

내 하드웨어에 딱 맞는 AI 모델을 찾아주는 도구 (llmfit)10:47

내 하드웨어에 딱 맞는 AI 모델을 찾아주는 도구 (llmfit)

Better Stack

More from the community

사내 시스템에 llm api 붙일 때 마주하는 현실적인 한계와 대응법

September 13, 2026

레거시 백엔드에 GPT-6 Astra 붙일 때 예산 승인과 보안 통과를 먼저 끝내는 법이 있습니다

September 13, 2026

에이전트끼리 대화하다 6천만 원 청구서가 나오는 이유

September 13, 2026

사내 RAG 벡터 검색에 Okta 권한 필터를 직접 거는 방법

September 13, 2026

브라우저 에이전트에게 내 구글 계정을 통째로 넘기면 안 되는 이유

September 12, 2026

Apple Won the AI Race

September 12, 2026

Comments (0)

Log in to leave a comment

No posts yet

© 2026 . All rights reserved.

TuBrief
Subscribed Channels
Videos
Community
Log in

8GB 노트북에서 로컬 AI 띄우다 멈출 때 고치는 방법

유튜브 보고 터미널에 모델 설치 명령어 넣었다가 화면이 굳어버린 경험이 있을 겁니다. 8GB나 16GB 램을 단 구형 맥북, 혹은 보급형 노트북에서 로컬 LLM이 뻗는 이유는 연산 코어가 모자라서가 아닙니다. 메모리 대역폭이 턱없이 좁은 상태에서 런타임이 한계를 넘어선 데이터를 읽으려다 뻗는 게 진짜 원인입니다. 기기 대역폭을 재고 컨텍스트 크기만 손보면 구형 기기에서도 코드 보조 모델을 띄워 써먹을 수 있습니다.

시스템 파이썬 건드리지 않고 환경 진단 도구 깔기

최신 macOS와 Ubuntu는 시스템 파이썬에 패키지를 함부로 깔지 못하게 막습니다. pip install을 넣자마자 PEP 668 에러(error: externally-managed-environment)를 뱉으며 멈춥니다. 귀찮다고 시스템 보호를 강제로 푸는 플래그(--break-system-packages)를 붙이면 나중에 OS 기본 도구들 꼬여서 밀어야 합니다. 독립 가상환경 격리를 지원하는 pipx를 써서 진단 툴을 올립니다.

Alex Jones가 개발한 오픈소스 진단 도구 llmfit을 격리로 배포해 내 하드웨어 스펙부터 뽑아냅니다.

# macOS 기준 pipx 설치 (리눅스는 sudo apt install -y pipx)
brew install pipx
pipx ensurepath

# llmfit 설치 및 하드웨어 스캔 결과 저장
pipx install llmfit
mkdir -p ~/local-ai-workspace/{configs,logs,scripts}
llmfit --json system > ~/local-ai-workspace/logs/system_specs.json

터미널에서 이 과정을 끝내면 시스템 라이브러리를 건드리지 않고 1분 만에 장치 램 용량과 메모리 버스 정보가 system_specs.json 파일에 정리됩니다.

대역폭 계산하고 3B와 7B 모델 골라내기

로컬 언어 모델이 글자를 뱉어내는 과정은 이전에 나온 토큰을 보며 다음 글자를 찍어내는 순차 작업입니다. 매 단계마다 모델의 수십억 개 가중치를 메모리 버스에서 통째로 읽어와야 합니다. 즉, 체감 속도는 GPU 클럭이 아니라 메모리 대역폭 숫자가 결정합니다.

초당 토큰 출력 속도(TPS)는 아래 공식으로 계산합니다.

TPS≈Memory Bandwidth (GB/s)Model Weights Size (GB)+KV Cache per Step (GB)×ηTPS \approx \frac{\text{Memory Bandwidth (GB/s)}}{\text{Model Weights Size (GB)} + \text{KV Cache per Step (GB)}} \times \etaTPS≈Model Weights Size (GB)+KV Cache per Step (GB)Memory Bandwidth (GB/s)​×η

수식의 η\etaη는 런타임의 실효 대역폭 효율(MBU) 값이며 보통 0.65 안팎입니다.

대역폭이 45GB/s 수준인 일반 DDR4 데스크톱 램에 4비트 양자화된 7B 모델(약 4.5GB)을 통째로 올리면 연산 속도는 45÷4.5×0.65≈6.5 TPS45 \div 4.5 \times 0.65 \approx 6.5\text{ TPS}45÷4.5×0.65≈6.5 TPS에 머뭅니다. 글자가 한 글자씩 뚝뚝 끊겨서 실무 보조용으로는 속이 터집니다. 반면 288GB/s 대역폭을 가진 RTX 4060 8GB 모델이나 대역폭이 100GB/s를 넘는 M 시리즈 통합 메모리에 올리면 초당 35~40토큰이 나와서 실시간 타이핑 속도를 가볍게 앞지릅니다.

내 기기 스펙을 확인한 뒤 쓸 모델은 딱 두 개로 나눕니다.

  • 코드 작성 및 테스트 작성: 4.7GB 크기의 Qwen2.5-Coder-7B-Instruct (Q4_K_M)를 올립니다. 16GB 통합 메모리 맥북이나 8GB VRAM 외장 그래픽에서 35 TPS 이상 찍힙니다.
  • 문서 요약 및 커밋 로그 작성: 2.0GB 크기인 Llama-3.2-3B-Instruct (Q4_K_M)를 씁니다. 저전력 노트북의 DDR4 환경에서도 램을 덜 먹으며 15 TPS 안팎을 꾸준히 뱉어냅니다.

컨텍스트 윈도우 4096으로 묶어 OOM 에러 막기

기껏 모델을 띄워도 질문 몇 번 주고받다 보면 프로세스가 조용히 꺼집니다. 터미널에 찍히는 Exit Code 137은 운영체제의 메모리 관리 커널(Linux OOM-Killer 또는 macOS JetSam)이 램 부족으로 프로세스를 강제 종료(SIGKILL)했다는 뜻입니다.

외장 GPU를 쓰는 경우 더 골치 아픈 사일런트 CPU 폴백(Silent CPU Fallback)이 일어납니다. VRAM 한계를 넘기면 프로세스를 죽이지 않고 연산 레이어 일부를 느려터진 시스템 램으로 밀어내는데, 이때 GPU 점유율이 곤두박질치며 초당 1토큰 수준으로 기어갑니다.

범인은 대화가 길어질수록 램을 먹어 치우는 KV(Key-Value) 캐시입니다. Llama-3 아키텍처 기준 컨텍스트를 32,768(32K) 토큰까지 열어두면 가중치 4.5GB 외에 캐시 메모리로만 4.0GB가 추가로 붙습니다. 8GB 기기에서는 무조건 터지는 구조입니다. 이 길이를 4,096(4K) 토큰으로 묶어두면 캐시 용량이 512MB로 줄어들어 8GB 환경에서도 튕기지 않습니다.

현재 상태를 확인하고 한도를 고정하는 절차입니다.

먼저 터미널에서 ollama ps를 입력합니다. PROCESSOR 항목에 100% GPU가 아니라 30%/70% CPU/GPU처럼 쪼개져 나온다면 이미 VRAM이 넘쳐 저속 램으로 밀려난 상태입니다.

설정 파일을 만들어 컨텍스트 크기를 박제합니다. ~/local-ai-workspace/configs/Modelfile.coder를 열고 아래 내용을 작성합니다.

FROM qwen2.5-coder:7b

# 캐시 폭증을 막기 위한 4096 토큰 상한
PARAMETER num_ctx 4096
PARAMETER temperature 0.2

터미널에서 커스텀 모델로 빌드합니다.

ollama create custom-coder:7b -f ~/local-ai-workspace/configs/Modelfile.coder

빌드가 끝난 뒤 macOS는 터미널에 sudo purge를 입력해 디스크 캐시를 밀고, 윈도우는 쓰지 않는 WSL 인스턴스를 wsl --shutdown으로 정리해서 기본 가용 램을 최소 2GB 이상 확보해 둡니다.

외부 유출 없는 로컬 파이프라인 만들기

사내 소스 코드나 개인 프로젝트가 외부로 빠져나가지 않도록 모델 서빙 엔드포인트를 로컬 루프백(127.0.0.1)에만 묶습니다.

~/local-ai-workspace/scripts/serve_secure.sh 파일을 만들고 아래 코드를 넣습니다.

#!/bin/bash
export OLLAMA_HOST="127.0.0.1:11434"
export OLLAMA_ORIGINS="http://127.0.0.1:*,http://localhost:*"
ollama serve > ~/local-ai-workspace/logs/ollama_runtime.log 2>&1 &

스크립트를 실행한 뒤 터미널에서 lsof -i :11434 | grep LISTEN을 입력했을 때 수신 주소가 127.0.0.1:11434로 뜨는지 확인합니다. 만약 외부에서 찌를 수 있는 0.0.0.0:11434가 보이면 즉시 프로세스를 닫아야 합니다.

연동은 VS Code 플러그인인 Continue.dev를 씁니다. 설정 파일(~/.continue/config.json)을 열어 채팅용 모델과 자동완성용 모델을 나눕니다.

{
  "models": [
    {
      "title": "Local Qwen2.5-Coder (Chat)",
      "provider": "ollama",
      "model": "custom-coder:7b",
      "apiBase": "http://127.0.0.1:11434"
    },
    {
      "title": "Local Llama3.2 (Summary)",
      "provider": "ollama",
      "model": "llama3.2:3b",
      "apiBase": "http://127.0.0.1:11434"
    }
  ],
  "tabAutocompleteModel": {
    "title": "Local Autocomplete",
    "provider": "ollama",
    "model": "qwen2.5-coder:1.5b",
    "apiBase": "http://127.0.0.1:11434"
  },
  "allowAnonymousTelemetry": false
}

질문 답변에는 방금 컨텍스트를 묶어둔 7B 모델을 배정하고, 탭 자동완성에는 1GB짜리 초경량 모델인 qwen2.5-coder:1.5b를 지정합니다. 자동완성 딜레이가 사라집니다.

검증은 인터넷을 끊고 진행합니다. Wi-Fi를 끈 오프라인 상태에서 터미널을 열고 직접 질의를 쏴봅니다.

curl -s -X POST http://127.0.0.1:11434/api/generate -d '{
  "model": "llama3.2:3b",
  "prompt": "로컬 격리 네트워크 테스트",
  "stream": false
}' | grep "response"

회선이 차단된 상태에서 정상적인 JSON 응답이 돌아오면, 외부 클라우드 의존 없이 내 노트북 자원 안에서만 안전하게 돌아가는 개발 환경 세팅이 끝납니다.