1편에서 GPU 없이 로컬 LLM을 띄웠고, 2편에서 한국어엔 Qwen2.5-3B가 낫다는 걸 실측으로 확인했습니다. 이제 마지막 단계 — 이 로컬 LLM을 실제 자동화에 연결합니다. llama.cpp를 OpenAI 호환 API 서버로 띄우고, n8n 워크플로우에 붙여서 일을 시켜 봤습니다. 결론부터: n8n이 로컬 LLM을 호출해 nginx 에러 로그를 “ERROR”로 정확히 분류하는 데까지 성공했습니다. API 요금 0원, 전부 홈랩 안에서.
1. llama-server로 OpenAI 호환 API 띄우기
llama.cpp에는 llama-server라는 실행 파일이 함께 빌드됩니다(1편 참고). 이걸 띄우면 OpenAI의 /v1/chat/completions와 똑같은 형식의 API가 생깁니다.
여기서 OpenAI 호환이라는 점이 핵심입니다. 세상의 수많은 도구·라이브러리·자동화 노드가 이미 “OpenAI API 형식”을 표준으로 지원하니까, URL만 내 홈랩 서버로 바꾸면 그대로 붙습니다. 외부에 돈 내고 부르던 걸 로컬로 갈아끼우는 셈이죠. --host 0.0.0.0은 같은 네트워크의 다른 기기(n8n 등)에서 접근하게 열어 주는 옵션입니다.
2. API가 진짜 되는지 먼저 확인
워크플로우에 붙이기 전에 curl로 직접 찔러 봤습니다.
curl http://127.0.0.1:8080/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "qwen2.5-3b",
"messages": [{"role":"user","content":"홈랩 자동화에 로컬 LLM을 쓰면 좋은 점 한 문장."}],
"temperature": 0.3
}'
실제 응답(발췌)입니다.
"content": "로컬 LLM은 ... 홈랩 로그의 특징을 정확하게 분류하는 데 유용할 수 있습니다.",
"usage": { "prompt_tokens": 60, "completion_tokens": 50, "total_tokens": 110 }
토큰 사용량까지 OpenAI와 똑같은 스키마로 돌아옵니다. 이제 이걸 자동화 도구에 물릴 차례입니다.
3. n8n 설치 — 여기서 함정을 밟았다
자동화 도구로는 오픈소스 워크플로우 툴 n8n을 골랐습니다. 그런데 설치가 한 번에 되지 않았습니다. 최신 Debian(13)에서 npm install -g n8n이 네이티브 모듈(isolated-vm) 빌드 단계에서 죽더군요.
ModuleNotFoundError: No module named 'distutils'
gyp ERR! configure error
npm ERR! ... isolated-vm ... not ok (exit 127)
원인은 Python 3.12에서 distutils가 표준 라이브러리에서 제거됐기 때문입니다. 기본 저장소의 구버전 Node/node-gyp가 이걸 아직 참조해서 빌드가 깨진 거죠. 해결은 최신 Node로 교체하는 것이었습니다.
Node 22로 바꾸니 네이티브 모듈이 정상 빌드되고 n8n(2.35)이 깔렸습니다. 스펙표엔 안 나오는, 직접 깔아 봐야 아는 함정이라 그대로 남겨 둡니다 — 같은 에러를 만날 분이 분명 있을 테니까요.
4. n8n 워크플로우 구성 — 로그 분류기
실용적인 예로 “로그 한 줄을 INFO / WARN / ERROR로 분류”하는 워크플로우를 만들었습니다. 구조는 단순합니다.
Manual Trigger — 실행 시작
HTTP Request — 로컬 LLM 호출
HTTP Request 노드 설정이 전부입니다.
필드
값
Method
POST
URL
http://<llama-server-IP>:8080/v1/chat/completions
Body
JSON (아래)
{
"model": "qwen2.5-3b",
"messages": [
{ "role": "system", "content": "너는 로그 분류기다. 입력 로그를 INFO/WARN/ERROR 중 하나로만 답하라." },
{ "role": "user", "content": "nginx: upstream timed out (110: Connection timed out) while reading response header" }
],
"temperature": 0
}
n8n과 llama-server가 같은 호스트면 127.0.0.1, 다른 기기면 서버의 홈랩 IP를 넣으면 됩니다. system 메시지로 “분류기” 역할을 못 박고 temperature: 0으로 답을 고정한 게 포인트입니다.
5. 실행 결과 — 로컬 LLM이 정확히 판단했다
워크플로우를 실행했습니다. n8n의 실제 실행 결과(요약)입니다.
status: "success"
Local LLM 노드 → message.content: "ERROR"
timings: prompt 46 tok/s, generation 13.65 tok/s (노드 실행 1.4초)
nginx의 upstream 타임아웃 로그를 로컬 LLM이 정확히 “ERROR”로 분류했습니다. GPU도, 외부 API도, 요금도 없이 내 홈랩 안에서 자동화 파이프라인의 부품으로 로컬 LLM이 동작한 순간입니다. 이제 이 노드 앞뒤에 트리거·알림만 붙이면 실제 운영 자동화가 됩니다.
6. 이걸로 뭘 할 수 있나
로그·알림 분류: 서버 로그를 등급으로 분류해 ERROR만 텔레그램으로 즉시 알림
요약: 긴 문서·메일·뉴스를 로컬에서 요약(데이터가 외부로 안 나감)
정형화: 자유 텍스트를 JSON·태그로 구조화
핵심 이점은 비용과 프라이버시입니다. 외부 LLM API는 호출마다 돈이 들고 데이터가 밖으로 나가지만, 로컬 LLM은 몇 번을 부르든 0원이고 데이터가 홈랩을 벗어나지 않습니다. 실시간 초고성능이 필요한 게 아니라 배치·자동화 용도라면, GPU 없는 홈랩 CPU로도 충분히 실전에서 굴릴 수 있습니다.
시리즈를 마치며
1편 설치 → 2편 모델 선택 → 3편 자동화 연동까지, GPU 없는 i5 미니 PC 한 대로 로컬 LLM을 실전에 투입하는 전 과정을 직접 해봤습니다. “로컬 AI는 그래픽카드 있어야 한다”는 편견은, 적어도 3B급 자동화 용도에선 사실이 아닙니다. 여러분의 홈랩에도 하나 올려 보시길 권합니다.
지난 1편에서 GPU 없는 i5 홈랩에 llama.cpp를 올리고 Qwen2.5-3B 하나를 돌려봤습니다. 그러자 당연한 질문이 남습니다 — “그럼 다른 모델은? 어떤 게 제일 나은데?” 그래서 소형 모델 3종을 완전히 같은 조건에서 돌려 속도와 한국어 품질을 실측했습니다. 결론부터 말하면, 한국어로 쓸 거면 Qwen2.5-3B가 1순위입니다. 그런데 그 과정에서 예상 못 한 함정도 하나 밟았습니다(마지막에).
예상대로 Gemma 2 2B가 가장 빠릅니다. 파라미터가 2.6B로 가장 작으니 당연한 결과죠. Qwen과 Llama는 둘 다 3B급이라 속도는 사실상 동률(생성 13토큰대)입니다. 즉 속도만 보면 크기 순서 그대로이고, 셋 다 CPU에서 실사용 가능한 범위입니다. 그럼 승부는 품질에서 갈립니다.
3. 한국어 품질 — 여기서 갈린다
세 모델에 똑같은 질문을 던졌습니다.
홈 서버 초보자에게 SSH 키 인증이 비밀번호 방식보다
안전한 이유를 3문장으로 설명해줘.
아래는 각 모델의 실제 출력입니다(발췌, 가공 없음).
Qwen2.5-3B — 자연스럽고 정확
SSH 키 인증은 비밀번호 방식보다 보안이 더 강화되어 있으며, 키는 암호화되어 있어 단방향으로 전송되어야 하므로 공유되는 데이터가 아닌 개인의 비밀로 보호됩니다. 이는 공유된 컴퓨터 환경에서 특히 중요한 요소이며, 악의적인 공격자가 비밀번호를 해독하는 것은 더 어렵습니다.
문장이 매끄럽고 내용도 맞습니다. 3B 소형 모델 치고 한국어 완성도가 확실히 높습니다.
Gemma 2 2B — 무난하고 가볍다
SSH 키 인증은 비밀번호 방식보다 더 안전하며, 이유는 첫째, SSH 키는 개인이 직접 생성하고 유지하며, 둘째, SSH 키는 서버와 사용자 간의 연결을 위한 신뢰도를 높이고, 셋째, 키는 암호화 방식으로 사용하여 비밀을 유지한다는 점 때문이다.
2.6B밖에 안 되는데 한국어가 깔끔합니다. 요청한 “첫째·둘째·셋째” 구조도 잘 지켰고요. 내용 깊이는 Qwen보다 살짝 얕지만, 가장 빠르면서도 한국어가 무너지지 않는다는 게 강점입니다.
Llama 3.2 3B — 한국어가 무너진다
1. mật secret.key는 해킹자가 쉽게 obten할 수 있는 sensitive information이 아니기 때문입니다. …
2. secret.key는 해킹자가 얻어도 사용할 수 있는 information이기 때문에 … (2·3번 문장 거의 동일하게 반복)
가장 크고(3.21B) 유명한 모델인데, 한국어는 셋 중 최악이었습니다. 외국어(“mật”, “obten”, “information”)가 뒤섞이고, 같은 문장을 반복하고, 내용도 부정확했습니다. Llama 3.2는 영어 중심으로 학습돼 소형 버전의 한국어가 약합니다. 영어로 쓸 거면 몰라도, 한국어 용도로는 비추천입니다.
4. 내가 밟은 함정 — Llama 3.2가 메모리를 터뜨렸다
사실 Llama 3.2는 처음에 실행하자마자 죽었습니다. 로그를 보니 Killed, 종료 코드 137(OOM). 8GB나 비어 있는데 왜?
원인은 기본 컨텍스트 길이였습니다. Llama 3.2는 학습 컨텍스트가 128K 토큰이라, 옵션을 안 주면 llama.cpp가 그 거대한 KV 캐시를 통째로 잡으려다 메모리를 초과합니다. Qwen·Gemma는 기본값이 작아 문제없었던 것이죠. 해결은 간단합니다 — 컨텍스트를 명시적으로 제한하면 됩니다.
# -c 로 컨텍스트를 4096으로 제한하면 정상 동작
./build/bin/llama-cli \
-m /root/models/Llama-3.2-3B-Instruct-Q4_K_M.gguf \
-c 4096 -p "..." -n 200 -t 4 -st
홈랩처럼 RAM이 넉넉하지 않은 환경에서 큰 컨텍스트 모델을 돌릴 땐 -c를 습관처럼 붙이는 게 안전합니다. 이건 스펙표만 봐선 절대 모르고, 직접 돌려봐야 아는 함정입니다.
5. 결론 — 용도별 추천
우선순위
추천 모델
이유
한국어 품질
Qwen2.5-3B
가장 자연스럽고 정확. 홈랩 한국어 1순위
속도·초경량
Gemma 2 2B
가장 빠르고 가벼우면서 한국어도 무난
영어 전용
Llama 3.2 3B
한국어는 약함. 영어 작업엔 선택지
제 결론은 “한국어 홈랩 CPU 추론이면 Qwen2.5-3B를 기본으로, 더 가볍고 빠르게 가고 싶으면 Gemma 2 2B”입니다. 파라미터 수나 유명세가 아니라, 같은 조건에서 직접 돌려본 결과가 이렇게 갈립니다.
다음 편 예고
이제 쓸 만한 모델을 골랐으니, 다음 편에서는 llama-server로 OpenAI 호환 API를 띄우고, 이걸 n8n 자동화에 연결해 실제로 일을 시키는 과정을 정리하겠습니다. 로컬 LLM이 장난감을 넘어 파이프라인의 부품이 되는 단계입니다.
“로컬 LLM 돌리려면 그래픽카드부터 사야지” — 대부분 이렇게 알고 계실 겁니다. 그런데 제 홈랩엔 외장 그래픽카드가 없습니다. Intel i5-8500에 내장그래픽(UHD 630)뿐이라 CUDA는 애초에 못 씁니다. 그래서 직접 해봤습니다 — GPU 없이 CPU만으로 로컬 LLM을. 결론부터 숫자로 말하면, 3B 모델이 초당 13.85토큰으로 돌아갑니다. 읽는 속도보다 빠릅니다. 설치부터 첫 구동, 실측까지 그대로 공개합니다.
1. 왜 CPU인가 — GPU 없는 홈랩의 현실
홈랩용 미니 PC나 중고 서버엔 외장 GPU가 없는 경우가 훨씬 많습니다. 전력·발열·가격 때문이죠. 제 환경도 그렇습니다.
CPU: Intel i5-8500 (6코어) — AVX2 지원
GPU: Intel UHD 630 내장그래픽뿐 → NVIDIA/CUDA 경로 불가
많은 “로컬 LLM 설치” 글이 NVIDIA Driver + CUDA 설치부터 시작하는데, 그래픽카드가 없으면 그 글은 무용지물입니다. 다행히 llama.cpp는 순수 CPU 추론을 제대로 지원하고, 소형 양자화 모델이라면 CPU로도 충분히 쓸 만합니다. 이 글은 정확히 그 경우를 다룹니다.
2. 실제 구성 — LXC 컨테이너로 격리
호스트에 직접 깔지 않고 Proxmox LXC 컨테이너 하나를 새로 만들어 그 안에 구축했습니다. 이유는 단순합니다 — 빌드 도구·모델 파일이 호스트를 어지럽히지 않게 격리하고, 실험이 꼬이면 컨테이너째 버리면 되니까요.
항목
할당
비고
OS
Debian 13 (trixie)
gcc 14.2 / cmake 3.31
vCPU
4코어
추론 스레드 4개
RAM
8GB
3B 모델(1.8GB) + 여유 충분
디스크
24GB
빌드 + 모델 몇 개
3B 모델은 8GB면 넉넉합니다. 오히려 CPU 추론에서 진짜 자원은 메모리 대역폭이라, 코어를 무작정 늘린다고 비례해서 빨라지지 않습니다(뒤에서 실측).
./build/bin/llama-cli \
-m /root/models/Qwen2.5-3B-Instruct-Q4_K_M.gguf \
-p "홈랩에서 GPU 없이 CPU만으로 로컬 LLM을 돌릴 때의 장점 3가지를 간단히 알려줘." \
-n 220 -t 4 -st
실제로 나온 답변입니다(가공 없음).
GPU 없이 CPU만으로 로컬 LLM을 실행할 때의 장점은 다음과 같습니다:
1. 비용 절감: GPU가 필요하지 않아 소프트웨어 구동에 필요한 비용을 줄일 수 있습니다.
2. 컴퓨팅 능력: CPU는 보통 GPU보다 더 저렴한 가격과 더 적은 부피를 가지고 있지만, 특정 작업에는 충분한 컴퓨팅 능력을 제공할 수 있습니다.
3. 편리성: CPU가 설치된 컴퓨터를 사용하면, 별도의 GPU 장치 구매나 설치 없이도 로컬 LLM을 실행할 수 있습니다.
마크다운 서식까지 알아서 잡아 줍니다. 3B 소형 모델이라 아주 복잡한 추론은 무리지만, 요약·번역·분류·간단한 글쓰기 같은 실무 자동화용으로는 충분한 품질입니다.
핵심은 생성 속도 13.85 tok/s입니다. 한국어 기준 사람이 눈으로 읽는 속도가 대략 초당 7~10토큰 남짓이니, 읽는 것보다 빠르게 답이 흘러나옵니다. 대화형으로 써도 답답하지 않고, 모델 파일이 1.8GB라 8GB 컨테이너에 메모리도 여유롭습니다. “GPU 없으면 로컬 LLM은 못 쓴다”는 편견이 3B급에서는 사실이 아닙니다.
7. CPU-only의 한계 — 정직하게
큰 모델은 느립니다. 14B·32B급으로 가면 CPU에선 초당 1~3토큰으로 뚝 떨어져 실시간 대화엔 부적합합니다. CPU의 스윗스팟은 3B~8B입니다.
코어 늘린다고 비례하지 않습니다. CPU 추론은 메모리 대역폭에 묶여서, 스레드를 물리 코어 이상으로 올리면 오히려 손해입니다. 코어 수보다 -DGGML_NATIVE=ON 빌드가 더 큰 차이를 냅니다.
진짜 큰 모델·낮은 지연이 필요하면 그때 GPU를 고민하면 됩니다. 하지만 요약·번역·자동화 파이프라인 용도라면 3B CPU로 충분합니다.
다음 편 예고
1편은 “일단 돌린다”였습니다. 다음 편에서는 모델별 실측 비교(Qwen2.5-3B vs Gemma 2 vs Llama 3.2, 속도·한국어 품질)를 다루고, 그다음 편에서는 llama-server로 API를 띄워 n8n·자동화에 로컬 LLM을 연동하는 실전을 정리하겠습니다. GPU 없는 홈랩에서도 충분히 갈 수 있습니다.
홈랩 AI 성능이 궁금해서 장비를 하나씩 꺼내 비교해보신 적 있으신가요? 저도 홈랩에 굴러다니던 Jetson Nano와 예전에 쓰던 구형 GPU 장비를 다시 올려서 AI 추론(Inference, 학습이 아니라 이미 학습된 모델을 실행하는 과정) 성능을 비교해봤습니다. 처음엔 “둘 다 오래된 장비인데 큰 차이 있겠어?” 싶었는데, 막상 돌려보면 체감 포인트가 꽤 다르더라고요. 특히 로컬 LLM(Local LLM, 인터넷 없이 내 장비에서 직접 돌리는 언어 모델) 쪽은 숫자 하나보다 메모리, 전력, 드라이버, 발열이 훨씬 중요했습니다.
이 글은 막연한 감상문이 아니라, 홈랩에서 재현 가능한 기준으로 Jetson Nano와 구형 GPU를 어떻게 비교하면 되는지 정리한 글입니다. 직접 삽질하면서 느낀 점도 담았고, 어떤 항목을 봐야 실제 운영에 도움이 되는지도 같이 풀어보겠습니다. 집에서 소형 AI 노드 하나 만들어보려는 분이라면 꽤 실용적으로 보실 수 있을 거예요.
Jetson Nano, 구형 GPU 데스크톱, NAS 또는 측정용 노트북이 함께 연결된 홈랩 AI 벤치마크 구성 예시입니다.
왜 홈랩 AI 성능 비교에서 Jetson Nano와 구형 GPU를 같이 봐야 할까
쉽게 말해 둘은 출발점이 다릅니다. Jetson Nano는 소형 엣지 장비(edge device)라 전력과 크기에서 강점이 있고, 구형 GPU는 데스크톱이나 워크스테이션에 꽂아 순간 성능을 끌어올리는 쪽에 가깝습니다. 그래서 같은 AI 추론이라도 쓰임새가 달라집니다. 장비 하나만 보고 결론 내리면 생각보다 자주 틀립니다.
Jetson Nano: 저전력, 작은 크기, GPIO 같은 확장성, 카메라 연동이 편합니다.
구형 GPU: 절대 성능이 더 잘 나오는 경우가 많고, 로컬 개발 환경을 맞추기 쉽습니다.
로컬 LLM: 둘 다 시도는 가능하지만, Jetson Nano는 모델 크기와 메모리 제약을 아주 강하게 탑니다.
비용 관점: 이미 가지고 있는 장비를 재활용하면 가성비가 좋아집니다.
여기서 중요한 포인트가 하나 있습니다. 벤치마크는 단순히 “누가 더 빠르냐”가 아닙니다. 홈랩에서는 보통 아래 네 가지를 같이 봐야 해요.
항목
Jetson Nano
구형 GPU
홈랩 관점 해석
전력 효율
강점
상대적으로 불리
24시간 운영이면 중요합니다.
순간 추론 속도
제한적
유리한 경우 많음
대화형 응답 체감에 영향이 큽니다.
설치 난이도
JetPack 계열 의존성 큼
드라이버와 CUDA 조합 확인 필요
막히는 지점이 서로 다릅니다.
용도 적합성
비전, 센서 연동, 경량 워크로드
실험, 로컬 LLM, 배치 추론
목적을 먼저 정하는 게 맞습니다.
홈랩 AI 성능 비교에서 꼭 맞춰야 하는 기준
처음에는 장비마다 되는 모델을 그냥 올려서 돌렸거든요. 그런데 그렇게 하면 결과가 사실상 의미가 없습니다. 벤치마크(Benchmark, 성능 비교 테스트)는 조건을 맞춰야 비교가 됩니다. 이 부분을 대충 넘기면 로그는 많이 남는데 결론은 흐려지더라고요.
가능하면 같은 모델을 씁니다.
같은 양자화(Quantization, 모델을 더 작은 정밀도로 압축하는 방식) 옵션을 씁니다.
입력 길이와 스레드 수를 고정합니다.
첫 실행과 반복 실행을 구분합니다.
속도뿐 아니라 메모리와 발열도 기록합니다.
특히 로컬 LLM은 첫 토큰 시간(Time To First Token)과 초당 토큰 수(tokens per second)를 같이 봐야 합니다. 반면 이미지 분류나 객체 탐지처럼 전형적인 엣지 AI 워크로드는 지연 시간(latency)과 초당 처리량(throughput)이 더 중요하죠. 그래서 저는 홈랩에서 보통 두 갈래로 나눠 봅니다.
LLM 계열: 응답 생성 속도, 메모리 사용량, 프롬프트 길이 영향
비전 계열: 프레임 처리 속도, 추론 지연, 장시간 안정성
이번 글에서는 제목에 맞춰 AI 추론과 로컬 LLM 기준으로 설명하되, Jetson Nano의 특성을 고려해서 “무리한 대형 모델” 대신 “경량 모델 또는 CPU 기준 테스트” 중심으로 접근하겠습니다. Jetson Nano는 실사용 자체는 가능하지만, 최신 데스크톱 GPU처럼 여유 있게 돌리는 그림과는 거리가 있습니다.
실전 비교 환경 설계: 이렇게 맞추면 덜 틀립니다
실제로 써보니까 결과를 망치는 건 코드보다 환경 차이였습니다. 그래서 저는 아래처럼 아주 보수적으로 기준을 잡습니다. 조금 답답할 정도로 조건을 고정해두면 나중에 표를 볼 때 훨씬 덜 헷갈려요.
여기서 팁 하나 드리면, Jetson Nano는 “된다/안 된다”의 경계가 생각보다 명확합니다. 모델이 조금만 커져도 스와핑(swapping, 메모리를 디스크로 넘기는 현상) 때문에 체감 성능이 급격히 무너집니다. 반대로 구형 GPU는 드라이버만 잘 맞으면 의외로 꽤 버텨줍니다. 그래서 홈랩 AI 성능을 볼 때는 최고점보다 지속 가능한 설정을 찾는 게 더 중요합니다.
동일 모델, 동일 프롬프트 길이, 반복 횟수, 메모리 기록 항목을 정리한 벤치마크 설계 화면 예시입니다.
실전 구현 1: 벤치마크 도구 준비
재현성과 단순함 때문에 저는 llama.cpp 계열 도구를 기준점으로 잡는 편입니다. 공식 저장소에서 <code>llama-cli와 llama-bench를 함께 쓸 수 있어서 비교 작업이 단순하거든요. 물론 Jetson Nano에서 최신 대형 모델을 기대하면 실망하기 쉽습니다. 여기서는 작은 GGUF 양자화 모델을 기준으로 “돌아가는지, 얼마나 버티는지”를 보는 쪽이 현실적입니다.
여기서 주의하실 점이 있습니다. 구형 GPU는 CUDA 지원 범위가 카드 세대와 드라이버 조합에 따라 갈립니다. 그래서 “CUDA 빌드가 되느냐” 자체가 1차 체크포인트예요. 안 되면 억지로 붙잡지 말고 CPU 기준선부터 확보하세요. 저도 처음엔 드라이버만 붙잡고 시간 꽤 날렸습니다.
5. 시스템 상태 확인
uname -a
free -h
htop
Jetson Nano에서는 가능하면 별도 터미널에서 리소스를 같이 보는 게 좋습니다. tegrastats는 Jetson Linux에서 기본 제공되는 모니터링 도구라 실사용할 때 꽤 편합니다.
tegrastats
구형 NVIDIA GPU 시스템에서는 아래 명령으로 GPU 상태를 같이 확인합니다.
nvidia-smi
실전 구현 2: 벤치마크 실행과 기록 자동화
실제 비교는 손으로 돌리면 금방 꼬입니다. 입력 길이 하나 바뀌고, 스레드 하나 바뀌면 결과가 달라지거든요. 그래서 아주 단순한 기록 스크립트라도 두는 편이 낫습니다. 복잡한 자동화보다 조건 고정이 먼저예요.
mkdir -p ~/bench-results
MODEL_PATH=/path/to/model.gguf
THREADS=4
PROMPT="홈랩에서 로컬 LLM을 운영할 때 가장 중요한 자원은 무엇인가요?"
./build/bin/llama-bench -m "$MODEL_PATH" | tee ~/bench-results/bench_cpu.txt
./build/bin/llama-cli -m "$MODEL_PATH" -t $THREADS -p "$PROMPT" -n 64 | tee ~/bench-results/run_cpu.txt
위 예시는 CPU 기준선 확인용입니다. 먼저 이 값을 잡아두면 나중에 GPU 오프로딩이나 다른 장비를 붙였을 때 비교가 훨씬 쉬워집니다.
MODEL_PATH=/path/to/model.gguf
THREADS=4
PROMPT="Jetson Nano와 구형 GPU의 추론 특성을 비교해 주세요."
./build/bin/llama-bench -m "$MODEL_PATH" | tee ~/bench-results/bench_gpu.txt
./build/bin/llama-cli -m "$MODEL_PATH" -t $THREADS -ngl 20 -p "$PROMPT" -n 64 | tee ~/bench-results/run_gpu.txt
-ngl처럼 GPU 레이어 오프로딩 옵션은 지원 카드와 빌드 방식에 따라 체감 차이가 큽니다. 그래서 GPU 시스템에서는 값을 조금씩 올려가며 확인하는 방식이 가장 현실적이었습니다. 한 번에 정답 값을 찾으려 하면 오히려 더 오래 걸리더라고요.
조금 더 정리된 로그를 남기고 싶다면 Python으로 타임스탬프만 붙여도 충분합니다.
import subprocess
import time
from pathlib import Path
out_dir = Path.home() / "bench-results"
out_dir.mkdir(exist_ok=True)
log_file = out_dir / "session.log"
cmd = [
"./build/bin/llama-cli",
"-m", "/path/to/model.gguf",
"-t", "4",
"-p", "홈랩 AI 성능 비교 테스트를 시작합니다.",
"-n", "64",
]
start = time.time()
result = subprocess.run(cmd, capture_output=True, text=True)
elapsed = time.time() - start
with log_file.open("a", encoding="utf-8") as f:
f.write(f"time={elapsed:.2f}s\n")
f.write(result.stdout)
f.write("\n---\n")
print(result.stdout)
이 정도만 해도 홈랩에서는 충분합니다. 핵심은 연구 논문처럼 정교한 계측보다, 같은 조건으로 반복 가능한지를 확보하는 데 있습니다. 이게 쌓이면 나중에 장비 교체할 때도 판단이 훨씬 빨라져요.
벤치마크 실행 중 리소스 사용량과 추론 로그를 동시에 관찰하는 실제 운영 화면을 표현한 이미지입니다.
실제 겪었던 문제와 해결 방법
이 파트는 정말 중요합니다. 스펙표보다 도움이 더 많이 됩니다. 직접 해보니 아래 네 가지에서 가장 많이 막혔습니다.
1. Jetson Nano에서 메모리 부족
증상: 실행은 되는데 엄청 느리거나, 아예 프로세스가 죽습니다.
원인: 모델 크기, 컨텍스트 길이(context length), 스레드 수가 장비 한계를 넘긴 경우가 많습니다.
원인: 캐시, 발열 스로틀링(thermal throttling, 온도 때문에 성능이 낮아지는 현상), 백그라운드 작업 영향입니다.
해결:
최소 3회 반복합니다.
첫 실행은 워밍업(warm-up)으로 분리합니다.
장비 온도가 안정된 뒤 다시 측정합니다.
4. 로컬 LLM이 되긴 되는데 체감이 나쁨
이건 성능 숫자와 사용 경험이 다를 때 생깁니다. 초당 토큰 수가 아주 나쁘지 않아도 첫 토큰이 늦으면 답답하거든요. 그래서 저는 벤치마크 결과를 볼 때 “총 처리량”보다 “대화가 가능한가”를 먼저 봅니다. 홈랩 장비는 특히 그렇습니다. 이 차이가 실제 만족도를 꽤 크게 갈라요.
홈랩 AI 성능 검증과 결과 해석: 숫자보다 중요한 것
이제 결과를 어떻게 읽을지 이야기해보겠습니다. 정확한 수치를 여기서 단정적으로 적지는 않겠습니다. 장비 상태, 모델 크기, 양자화, 드라이버 조합에 따라 차이가 꽤 크거든요. 대신 여러 번 비교하면서 거의 공통적으로 느낀 경향은 있습니다.
Jetson Nano는 경량 추론이나 엣지 연동에서 매력이 큽니다.
구형 GPU는 전력과 소음은 불리해도, 로컬 실험용 추론 체감은 더 좋은 경우가 많습니다.
로컬 LLM은 Jetson Nano에서 “가능 여부”를 먼저 확인해야 하고, 구형 GPU는 “쓸 만한 응답 속도”가 나오는지 확인하면 됩니다.
홈랩 AI 성능은 절대 속도보다도 안정적으로 몇 시간 돌릴 수 있는지가 더 중요합니다.
제가 추천하는 결과 기록 방식은 아래처럼 아주 단순한 표입니다.
테스트 항목
Jetson Nano
구형 GPU
메모
부팅 후 준비 시간
기록
기록
드라이버 초기화 포함
모델 로드 체감
느림/보통/빠름
느림/보통/빠름
주관 평가도 같이 적기
첫 토큰 반응
기록
기록
대화형 사용성 핵심
반복 실행 안정성
좋음/보통/불안정
좋음/보통/불안정
발열 영향 체크
장시간 운영 적합성
높음
중간
전력과 소음도 반영
결론만 빨리 말씀드리면 이렇습니다. Jetson Nano는 “작고 오래 도는 노드”, 구형 GPU는 “실험이 빠른 노드”로 보는 게 맞았습니다. 둘 중 하나가 절대 우위라기보다 역할이 다르더라고요.
응답 속도, 메모리 사용량, 안정성 항목을 한눈에 비교하는 홈랩 AI 성능 결과 대시보드 이미지입니다.
어떤 장비를 고르면 좋을까
이 부분은 가장 많이들 궁금해하시는 대목이죠. 제 경험으로는 목적을 먼저 정하면 선택이 훨씬 쉬워집니다. 성능표보다 운영 방식이 더 중요할 때가 정말 많습니다.
센서, 카메라, 경량 추론이 목적이면 Jetson Nano가 잘 맞습니다.
로컬 LLM 체험과 빠른 반복 실험이 목적이면 구형 GPU가 유리합니다.
24시간 홈랩 운영이 중요하면 전력과 발열부터 계산하세요.
개발 생산성이 중요하면 드라이버와 빌드 편의성도 성능만큼 중요합니다.
홈랩은 “최신 장비가 답”인 분야가 아니었습니다. 남는 장비를 얼마나 목적에 맞게 배치하느냐가 훨씬 중요하더라고요. 저도 처음엔 큰 모델만 쫓아갔는데, 실제로는 작은 모델을 빠르고 안정적으로 돌리는 구성이 더 자주 쓰였습니다.
전력 효율, 추론 속도, 소음, 설치 난이도 기준으로 두 장비를 선택하는 요약 인포그래픽입니다.
정리와 다음 단계
이번 홈랩 AI 성능 비교에서 핵심은 단순했습니다. Jetson Nano와 구형 GPU는 같은 AI 추론 장비처럼 보여도 실제 운영 포인트가 다릅니다. Jetson Nano는 저전력 엣지 추론에, 구형 GPU는 로컬 LLM 실험과 반응성 확보에 더 어울립니다. 직접 해보니 숫자 하나보다 메모리 한계와 발열, 그리고 드라이버 삽질 시간이 결과를 더 크게 좌우했습니다.
다음 글에서는 실제로 홈랩에서 작은 모델을 올려 API 서버 형태로 붙이는 방법, 예를 들면 FastAPI 기반 추론 엔드포인트나 reverse proxy 구성까지 이어서 다뤄볼 예정입니다. 이전 글에서 다룬 홈서버 리소스 모니터링 구성과 함께 보시면 흐름이 더 잘 잡힐 거예요.
자주 묻는 질문
Jetson Nano로 로컬 LLM 운영이 가능할까요?
가능은 하지만 모델 크기와 양자화 수준에 따라 체감이 크게 달라집니다. 기대치를 낮추고 경량 구성부터 시작하는 편이 훨씬 낫습니다.
구형 GPU가 항상 더 좋은가요?
항상 그렇진 않습니다. 전력, 소음, 공간, 안정성까지 같이 보면 홈랩에서는 Jetson Nano가 더 좋은 선택일 때도 있습니다.
벤치마크에서 가장 먼저 기록할 값은 뭔가요?
첫 토큰 반응 시간, 반복 실행 안정성, 메모리 부족 여부부터 보시면 됩니다. 이 세 가지가 실제 체감과 가장 잘 연결됩니다.