ETYMOLOGY

Back

도서관 추천 앱에는 질문 문장을 벡터로 바꿔 책 14,278권과 비교하는 서버가 필요했다. 클라우드에 GPU 서버를 빌리는 대신, 집에 놀고 있던 노트북(i5 4코어, RAM 7.8GB, GPU 없음)을 서버로 썼다.

모델을 가볍게 만들기#

한국어 임베딩 모델 KURE-v1을 그대로 돌리면 메모리를 약 2GB 쓰고 질문 하나에 0.3초가 걸렸다. ONNX로 변환한 뒤 int8로 양자화했다.

방식 1위 일치(30문항) 속도 결정
PyTorch 동적 양자화 20/30 이득 거의 없음 불채택
ONNX int8 29/30 질문 1개 0.31초 → 0.039초 채택

결과 정확도는 상위 10권이 약 90% 겹칠 정도로 유지됐고, 서버 메모리는 약 1.3GB로 줄었다. 질문 여섯 개를 한 번에 보내도 60밀리초 안에 끝난다.

포트를 열지 않고 외부에 공개하기#

Cloudflare Tunnel을 썼다. 구조는 이렇다.

  • 집 PC의 cloudflared가 Cloudflare로 나가는 연결을 유지한다.
  • 방문자의 요청은 Cloudflare가 그 연결로 넘겨 준다.
  • 그래서 공유기 포트포워딩이 필요 없고, 집 IP가 드러나지 않고, HTTPS 인증서도 자동이다.

대가도 알아 두어야 한다. 암호화가 Cloudflare에서 한 번 풀리므로 요청과 응답 내용은 Cloudflare가 볼 수 있다. 그래서 민감한 내용은 이 경로에 싣지 않는다.

부팅하면 알아서 켜지게#

  • 서버는 작업 스케줄러로 부팅 시 자동 실행하고, 실패하면 1분 뒤 재시작하게 했다.
  • 터널은 윈도우 서비스로 등록했다.
  • 전원 설정에서 절전을 끄고 덮개를 닫아도 아무 일도 안 하게 했다.

설치하며 막혔던 것#

  • PyTorch가 c10.dll 오류를 내며 안 뜸 → Visual C++ 재배포 패키지 설치
  • 모델 다운로드가 0바이트에서 멈춤 → 환경변수 HF_HUB_DISABLE_XET=1
  • 오프라인 모드에서 저장소 이름으로 ONNX 변환이 실패 → 내려받은 폴더 경로를 직접 지정
  • 점검 순서를 정해 두니 편했다: 로컬 상태 확인 → 외부 상태 확인 → 키 없이 호출하면 401 → 키를 넣고 검색

한계#

노트북이 꺼지거나 정전이 나면 서비스도 멈춘다. 개인용이나 실험용에는 충분하지만, 항상 켜져 있어야 하는 서비스는 Firebase 같은 관리형 서비스가 맞다. 그래서 서버가 꺼졌을 때를 대비해 앱 쪽에 대체 동작을 두었다.

집 노트북을 서버로: ONNX 양자화와 Cloudflare Tunnel
https://blog.etymology.me/blog/home-server-cloudflare-tunnel
Author ETYMOLOGY
Published at 2026년 11월 5일
Comment seems to stuck. Try to refresh?✨