로컬 LLM 실행 허브 — 설치·VRAM·오류 해결

이 페이지는 AI뉴스노트의 로컬 LLM 글 여덟 편을 읽는 순서대로 이어 둔 안내입니다. 여덟 편은 모두 Debian 13 장비에서 명령을 실행하고 그 출력을 실은 기록이고, 그중 다섯 편은 같은 로컬 태그 qwen2.5-0.5b-local을 씁니다. 그래서 모델 파일을 손에 넣는 단계부터 메모리 계산, 응답 형식, 다른 앱과의 연결, GPU 없는 장비의 음성·이미지 작업까지 한 줄로 이어 읽으면 앞 글의 결과가 다음 글의 전제가 됩니다. 아래 순서는 그 의존 관계를 따른 것입니다.

마지막 업데이트: 2026년 10월 17일

모델을 받는 단계와 메모리를 가늠하는 단계

첫 글은 Ollama pull redirect target not allowed, 로컬 GGUF로 모델 만들기입니다. Ollama 0.40.3에서 ollama pull qwen2.5:0.5b가 redirect target not allowed로 끝난 상황에서, 장비에 있던 Qwen2.5 0.5B Instruct GGUF를 Modelfile의 FROM에 적고 ollama create로 모델을 만듭니다. 만든 이름은 CLI와 /api/generate에서 같은 질문에 같은 답을 냈고, 목록의 SIZE는 491 MB였습니다. 레지스트리가 막혀도 손에 있는 파일로 동작 점검을 시작하는 길이 여기서 열리므로, 다운로드 문제를 겪고 있다면 이 글이 출발점입니다.

모델이 돌아가면 다음 질문은 메모리입니다. LLM 메모리 계산: CPU에서 잰 Q4_K_M 6.16비트와 Ollama 적재 크기는 Q4_K_M이라는 이름을 4비트로 읽어 곱한 추정이 실제 태그 크기보다 작게 나오는 이유를 GGUF 텐서 바이트로 보여 줍니다. 파일을 열어 잰 평균은 6.16비트였고, Ollama가 보고하는 size는 텐서 바이트에 f16 KV 캐시를 더한 값과도 차이가 났습니다. num_ctx 4096과 32768에서 size가 어떻게 달라지는지, GPU 없는 서버인데도 ollama ps가 CPU/GPU 비율을 띄우는 까닭을 서버 로그로 확인하는 과정도 들어 있습니다. 첫 글에서 모델을 만든 뒤 이 글로 넘어가면, 컨텍스트 설정을 바꿀 때 무엇이 늘어나는지를 숫자로 따라가게 됩니다.

두 글을 이어 읽으면 숫자도 이어집니다. 첫 글에서 기본 이름의 ps CONTEXT와 서버 로그의 default_num_ctx는 둘 다 4096이었고, 메모리 글에서 ollama ps는 num_ctx 4096일 때 595 MB와 60%/40% CPU/GPU를, 32768일 때 1.0 GB와 77%/23%를 보여 줬습니다. GPU 없는 장비에서 이 비율을 실제 GPU 사용으로 읽지 않도록, 첫 글은 서버 로그의 library=cpu와 total_vram=”0 B”를 함께 보라고 적었고 메모리 글도 그 비율이 무엇을 세는지 서버 로그로 따로 밝힙니다.

응답을 프로그램과 노트, 다른 앱으로 넘기기

모델이 답을 해도 프로그램이 그 답을 읽지 못하면 작업은 거기서 멈춥니다. AI 프롬프트 5요소: qwen2.5 0.5B 리뷰 한 건의 JSONDecodeError 해결에서는 한 줄 요청이 설명 문장을 돌려줘 json.loads가 첫 글자에서 JSONDecodeError를 냈고, 역할·제약·출력 형식·예시·리뷰 다섯 줄로 다시 쓴 프롬프트가 sentiment와 reason을 가진 JSON 한 줄을 받아 냈습니다. format json과 num_predict를 바꿨을 때 출력이 어떻게 갈리는지도 같은 모델로 비교합니다.

