AI VIDEO BRIEFING
Ollama + Gemma 3로 LLM 셀프 호스팅하기 — API 키 없이 내 서버에서 모델 운영하는 법
Ollama 런타임과 Gemma 3 4B 모델로 API 키 없이 직접 LLM을 서버에서 돌리는 방법, 필요한 사양과 스트리밍 채팅 앱 구성, 셀프 호스팅과 호스팅 API의 장단점을 정리한다.

핵심 메시지
쉽게 이해하기
이 영상은 OpenAI나 Anthropic의 API 키, 토큰당 과금 없이 내가 통제하는 서버에서 실제 LLM을 직접 돌리는 과정을 보여 준다. 먼저 핵심 구분부터 정리한다. Ollama는 모델을 메모리에 올리고 요청을 처리하는 런타임으로, 그 자체로는 아무 일도 하지 않지만 모델을 '실행하는 법'을 안다. JVM에 비유할 수 있다. 반면 Gemma, Llama, Mistral, Qwen은 텍스트를 만들어 내는 수 기가바이트짜리 가중치 파일, 즉 모델이다. 모델은 언제든 새로 받아 교체할 수 있다.
노트북에서도 가능하지만 권장되지 않는다. 노트북은 잠자기 모드로 들어가고 모델은 RAM을 많이 먹기 때문이다. 항상 켜져 있고 충분한 RAM을 가진 서버가 필요하다. 메모리와 CPU가 일반 웹 앱보다 더 중요하며, 모델 파일이 크기 때문에 빠른 NVMe SSD 저장소가 콜드 스타트 속도에 영향을 준다. 영상에서는 Gemma 3 4B가 디스크에서 약 3.3GB, 4비트 버전이 실사용 시 약 3~5GB RAM을 차지하고, 7B 모델은 4비트로 5~7GB가 필요하다고 설명한다.
설치 후에는 모델을 내려받아 첫 요청을 보낸다. 첫 요청은 모델을 RAM에 올리느라 몇 초 걸리지만 이후 프롬프트는 빠르다. 모델이 로드되면 약 4~5GB의 RAM을 쓴다. 셀프 호스팅은 공짜가 아니라 토큰당 과금 대신 고정 월 비용을 내는 것이며, 트래픽이 적고 산발적이면 호스팅 API가 대개 더 싸고, 트래픽이 꾸준하거나 프라이버시 제약이 있으면 셀프 호스팅이 유리하다.
코드에서 호출할 때 Ollama는 줄곧 REST API를 제공하고 있었다. 생성(generate) 엔드포인트에 간단한 프롬프트를 보내면 모델명·생성 텍스트·토큰 수·소요 시간이 담긴 표준 JSON을 돌려준다. 또한 OpenAI 호환 엔드포인트(v1/chat/completions)도 제공하므로, OpenAI SDK로 작성한 코드라면 base URL만 내 서버로 바꾸면 된다. 모든 OpenAI 엔드포인트가 미러링되는 것은 아니지만 일상적으로 쓰는 것들은 갖춰져 있다.
마지막으로 약 80줄짜리 스트리밍 채팅 앱을 만든다. 백엔드는 Node와 Express, 프런트는 순수 HTML이다. /chat 엔드포인트가 프롬프트를 받아 stream=true로 Ollama에 전달하고 토큰 스트림을 브라우저로 흘려보내, ChatGPT처럼 토큰이 실시간으로 나타난다. Ollama는 줄바꿈으로 구분된 JSON으로 스트리밍하는데, TCP 청크가 항상 JSON 한 줄에서 끊기지 않으므로 청크를 버퍼에 모아 줄 단위로 잘라 파싱해야 한다. 그러지 않으면 부분 줄에서 간헐적 JSON 파싱 오류가 난다.
주요 인사이트
- Ollama(런타임)와 모델을 구분하는 것이 출발점이다. 같은 런타임 위에서 모델만 새로 받아 교체할 수 있어, Llama·Mistral·Qwen·DeepSeek 등 다음에 나올 어떤 오픈 웨이트 모델로도 동일한 절차를 반복할 수 있다.
- 사양 선택이 일반 웹 앱과 다르다. 4비트 4B 모델 한 개와 작은 앱을 함께 돌리려면 8GB RAM이 빠듯하지만 가능하고, 7B 모델로 가려면 RAM을 더 늘려야 한다. 모델 파일이 크므로 NVMe SSD가 콜드 스타트에 유리하다.
- OpenAI 호환 엔드포인트 덕분에 기존 코드의 base URL 한 줄만 바꿔 OpenAI에서 자체 서버로 옮길 수 있다. 마이그레이션 장벽이 낮다는 점이 셀프 호스팅의 큰 매력이다.
- 포트를 공개 인터넷에 열 경우 반드시 인증을 추가해야 한다. Ollama는 기본적으로 인증이 꺼져 있으므로, 방화벽으로 앱 IP만 허용하거나 API 키를 둔 리버스 프록시를 앞단에 두어야 한다. 영상 예제는 앱과 Ollama를 같은 서버의 localhost로 통신시켜 포트를 아예 노출하지 않는다.
- 스트리밍 구현의 핵심은 버퍼링이다. TCP 청크가 JSON 한 줄 경계에서 끊기지 않아 한 줄이 두 청크에 걸칠 수 있으므로, 버퍼에 모아 줄바꿈으로 분리해 파싱해야 약 15번에 한 번씩 나타나는 무작위처럼 보이는 파싱 오류를 막을 수 있다.
자주 묻는 질문
Ollama와 Gemma는 무엇이 다른가?
Ollama는 모델을 메모리에 올려 요청을 처리하는 런타임으로 JVM에 비유된다. Gemma, Llama, Mistral, Qwen 등은 실제로 텍스트를 생성하는 수 기가바이트짜리 가중치 파일, 즉 모델이다. 같은 런타임 위에서 모델만 바꿔 끼울 수 있다.
LLM 셀프 호스팅에는 어떤 서버 사양이 필요한가?
항상 켜져 있고 모델을 담을 RAM이 충분한 서버가 필요하다. Gemma 3 4B는 디스크에서 약 3.3GB이고 4비트 버전이 실사용 시 약 3~5GB RAM을 쓰므로 8GB면 4B 모델과 작은 앱을 함께 돌릴 수 있다. 7B(4비트)는 5~7GB가 필요해 더 큰 메모리를 권한다.
기존 OpenAI SDK 코드를 그대로 쓸 수 있나?
대체로 가능하다. Ollama가 OpenAI 호환 엔드포인트(v1/chat/completions)를 제공하므로 base URL만 자체 서버로 바꾸면 된다. 모든 엔드포인트가 미러링되지는 않지만 일상적으로 쓰는 것들은 지원된다.
셀프 호스팅과 호스팅 API 중 무엇을 선택해야 하나?
셀프 호스팅은 학습, 프라이버시가 중요한 작업, 사이드 프로젝트·내부 도구, 저~중간 볼륨의 예측 가능한 비용, 오프라인 사용, 모델 버전 고정에 유리하다. 호스팅 API는 최첨단 성능, 고처리량 운영, 운영 부담 제로, 가장 큰 모델에 유리하다. 실제 시스템은 둘을 함께 쓰는 경우가 많다.
원문과 출처
이 글은 원본 영상의 자막을 바탕으로 한국어 독자를 위해 요약했습니다. 전체 맥락과 최신 정보는 원문에서 확인하세요.
YouTube 원본 영상 보기 ↗