이어서 읽을 글은 옵시디언 AI 플러그인 자동 요약, KeyError와 model not found 해결입니다. 여기서도 JSONDecodeError가 나오지만 원인은 다릅니다. stream true 응답을 한 객체로 읽어 Extra data가 난 경우라서, 앞 글의 프롬프트 문제와 나란히 놓으면 같은 오류 이름이 서로 다른 지점을 가리킨다는 것이 보입니다. 플러그인 표시 이름으로 조회해 생긴 KeyError는 community-plugins.json의 id로, llama3 호출의 HTTP 404는 그 컴퓨터의 /api/tags에 있는 모델 이름으로 풀었습니다.

앱이 모델 태그 대신 별칭을 부르는 구성이라면 LiteLLM 프록시 NotFoundError, fallbacks로 로컬 모델에 넘기기로 갑니다. 별칭 main이 장비에 없는 태그를 가리켜 NotFoundError가 난 요청을 router_settings.fallbacks로 qwen2.5-0.5b-local에 넘겼고, 요청 단위로 폴백을 끈 경우와 프록시 없이 Ollama의 OpenAI 호환 주소를 바로 부른 경우를 같은 서버에서 비교했습니다. 앞의 두 글이 이름과 형식을 맞추는 이야기였다면, 이 글은 그 이름을 별칭 하나로 묶은 뒤 생기는 일을 다룬 셈입니다.

GPU 없는 장비에서 음성과 이미지 다루기

faster-whisper metadata_errors TypeError, av 18.1.0으로 전사 성공은 Debian 13의 CPU 환경에서 짧은 한국어 mp3를 전사하는 글입니다. faster-whisper 1.2.1과 PyAV 19.0.1 조합은 open()이 metadata_errors 키워드를 받지 않아 TypeError로 멈췄고, faster-whisper는 그대로 두고 av만 18.1.0으로 고정하자 language=ko 전사가 끝났습니다. av 19.0.1을 유지하고 싶을 때 업스트림 커밋 2ce7f9d를 설치해 다시 전사한 결과도 실려 있습니다.

이미지 쪽 두 글은 같은 CPU 전용 PyTorch에서 출발하지만 멈춘 자리가 다릅니다. ComfyUI Torch not compiled with CUDA enabled, CPU 모드로 기동은 ComfyUI 서버가 --cpu 없이 기동하다 CUDA 미지원 오류로 종료된 경우이고, 그 옵션을 붙이자 /system_stats가 HTTP 200과 장치 cpu를 돌려줬습니다. tiny-sd CUDA AssertionError, CPU 전용 PyTorch로 PNG 저장은 ComfyUI 없이 diffusers 파이프라인을 스크립트에서 부르다 to("cuda")에서 AssertionError가 난 경우입니다. 장치를 cpu로 고정하고 use_safetensors=False로 두자 스텝 1, guidance 1.0으로 256×256 RGB PNG가 저장됐습니다. 서버 프로세스를 띄우는 문제인지, 내 코드가 장치를 지정하는 문제인지에 따라 둘 중 하나를 고르면 됩니다.

지금 막힌 곳에 따라 들어갈 글

모델 다운로드가 막혔다면 로컬 GGUF 글부터, 모델 크기와 컨텍스트를 정해야 한다면 메모리 계산 글부터 읽습니다. 응답을 코드에서 파싱하다 JSONDecodeError를 만났다면 5요소 프롬프트 글과 옵시디언 글을 나란히 보고 원인이 프롬프트인지 스트리밍인지 가려 보십시오. 여러 앱이 모델을 별칭으로 부르게 하려면 LiteLLM 글이, 한국어 음성 전사는 faster-whisper 글이, GPU 없는 이미지 생성은 ComfyUI와 tiny-sd 두 글이 해당합니다.

각 글의 버전, 요금, 한도 정보는 글마다 적힌 확인 기준일 시점의 내용입니다. 사용 전에 공식 문서를 다시 확인하세요.